複数の言語を一緒にコンパイルすることに関する私の前の質問に答えてくれたすべての人に感謝することから始めたいと思います。ここで、複数の言語を一緒にコンパイルして、異なるプラットフォームで実行できるかどうかを知りたいと思います。
4 に答える
マシンに依存しないバイトコード (または類似のもの) にコンパイルし、各ターゲット マシンでバイトコードを解釈する場合、複数の言語を単一のマシンで実行するようにコンパイルするのと同じ問題であるため、比較的簡単です。多くの人がこの問題を解決しましたが、解決の程度はさまざまです。
絶対マシン コードにコンパイルする場合は、実行するすべてのマシンのマシン コードを含める必要があります。次に、各ターゲット マシンのローダーが適切なマシン コードを選択する方法を認識している必要があります。
Apple は、PowerPC Mac と 68K Mac が平和的に共存しなければならなかった時代に、「ファット バイナリ」でこれを試みました。それはうまくいきましたが、正確には大成功ではありませんでした。
コンパイルする言語が 1 つであろうと複数であろうと、コンパイルされたコードが異なるプラットフォームで実行されるかどうかの答えは、JVM (Java 仮想マシン) や CLR (共通言語ランタイム) などの仮想マシンの存在に依存すると思います。命令を解釈し、さまざまなプラットフォームで実行します。異なるマシン アーキテクチャは異なる命令セットをサポートするため (ここでは、命令セットはアセンブリを指します)、異なるプラットフォームで実行されるような方法でコードをマシン語にコンパイルすることはできません。前回の質問への回答に示されているように、複数の言語は Java バイトコード (たとえば) にコンパイルされます。これは、一緒にリンクして、JVM を備えた任意のマシンで実行できます。多くの異なるマシン アーキテクチャ用の JVM の実装があるため、
最近聞いた別のアプローチがあります。
アプリケーションをマシン バイナリ (またはバイトコード) として配布する代わりに、コンパイラの中間言語で「ほとんどコンパイルされた」形式で配布します。すべての言語のすべてのコンパイラが共通の中間形式を使用し、すべてのバックエンド コード ジェネレータがその共通の中間形式を使用している限り、必要な特定のバックエンドをターゲットにインストールしてから、中間体。
MacOberon はこのアプローチを使用して、680x0 と PowerPC MAC ハードウェアを同時にターゲットにしました。彼らは「スリムバイナリ」を呼び出しました。まったく同じ「バイナリ」がいずれかのフレーバーのマシンに配布され、バックエンドは適切なコードを生成して基本的にコンパイルを終了しました。
興味深いことに、この方法は、ディスクからメモリに「バイナリ」を物理的に読み取るコストがアプリケーションの起動時間を完全に支配するため、従来の方法よりも大幅に遅くはありません。
はい、複数の言語を一緒にコンパイルして、複数のプラットフォームで動作させることができます。いくつかの方法があります:
仮想マシン
ScalaとJavaは両方とも、多くのプラットフォームで実行される JVM にコンパイルされます。もう 1 つの例は .NET です。これには多くの言語が含まれており、 Mono Projectを通じて Windows または Linux で実行できます。
ファット バイナリ
一部のファイル形式は、複数のプラットフォームで実行されるファット バイナリです。Apple はそれらを使用して、ハードウェア実装間の転送を 2 回行いました。