7

Nikhil Kothari のScript#は、かなり長い間 JavaScript の分野で目にした中で最も驚くべき概念の 1 つです。この質問は JavaScript に関するものではなく、.NET ランタイムでの言語のコンパイルに関するものです。

私は、.NET プラットフォームを使用して、元のコンパイラが出力を生成できるようにしながら、元のコンパイラから別の出力を生成するコンパイラ (C# など) を既に持っている言語用のコンパイラを作成する方法にかなり興味を持っていました。他のコンパイラの出力も参照/使用している間、同じビルド操作中に同じソース。

正しい詳細を質問するのに十分なほどプロセスを理解しているかどうかは完全にはわかりませんが、Script# ドキュメントの図に従って、これが現在のプロセスの見方です。私は、このような概念を利用できる可能性のある複雑な言語設計とコンパイルを含む多くのことについて考えてきました。また、他の人がその概念についてどう考えているかに興味があります。

--

編集:これまでにコメントしていただきありがとうございます。あなたの情報は、それ自体が非常に興味深いものであり、もっと調査したいのですが、私の質問は、実際には、同じソースで同時に実行できる独自のコンパイラをどのように作成できるかについてですCLR を使用して、複数の異なるタイプの (潜在的に) 相互に依存する出力を生成します。Script# は、同じ C# ソースを使用して JavaScript とアセンブリを生成し、コンパイルされたアセンブリを JavaScript と連携させるため、例として役立ちます。この性質のものを設計する際に、さまざまなアプローチと理論的概念がどのようなものであるかに興味があります。

4

3 に答える 3

2

コンパイラが行うのは、ソース言語(この場合はC#)を取得し、それを解析して、コンパイラが人間ではなく意味のある表現(これは抽象構文木)を持つようにすることだけであることを理解することが重要です。ターゲット言語へのナイーブなコード生成(msilは.NETランタイムで実行される言語のターゲットです)。

これで、script#コードがアセンブリに変換され、他の.NETコードと相互作用する場合、このコンパイラはmsilを生成している必要があります。script#はこれにcsc.exeを使用していますが、これは単なる標準のc#コミラーです。ここで、JavaScriptを生成するには、c#またはmsilのいずれかを取り、それを解析して、ブラウザーに送信するJavaScriptを生成する必要があります。ドキュメントには、ssc.exeと呼ばれるカスタムc#->jsコンパイラがあると書かれています。

クライアント側とサーバー側の両方で一貫して相互作用するために、.NETで記述されているが、JavaScriptにコンパイルされている一連の参照アセンブリがあります。これはコンパイラ固有の問題ではありませんが、これらの参照アセンブリはscript#ランタイムです。ランタイムはおそらくあなたが知覚しているscript#の魔法の多くに責任があります。

于 2008-09-30T22:47:14.340 に答える
0

Microsoft には、とりわけ msil を JavaScript にコンパイルするVoltaと呼ばれる研究プロジェクトがあります。

既存の使い慣れたツール、手法、およびパターンを使用して、多層 Web アプリケーションを構築するための開発者ツールセット。Volta の宣言型階層分割により、開発者は配布に関するアーキテクチャ上の決定を、責任を負う最後の瞬間まで延期できます。また、複数層にわたる共有プログラミング モデルのおかげで、Volta は新しいエンド ツー エンドのプロファイリングとテストを可能にし、より高いレベルのアプリケーション パフォーマンス、堅牢性、および信頼性を実現します。宣言型の階層分割を使用すると、開発者はこのプロファイリング データに基づいてアーキテクチャの決定を改善できます。これにより、手動リファクタリングに関連する時間とコストを節約できます。実際、Volta は .NET プラットフォームを拡張して、既存の使い慣れたツールと技術を使用して、ソフトウェア + サービス アプリケーションの開発をさらに可能にします。

アプリケーションを .NET クライアント アプリケーションとして設計および構築し、開発プロセスの後半で、サーバー層とクライアント層で実行されるアプリケーションの部分を割り当てます。Web ブラウザーまたは CLR をクライアントとしてターゲットにすることができ、Volta は階層分割の複雑さを処理します。コンパイラーは、クライアント層用のクロスブラウザー JavaScript、サーバー層用の Web サービス、およびすべての通信、シリアライゼーション、同期、セキュリティー、および層を結び付けるその他の定型コードを作成します。実際、Volta は、アプリケーションの調整を必要とせずに、複数の環境でベストエフォートのエクスペリエンスを提供します。

于 2008-09-16T18:41:49.967 に答える
0

たとえば、C# を Javascript にコンパイルするとします。既存の C# コンパイラを利用できるかどうかを尋ねているので、C# を直接 Javascript にコンパイルする代わりに、C# コンパイラによって生成された MSIL を実際に Javascript に変換しますか?

確かに、あなたはそれを行うことができます。MSIL バイナリを取得したら、何でも好きなように実行できます。

于 2008-09-16T18:23:00.183 に答える