マシン言語とアセンブリはハードウェアに固有のものであり、ハードウェアが異なればマシン コードとアセンブリ コードも異なるため、これらの問題を解決するために高水準言語が発明されたことを私は知っています。それは非常に基本的なものかもしれませんが、関連するハードウェアをサポートするために、高水準言語を各アセンブリ言語に翻訳する必要があるかどうかを知りたいですか?
3 に答える
コンパイラは、言語と特定のプラットフォームの間の架け橋であり、高水準言語を特定のプラットフォーム用のマシン コードに変換するコンパイラです。
一般に、コンパイラは 1 つの特定のプラットフォーム用の実行可能ファイルのみを生成するため、実際に異なるプラットフォームで動作する言語 (常にそうであるとは限りません) の場合、プラットフォームごとに 1 つのコンパイラがあります。
多くのプラットフォーム (特に C) 用のコンパイラを備えた言語はありますが、すべてのプラットフォームで動作する言語はありません。
高水準言語には、インタープリター (通常は移植可能な C で記述) があるか、アセンブリーまたはマシンコード (本質的に同等) を出力するコンパイラーがあります。最近では、さまざまな高水準言語のコンパイラーが gcc や LLVM のフロントエンドであることが多く、これらのツールの最適化およびコード生成機能を利用しています。
したがって、特定のプラットフォームでソフトウェアを実行するには、そのプラットフォーム用のバイナリを作成できる C コンパイラが必要です。これにより、インタープリターをビルドしたり、ターゲット プラットフォーム用のバイナリを直接ビルドしたりできます。偶然にも、C は移植性の高いソフトウェア開発の主要言語です。
一部の言語には、セルフホスティング コンパイラがあります。たとえば、Free Pascal コンパイラは Free Pascal で実装されているため、個別に移植する必要があります。Fortran にはf2c
、C コンパイラによってコンパイルされるように、Fortran を C に変換する「コンパイラ」があります。(gfortran
ただし、Gnu Compiler Collection (gcc) の一部であるため、f2c はあまり役に立ちません。)
多くの場合、同じハードウェア上の異なる OS には異なる ABI (Application Binary Interface) があることに注意してください。Windows バイナリは、x86-64 Linux バイナリと同じハードウェアで実行されますが、システム コールが異なります。x86-64 FreeBSD バイナリは、非常によく似たシステム コールを作成し、Linux カーネル上で実行するために非常に軽量な変換レイヤーのみを必要とします。
一部のインタープリター (Oracle / OpenJDK、python など) は、特定のプラットフォーム向けに最適化されています。たとえば、x86 または x86-64 システムで実行している場合、優れた JVM は、実行中に Java バイトコードをネイティブ マシン コードに Just-In-Time コンパイルします。JIT エンジンを持たないプラットフォームでは、通常の解釈に戻ります。これにより、最適化作業が行われたプラットフォームで従来のインタープリターよりもはるかに高いパフォーマンスが可能になりますが、それでもすべての移植性が維持されます。
新しいプラットフォームへの適切な移植には、コード生成エンジンを新しいターゲットに移植する必要があります。また、一部の C ソフトウェアでは#ifdef
、新しいターゲットに適したブランチを選択するために調整が必要になるか、以前はエンディアンと型サイズのすべての組み合わせをサポートしていなかった場合は、新しいコードを作成する必要があります。
多くの異なる言語で書かれたソフトウェアの膨大なコレクションの例として、Debian のような Linux ディストリビューションを取り上げてみましょう。
まず、gcc をクロスコンパイラとしてビルドします (通常のシステムで実行しますが、ターゲット システム用のバイナリを生成します)。次に、新しいプラットフォームのさまざまなハードウェア用の Linux ドライバーと、ブートローダーが Linux カーネルをロードするために必要なものをすべて作成します。
新しいハードウェアで Linux を起動し、gcc を実行するのに十分なバイナリをビルドしたら、新しいポートはセルフホスティングになり、すべての高級言語のコンパイラとインタープリターを備えた完全な環境のブートストラップを本格的に開始できます。
回答には3万文字の制限があり、それを打つ気がしないので、多くの詳細を省略しています. 問題のすべての言語インタープリターがプラットフォームに依存しない移植性のフォールバックを持っているこの理想的な世界の絵よりもはるかにバラ色の絵を描くグッファの答えに対するコメントでいくつかの議論があります.
「すべてのハードウェア」の問題は、ハードウェア プラットフォームごとに固有のバイナリを発行することで解決されると思います。たとえば、Mac 用と PC 用に別々のバイナリがあります。