4

私は、6 か月間続くはずの卒業プロジェクトを始めたばかりです。プロジェクトの目標は、1 つのスクリプト言語用の .Net コンパイラを実装することです。カリキュラムの科目としてコンパイラの構築があり、一般的にコンパイラを実装する基本的な手順は認識していますが、バックエンドとして Bison と GCC を備えた単純なコンパイラを使用しているため、コンパイラの実装についてはあまり知りません。 .Net プラットフォーム上。

このトピックについていくつかの調査を行った結果、コード生成のための次の代替ソリューションを見つけました (パーサーなど、コンパイラの他の重要な部分については話していません。ここでは範囲外です)。

  1. Reflection.Emitを使用したコードの直接生成。
  2. 一部のコード生成を自動化するために、Reflection.Emit でCommon Compiler Interface抽象化を使用します。
  3. 実行時に C# および VB のコンパイルにCodeDOMを使用します。
  4. Roslynと呼ばれる新しい C# "サービスとしてのコンパイラ" があり、現在 CTP として利用できます。
  5. DLRは動的コード生成のサポートを提供し、式ツリーなどを介したランタイム コード生成用のいくつかのインターフェイスを備えています。
  6. Mono にはMono.Cecilライブラリが同梱されており、コード生成用の機能も備えているようです。

私のプロジェクトの主な目標は、.Net の根幹を深く掘り下げ、コンパイラの構築を学び、自分の仕事の成績を上げることです。2 つ目の目標は、寛大なオープンソース ライセンスの下で後でコミュニティに公開できるコンパイラの実装を考え出すことです。

では、ここで最も興味深く、教育的で、楽しく、有望なアプローチは何でしょうか? もう少し時間があれば、間違いなくすべてを試していたでしょうが、良い成績を得るには、6 か月以内に課題を提出する必要があります...

よろしくお願いします、アレキサンダー。

4

3 に答える 3

5

より簡単な方法が必要で、言語を合理的に C# に変換できる場合は、C# コード (または類似のもの) を生成してコンパイルすることをお勧めします。Roslyn はおそらくその点で最も優れているでしょう。どうやら、CCI もCCI Codeを使用してそれを行うことができますが、私はそれを使用したことがありません。CodeDOM は静的クラスや拡張メソッドなどの機能をサポートしていないため、お勧めしません。

より詳細な制御が必要な場合、または低レベルに移行したい場合は、Reflection.Emit を使用して CIL を直接生成できます。しかし、特に CIL に慣れていない場合は、(はるかに) 手間がかかります。Cecil も同じように使用できると思いますが、それは別のものを対象としており、Reflection.Emit よりも優れているとは思いません。

DLR は、その完全な名前が示すように、動的言語を意味します。それExpressionが使用する s はコード生成に使用できますが、実行時に比較的単純なメソッドを生成するのに最適だと思います。もちろん、言語が動的である場合、DLR 自体は非常に便利です。

于 2011-11-10T09:25:36.127 に答える
2

Booは、CLI を対象とする言語/コンパイラです。オープンソースのように見えるので、彼らがそれをどのように達成したかを調べることができます.

于 2011-11-09T23:07:23.267 に答える
2

コンパイラを書いていた頃は、アセンブリ言語 (つまり、アセンブリ言語のソース コード) に書き込んでから、システムのアセンブラを実行していました。そうすれば、自分が生成しているものを簡単に確認できました。mov ax, bxHEXオペコードをデコードするよりも、読む方がはるかに簡単です(x86アセンブリ)。

最終製品でアセンブラを使用することが許可されていない場合は、アセンブリ出力を使用してコンパイラを開発し、すべてが機能するようになったら、バイナリ出力パスを作成しました。美しさは、私が変更しなければならなかったのは、実際のバイト出力 (テキストではなくオペコードとバイナリ値) だけだったということです。

あなたのプロジェクトに似たようなことをすることをお勧めします。最初に開発して、ILASM でアセンブルできる MSIL を出力します。これにより、生成されたコードを読み取ることで、コード ジェネレーターの出力を簡単に確認できます。コード ジェネレーターが機能していることを確認したらReflection.Emit、Common Compiler Infrastructure を使用する出力オプションを追加します。

于 2011-11-09T23:48:01.067 に答える