9

私は LLVM をいじっていますが、クラスのコードを生成するのに行き詰まりました。

LLVM を使用してクラス機能を作成するにはどうすればよいでしょうか?

  • クラス演算子は関数と同じように扱われますか?
  • 自動割り当てはどのように処理されますか (C++ など)?
  • C++ のような仮想継承を通じて、Java のようなインターフェイスをサポートするにはどうすればよいですか?
4

1 に答える 1

13

ロングバージョン

一般的なクラスの振る舞い

直接的なアプローチは、構造体を作成し、メソッドを通常の関数としてモデル化し、それを含むクラスを表す構造体へのポインター (本質的にはthisポインター) を最初のパラメーターとして受け取ることです。割り当ては、構造体を割り当ててから、割り当てられたデータに対して特別な初期化関数 (実際にはコンストラクター) を呼び出すことによってモデル化できます。

継承は、基本クラスの構造体の型と同じ型を持つ、特別な「親」フィールド (多重継承の場合は複数のフィールド) を含む構造体を構築することで実行できます。

ポリモーフィズム

仮想テーブルについて読んでください。彼らは最高の出発点だと思います。コンパイラは基本的に次のことがわかります。

  1. 関数の「名前」からその実装にマッピングする、メモリ内に静的テーブルを作成します。
  2. そのようなテーブルを指すクラス構造体へのポインターを追加し、
  3. 仮想メソッドが呼び出されるたびに、適切な仮想テーブル エントリからアドレスを逆参照する間接呼び出しにコンパイルします。

短縮版

クラスを使用するコードを C++ で記述し、Clang を使用して LLVM IR にコンパイルし、生成されたコードを確認します。

于 2013-01-13T21:41:40.623 に答える