1

明確化

クロス コンパイルについて言及するとき、ホスト プラットフォームからターゲット プラットフォームへではなく、ある言語から別の言語 (GWT を考えてください) へのコンパイルを意味します。

バックグラウンド

私は Java にクロスコンパイルしたアラビア語プログラミング言語を開発しています。これにより、プラットフォーム固有の手間が省けました。今、私はこれを保留にする必要があり、さまざまな理由でCへのクロス コンパイルに切り替えました。

コンパイル時に実行されているシステムの同等のライブラリに置き換えられる単一のライブラリを開発したいと考えています。

たとえば、プログラマーが GUI 描画関数をアラビア語プログラミング言語で記述してコンパイルすると、Windows でコンパイルされた場合は win32 コードにクロス コンパイルされ、Gnome で GTK+、KDE ​​で Qt などにコンパイルされます。ライブラリも。

質問

コンパイルされた実行可能ファイルで終わるために、このすべての問題を経験する価値がありますか、それとも仮想マシンのアプローチを使用したほうがよいでしょうか? どちらかを選択することの長所と短所 (言語を使用するプログラマーではなく、言語開発者の観点から)? 他に考慮しなければならない要因はありますか?

さらに読むための参照リンクは大歓迎です:)

4

2 に答える 2

2

@Omnifariousの回答が好きですが、代わりに、どのようなトレードオフを行いたいかを検討する必要があることを強調します。高性能が必要な場合は、CまたはC ++へのクロスコンパイルを選択できます。ライブラリの可用性が必要な場合も、CまたはC++が適切な選択です。言語の相互運用性が必要な場合は、LLVMアセンブラー、JVMまたは.NETアセンブラーを使用できます。

さて、あなたの実際の質問は、バックエンドをプラグ可能にする必要があるかどうかです。これは本当に本当に 難しいことです。実際にそれを行ういくつかの製品を見てみましょう。例はもちろんgccです。幅広い入力言語をサポートするだけでなく、幅広いターゲットCPUのコードを生成するように設計されています。さまざまなアセンブラー言語を生成するクロスコンパイラーと見なすことができます。

バックエンドをプラグイン可能にする秘訣は、入力言語を翻訳するのに十分シンプルで、さまざまなバックエンド言語に翻訳するのに十分シンプルでありながら、入力をエンコードするのに十分強力な適切な中間言語です。

基本的に問題は次のとおりです。ILを抽象化しすぎると、仮定の多くが固定され、簡単に変更できなくなります。具体的にしすぎると、複数のバックエンドに変換するのが難しくなります。

したがって、ILの設計を導くためのユースケースとして機能する、少なくとも3つの潜在的なバックエンドターゲット言語がある場合にのみ、これを行うことを検討する必要があると思います。

于 2010-12-30T09:39:48.810 に答える
2

言語の根底にある仮定とアイデアを最もよくサポートする言語にクロスコンパイルする必要があります。言語がガベージ コレクションされ、すべての関数呼び出しがメソッド呼び出しであり、アドレスをデータとして扱うことができない場合、Java がコンパイル先の言語になります。

Java コードをネイティブにコンパイルするコンパイラがあります。したがって、プログラムをネイティブに実行したい場合は、それらを使用できます。

自分の言語用に独自の完全なコンパイラを作成する準備ができたら、Java から離れたり、自分が選択したものから離れたりすることができます。

この基本的なアプローチは、多くの言語で使用されています。通常、ターゲット言語は C です。これは、C では他の言語ではできない低レベルの処理を行うことができ、成熟した最適化コンパイラがあり、ネイティブで非常に高速に実行されるためです。C のシンボル、ライブラリ、および呼び出し規約が機能する方法もよく理解されており、厳密に定義され、任意のプラットフォーム上の複数の言語でサポートされる傾向があります。これにより、新しい言語は、C 用に作成されたライブラリのホスト全体にすぐにアクセスできます。

C++ はこのように始まり (元のコンパイラは cfront と呼ばれていました)、OCaml もこのように始まったと思います。少し掘り下げれば、これが真実である他の多くの言語を見つけることができると思います。

しかし、Cs の低レベル機能が必要ない場合は、これらの議論の多くが Java にも当てはまります。多くの新しい言語 (Scala など) は、このように JVM を使用します。

于 2010-11-21T00:14:44.597 に答える