2

私は、言語のサブセット用の非常に小さな不自然なコンパイラを調査して構築しようと考えていました。振り返ってみると、現在のスキルレベルでは難しすぎる問題になると思います。

しかし、何か非常に興味をそそられました。コンパイラは、オブジェクトなどの抽象的なアイデアをアセンブリ/バイナリにどのように変換するのでしょうか?

例えば:

class Dog            
{
  public:            
    Dog(string name);
    ~Dog();
    string GetName();
};

dog *Dog = new Dog('rover');

それはどのようにしてマシンコードに変換されるのでしょうか - それは非常に困惑しています。

4

1 に答える 1

1

舞台裏?ここで大きな驚きはありません。合理的で、仮想的なコンパイラーを考えてみましょう:

まず、グローバルがありDog* dogます。グローバル オブジェクト テーブルに、サイズ 4、タイプ (Dog) ポインターの名前を追加します。次に、非定数式による初期化があります。を呼び出し、結果を に格納してから__dog__initializerを呼び出す小さなコードを記述します。文字列定数が必要なので、それをグローバル文字列テーブルに追加します。::operator new(sizeof(Dog))dog__Ctor_Dog"rover"

ファイル全体が読み取られると、すべてのテーブルがオブジェクト ファイルの一部に変換されるため、リンカーはそれらをまとめることができます。これは実際にはバイナリ コードを生成するのではなく、既存のパーツを組み合わせるだけです。

これは単なる仮想の実装であり、詳細は実際には明らかに異なることに注意してください。

于 2013-08-02T07:11:07.003 に答える