15

私は現在、いくつかの興味深いプログラミング言語の研究に携わっています。これまでは、非常に強力なプログラマー生産性ベースの機能を使用して、次のJava7.0コンパイラーを拡張することに重点を置いてきました。この作業は、C#などの関連するプログラミング言語にも同様に適用できる必要があります。

私は現在、機能のC#ポートをプロトタイピングするためのオプションを検討しています。この作業の成果を可能な限り幅広い聴衆と共有できるように、オープンソースのオプションを希望します。したがって、Mono C#コンパイラが最も明白な出発点のようです。私は経験豊富なC#開発者なので、コードを書くことは問題ではありません。私は主に、保守可能でサポートされている方法でコンパイラーを拡張することに関心があります。この件に関するMonoFAQ(リンク)には、「MonoはすでにC#言語の新しいアイデアを試すための基盤として使用されています(MonoのC#コンパイラから派生したコンパイラが3つまたは4つあります)」と記載されています。残念ながら、これ以上のポインタはなく、これまでのところ、Google検索は何も見つかりませんでした。

誰かがこれに関する情報を持っているかどうか疑問に思います。mcs//標準の拡張性モデルがありますgmcsか?dmcs具体的には、プログラムの抽象構文木でいくつかの興味深い変換を実行します。抽象構文ツリーの生成と型チェッカー、そしてコード生成の間に機能をコンパイラチェーンに挿入するための標準的なメカニズムはありますか?

これまで、コードにアドホックな拡張機能をいくつか(主にコードジェネレーターで)作成しましたが、特に拡張機能をGitトランクで最新の状態に保つつもりであることを考えると、これは保守可能なソリューションではないようです。可能な限りモノ。さらに、変更を加えるたびにコンパイラ全体を再コンパイルしなくても、拡張機能を更新できると便利です。コアコンパイラコードを直接ハックすることなく、//によってmcs動的にロードできる単一の.NETアセンブリにすべてのAST操作をラップできるようにしたいと思います。gmcsdmcs

Mono C#コンパイラを拡張することについての考えやポインタはありがたいことに受け取られます!

更新(2010年10月23日)

私の質問への回答に応えて、コンパイラーの単純な拡張性モデルを作成するために、Monoのブランチで作業を開始することにしました。非常に初期の段階ですが、ここではGitHubにあります。

http://github.com/rcook/mono-extensibility

そして主なコミットは次のとおりです:http://github.com/rcook/mono-extensibility/commit/a0456c852e48f6822e6bdad7b4d12a357ade0d01

このプロジェクトでのコラボレーションに興味のある方がいらっしゃいましたら、お知らせください。

4

2 に答える 2

3

残念ながら、私はあなたの質問に適切に答えることができませんが、Miguel de Icaza のブログにある C# 拡張機能の例を見ると、それらすべてがプラグインや拡張機能ではなく、コンパイラへのパッチの形をとっていることに気付くでしょう。これは、そのような API が存在しないことを示しているようです。

これらの例はすべて、作業しているように見えるものよりもはるかに狭い範囲であることに注意してください。

これらはほとんどローカライズされたシンタックス シュガーであり、「興味深い」動作はありません。たとえば、4 番目のパッチでは、IEnumerables に対する Cω のシンタックス シュガーが実装されていますが、この構文を興味深いものにする Cω のセマンティクスはまったくありません。パッチを見ると、メンバ アクセスとメソッド呼び出しがストリーム上で適切に持ち上げられる Cω とは対照的に、 ~T→の愚かな構文展開が文字通り行われていることがわかります。IEnumerable<T>

Microsoft Research の Phoenix Compiler Pipelineは、かつてはこのような拡張性の問題に対するソリューションとして明示的に宣伝されていましたが、現在はコード生成バックエンドの IR レベルでの最適化と分析に主に焦点を当てているようです。実際、プロジェクトがまだ生きているかどうかさえわかりません。

于 2010-10-03T02:13:43.977 に答える
3

mono C# コンパイラはちょっとしたハックです。解析ツリーからの情報をどのように使用するかを考え出すのに約 1 週間を費やしました。コンパイラは中間表現を生成せず、コード生成によって解析ツリーの一部が壊れる可能性があります。それでも、パーサーとトークナイザーは役に立つかもしれません。SharpDevelop は、C# パーサーも提供します。SharpDevelop パーサーは、mono C# パーサーよりも使いやすいです。F# でも機能する場合は、お勧めします。ソースはモノラルよりもはるかにクリーンで、オープン ソース ライセンスの下で利用できます。

于 2010-10-09T16:33:52.777 に答える