読者です 読者をやめる 読者になる 読者になる

OsloとM言語

.net design

別の調べ物の関係でOsloに出会ったのですが、イメージが良く分からなかったので、Oslo SDK October 2008 CTPをインストールしました。

以下はその覚え書きです。数時間しか触っていないので間違いがあるかもしれません。

インストールは、インストーラを起動するだけです。SQL Server2008がデフォルトインスタンスである必要があります。


デフォルトインスタンスにRepositoryデータベースが作られ、Osloのレポジトリ用のテーブル等が作成されます。
続けて自動的にM言語のインストーラが立ち上がります。


Visual Studioで新規プロジェクトを作成すると、テンプレートに「Oslo」の「M Project」が表示されます。


M言語のプロジェクトが作成できます。


M言語で最初に表示されるコードは次の通りです。

module Models1
{
    type Model
    {
        Id : Integer64 = AutoNumber();
        Name : Text;
    } where identity Id;
    
    Models : Model*;
}

C#に似てますが、どちらかといえば宣言型の言語に近いと思います。「名前:型」という構文で、「*」の場合は複数コレクションを表します。IdとNameという属性を持つ型「Model」とそのレコード群を格納する「Models」が定義されています。

このコードを実行することはできませんが、ビルドできます。

------ ビルド開始: プロジェクト: Models1, 構成: Debug Any CPU ------
"C:\Program Files\Microsoft Oslo SDK 1.0\bin\m.exe"
  /t:Repository  /p:Script,Image /out:"bin\Debug\\Models1.sql,bin\Debug\\Models1.mx" 
  /warnaserror+ /printreport @"C:\Oslo\Models1\Models1\obj\Debug\dcargs.rsp"

Microsoft (R) "Codename M" Compiler version 1.0.0925.0
Copyright (C) Microsoft Corporation. All rights reserved.
Compiled module named 'Language' with 63 member(s).
Compiled module named 'Models1' with 2 member(s).
Compiled 2 module(s).
Compilation complete -- 0 compilation error(s).
========== ビルド: 1 正常終了または最新の状態、0 失敗、0 スキップ ==========

「m.exe」によるビルドの結果、「bin\Debug」に、「Models1.sql」と「Models1.mx」が生成されます。
以下が、Models1.sqlの一部です。本当はもっとたくさんのトリガやらビューのコードも生成されてます。

create schema [Models1] authorization [RepositoryOwner];
go

create table [Models1].[ModelsTable]
(
  [Id] bigint not null identity,
  [Name] nvarchar(max) not null,
  constraint [PK_Models] primary key clustered ([Id])
);
go

このSQLはビルド時には実行されません(参考用だと思います)。実際のリポジトリの更新はメタ情報を格納するMXファイルを利用します。Models1.mxはZIP形式のファイルで、モデルのメタ情報(sqldom、xamlxmlマニフェスト)が格納されています。

「“M” In a Nutshell」によれば、次のように解説されています。


つまり、M言語で書いたソースコード(モデル)は、m.exeでMxイメージに変換できます。それをmx.exeで実行してRepository(SQL Server2008)に反映できます。そうすると、M言語で書いたモデルがテーブルとして反映されるので、ADO.NETなりLINQなりでアクセスできるようになります。

ざっくりと言えば、M言語のコードは、SQL Serverのオブジェクトに変換されます。