はじめに
4月13日、Visual Studio 2010製品版がとうとうリリースされました。
F#に関しては、RCからの変更箇所詳細はMSから発表されていないことと、F#のバージョンはRC同様の2.0であることから、今回はバグの修正を中心としており、機能に関しては大きな変更はありません。
今回の連載の動作確認はVS2010RTM英語版で行っています。
LOP(言語指向プログラミング)とは
LOP(Language Oriented Programming)とは何か、を一言で定義するのは容易ではありません。LOPの概念は抽象的で、またその技巧も大変幅が広く複雑だからです。
F#のLOPを説明するにはまず、DSL(Domain Specific Language)とは何かと言うことから理解する必要があります。DSLはある特定の目的(ドメイン)の解決に特化させたプログラミング言語のことです。これに対して、C言語やC#は汎用的なプログラミング言語に分類されます。例えば、Excelのセル内の数値は「A1」や「B3」などのように、Excel固有の表し方でシンプルに表すことができ、汎用的なプログラミング言語のようにデータ型などを心配することなく、そのまま「A1+B3」などのように式において使用できます。これは一種のDSLであると言えます。
DSLには外部DSLと内部DSLの2種類があります。ホスト言語(汎用言語)とは異なる言語、例えばXMLファイルなどを使用する手法を外部DSLといい、一方、ホスト言語のサブセットで書かれるものを内部DSL(組み込み型DSLと呼ばれることもあります)と呼びます。
内部DSL | 外部DSL | |
言語 | ホスト言語の構文のみで実現 | ホスト言語とは異なる専用の言語 |
特徴 | APIとの区別が曖昧だが、特定のドメインに特化されているかどうか、読みやすさ書きやすさに長けているかなどがポイント | 汎用言語との区別が曖昧だが、特定のドメインに特化されているかどうか、DSLとしての目的を達成するように作成されているかどうかがポイント |
メリット | ホスト言語を用いるので学習が容易 | 制限のない自由な言語設計が可能 |
デメリット | ホスト言語の文法的制限を受けるため、比較的言語設計の自由度が低い | その都度パーサなどを作成・用意しなくてはならない 比較的学習に時間を要する |
ある種の問題に対応するためにDSLなどを作成し、それを用いて特定のドメインの問題を解決しようとするのがLOPのプログラミング手法です。DSLは状況(特定の問題)に応じて都合よく作成される言語のため、当然その表現は、シンプルかつ分かりやすいものになります。しかし、一般的にはその都合の良さの代償として、関係者がその特定の言語をわざわざ学ばなくてはならない、また、誰かが言語を確立してコンパイラーを作成しなくてはならない、という欠点があります。F#のLOPの特徴は、このDSLを汎用言語のサブセットとしながらもベーシックな汎用言語にない特別な機能を与えることで、DSLの短所をカバーしながらドメイン固有の問題を表現・解決できるところです。
繰り返しますが、F#のLOPは大変概念化しにくいものなので、詳細は後に例をあげながら紹介したいと思います。