言語処理 ― アプローチ
.Net Frameworkは標準で言語処理機能を提供しており、この機能を用いて独自のコンパイラやインタープリタを開発できるはずである。独自の言語処理系の実現に向け、背景情報、必要とされる言語処理の枠組み、用いる.Net Frameworkの具体的機能等を列挙する。

基礎知識 ― 言語処理系の書物等

コンパイラとバーチャルマシン

今城哲二ほか ITテキストシリーズ オーム社 ISBN4-274-13308-7

言語処理系に必要な技術を網羅的に述べている。コンパイラの構成とプログラミング言語の形式的な記述、字句解析、構文解析、中間表現と意味解析、コード生成、最適化、例外処理の章がある。本文中でjavaによる実装例を豊富に紹介しており、さらに付録には、実装の集大成として、javaバーチャルマシン向けコードを生成するコンパイラ一式のソースコードを示している。この実装は容易にC#に移植できると思われる。

An In-Depth Look into the Win32 Portable Executable File Format

Matt Pietrek, MSDN magazine, February 2002

An In-Depth Look into the Win32 Portable Executable File Format, Part 2

Matt Pietrek, MSDN magazine, March 2002

.Net Frameworkを用いることから主に想定するプラットフォームはWindowsである。これらの記事は、Windowsの「.exe」及び「.dll」の実行形式ファイルを生成するために必要な、PEファイルフォーマットの概要をまとめている。.Net Frameowkrはむしろone of themであり、32bit(x86)や64bit(x64等)のネイティブ実行形式について多くを述べている。

Peering Inside the PE: A Tour of the Win32 Portable Executable File Format

Matt Pietrek, Microsoft Systems Journal, March 1994

上記ふたつの記事の「元ネタ」。古い記事だが、PEファイルフォーマットの由来について多くの情報を含む。

IL(Intermediate Language)
CIL(Common Intermediate Language)
MSIL(Microsoft Intermediate Language)

Atelier Blue (Rito)

.Net Frameworkで用いられる言語のうち最も下級に位置する共通中間言語CILについての入門記事。


.Net Frameworkが提供する機能

字句・構文解析

System.Text.RegularExpressions名前空間

文字列の個々の字句を解析することによりソースプログラムをトークンに分解する操作、及びトークンの並びと言語の文法を比較する構文解析の操作は、ほぼRegexクラスの機能そのものと言える。

中間表現

System.CodeDom名前空間

.Net Frameworkそのものの構造を強く反映した中間表現のクラスが提供されている。したがって、独自の言語で書かれたソースプログラムを字句・構文解析を経てこの中間表現に変換できれば、次項に述べるSystem.CodeDom.Compiler名前空間のコンパイル機能を用いてCILで書かれたコードの生成が可能となる。この中間表現の段階では、意味解析が不十分であり、例えば、変数宣言の漏れは検知できない。最終的な意味解析はコード生成の段階に委ねられる。なお、この中間表現のクラスと次項に述べるSystem.Reflection.Emit名前空間のコード生成機能の直接の連携は.Net Frameworkには用意されていない。

System.Linq.Expressions名前空間

式の中間表現のクラスと言える。このクラスのインスタンス(の集合体)で表現した式をコンパイルし、値を評価(計算)できる。しかしCILで書かれたコードを取り出す機能は無い。

コード生成

System.CodeDom.Compiler名前空間
Microsoft.CSharp名前空間
Microsoft.VisualBasic名前空間等

System.CodeDom名前空間のクラス群を用いた中間表現から、実行形式(CILのバイナリコードを含むが、実行時にJITによりネイティブコードにさらにコンパイルされる)の「.exe」及び「.dll」ファイルを生成できる。あるいは同実行形式をメモリ上に保持して呼び出すこともできる。逆にC#やVisual Basicで書かれたソースコードに書き戻す機能もある。

System.Reflection.Emit名前空間

CILの個々の命令のコードを生成する機能を持つ。この操作を積み重ねて実行形式の「.exe」及び「.dll」ファイルを生成できる。この機能を用いる場合、上述のPEファイルフォーマットについて詳細な知識は不要である。

(2015/3/15)