0

私は、C と同様の概念を持つ言語を、対応するスタックベースの VM によって解釈されるバイト コードにコンパイルするコンパイラを作成しています。構造体をコンパイルする方法について、私はその瞬間に立ち往生しています。

struct my_struct_s {
   int    anInt;
   char*  aString;
} my_struct_t;

/* ... */
my_struct_t my_struct_var;

my_struct_var をバイトコードのどこに配置するのが最適ですか? Cコンパイラはそのようなものをどのように処理しますか? 後で、VM はこの struct var を表すために必要なメモリも処理する必要があります。

この種の変数をどこに配置しますか? スタックに?このvarのメモリアドレスをスタックに置くだけですか?

ありがとう、ジョナス

4

2 に答える 2

0

私は、構造をガムテープでくっつけた変数の集合体と考えています。構造体fooにフィールドxおよびがある場合y、型の変数、フィールド、またはパラメーターを宣言する場合、基本的に、およびfooと呼ばれる変数、フィールド、またはパラメーターを宣言する必要があります。foo___xfoo___y. 複雑になる唯一の場所は、配列または byref の場合です。それらを処理したい場合は、任意のサイズの配列要素を作成し、配列要素にアクセスし、変位を伴う byref を実行できる必要があります。それらを処理するには、配列の要素を任意のサイズにする機能が必要であり、配列要素または byref を逆参照するときに変位を適用する機能が必要になります。さらに、コードが構造体への byref を取る場合、その格納場所が常に同じように配置されるようにする必要があります。ほとんどの場合、一部のパラメーターがレジスターとして渡される場合、構造体は常に完全にレジスターとして渡すか、完全にスタック上で渡す必要があります。値パラメーターが 1 つ以上のレジスターで、後で byref として渡すコードに渡される場合、その値をスタックにコピーする必要があります。

于 2013-05-10T16:38:35.497 に答える