それぞれのOS(ターゲットとなっているOS)のソースコードをコンパイルする代わりに、一度コンパイルしてどこでも実行できます。
この質問のために、私はそれをVMと呼びます(たとえば、Javaと.NETの両方)。したがって、プログラムの実行は次のようになります
------------ ---- ----
| Executable | -> | VM | -> | OS |
------------ ---- ----
それは完全に理にかなっています、コンパイラはそれぞれのVMのために汎用のままです。ただし、VMの実装は、インストールするマシンによって異なります(* nix、windows、mac)x(32ビット、64ビット)。
私の質問は、それぞれのマシン用にVMを作成する代わりに、なぜその特定のマシン用にコンパイラーが作成されないのですか?これにより、それぞれのVMをダウンロードする代わりに、それぞれのコンパイラをダウンロードすると、そのコンパイラがその特定のマシンのmachine-code + OSを処理します。最終的には、あらゆるマシンのネイティブコードの実行。確かに、各ソースコードはその特定のマシン用にコンパイルする必要がありますが、今日では、自動化されたシステムであるscmビルドがこの作業に役立ちます。
混乱している私の理由は正しいですか、またはここでいくつかの専門知識が不足していますか?
編集:
ポータビリティ:
はい、それは1つの理由ですが、今日の自動化システムでは移植性が大きな問題ですか?他のマシン用にコンパイルする必要がないという事実をどれくらいの頻度で心配する必要がありますか?ネイティブマシン用にコンパイルされたコードを使用すると、パフォーマンスが大幅に向上します。Javaを例にとると、Windowsで低レベルのプログラミングを行うことはできず、JNIを選択する必要があります。
TeamCity / Jenkinsなどの自動化システムを利用してください。バージョン管理を介して送信されたコードが実行可能ファイルになるような自動化されたシステムセットアップを使用できます。