5

Java クラス ファイル、Parrot バイトコード ファイル、CLR ファイルなどのバイト コード バイナリ実行可能ファイルと、ELF、Mach-O、PE などのマシン コード実行可能ファイルの違いは何ですか。

両者の際立った違いは何ですか?

ELF 構造の .text 領域などは、クラス ファイルのどの部分に相当しますか?

または、すべてにヘッダーがありますが、ELF および PE ヘッダーにはアーキテクチャが含まれていますが、クラス ファイルには含まれていません。

Java クラス ファイル Java クラスファイル

エルフファイル ELF ファイル

PE ファイル PE ファイル

4

2 に答える 2

12

imulsion が指摘したように、バイト コードは、マシン コードにコンパイルする直前の中間ステップです。最後のステップはロード時間 (そして多くの場合、Just-In-Time (JIT) コンパイルの場合のようにランタイム) に委ねられるため、バイト コードはアーキテクチャに依存しません: ランタイム (.net の CLR または Java の JVM) は、バイトコードのオペコードをその基礎となるマシンコード表現にマッピングします。

比較すると、ネイティブ コード (Windows: PE、PE32+、OS X/iOS: Mach-O、Linux/Android/etc: ELF) はコンパイルされたコードであり、特定のアーキテクチャ (Android/iOS: ARM、その他のほとんど: Intel 32) に適しています。 -ビット (i386) または 64 ビット)。これらはすべて非常に似ていますが、プロセスになるときに実行可能ファイルのメモリ構造を設定するためのセクション (または、Mach-O 用語で「ロード コマンド」) が必要です (古い DOS は、「.com」形式をサポートしていました。生のメモリ イメージ)。上記のすべてにおいて、大まかに次のように言えます。

  • 「.」のあるセクション コンパイラによって作成され、「デフォルト」であるか、デフォルトの動作が期待されます
    • 実行可能ファイルには、通常「text」または「.text」と呼ばれるメイン コード セクションがあります。これは、特定のアーキテクチャで実行できるネイティブ コードです。
    • 文字列は別のセクションに格納されます。これらは、ハードコードされた出力 (出力するもの) とシンボル名に使用されます。
    • シンボル - リンカーが実行可能ファイルとそのライブラリ (Windows: DLL、Linux/Android: 共有オブジェクト、OS X/iOS: .dylibs またはフレームワーク) をまとめるために使用するものは、別のセクションに保存されます。通常、コンパイラが呼び出した関数 (printf、open など) にスタブを簡単に配置できるようにする "PLT" (Procedure Linkage Table) もあり、実行可能ファイルのロード時にリンカーが接続できます。
    • インポート テーブル (Windows の用語では..ELF では DYNAMIC セクション、OS X では LC_LOAD_LIBRARY コマンド) は、追加のライブラリを宣言するために使用されます。実行可能ファイルのロード時にそれらが見つからない場合、ロードは失敗し、実行できません。
    • エクスポート テーブル (ライブラリ/dylibs/etc 用) は、ライブラリ (または Windows では .exe でさえも) がエクスポートして、他のライブラリとリンクできるシンボルです。
    • 定数は通常、「.rodata」として表示されるものにあります。

お役に立てれば。本当に、あなたの質問は漠然としていました..

TG

于 2012-08-30T22:45:10.537 に答える
6

バイトコードは「中途半端な」ステップです。そのため、Java コンパイラ (javac) はソース コードをバイト コードに変換します。マシンコードは次のステップです。コンピューターはバイトコードを受け取り、それをマシンコード (コンピューターが読み取ることができる) に変換し、マシンコードを読み取ってプログラムを実行します。コンピュータはソース コードを直接読み取ることができません。同様に、コンパイラはすぐにマシン コードに変換できません。プログラムを機能させるには、途中のステップが必要です。

于 2012-08-30T07:01:44.017 に答える