2016-11-30 48 views
0

マシンの命令とプログラムに関する本を読んでいるうちに、アセンブラがソースプログラム全体を2回スキャンするという特定の点が出てきました。 1回目のパス/スキャン中にシンボルテーブルを作成し、2回目のスキャン中にシンボルテーブルをプログラムに関連付けます。アセンブラは、関数に対して同様の方法でアドレスを提供する必要があります。
アセンブラはプログラムを2回通過するので、関数を宣言する必要があるのはなぜですか?アセンブラは1回目のパスから関数のアドレスを指定し、2回目のパスでプログラムと相関させませんか? この場合、Cプログラミングを検討しています。プログラムのアセンブルと実行 - 2パスアセンブラ

+2

どのようなアセンブラで関数を宣言してから使用する必要がありますか? –

+4

Cコンパイラはアセンブラではありません。アセンブラの仕組みとは何の関係もないC言語の規則。 –

+0

私が意味することは、 "アセンブル"されるコンパイルされたプログラムは、プログラムに含まれるすべての関数、変数などの適切な定義が必要であるということです。アセンブラがプログラムを2回実行しなければならない場合、宣言する関数は不要ですか? –

答えて

1

簡単な答えは、C言語ではコンパイラが一回の処理で処理するように設計されているため、Cプログラムでは関数を宣言する必要があるということです。アセンブラや関数のアドレスには何もありません。コンパイラは、シンボルを使用する前に、その関数、変数などのシンボルの種類を知る必要があります。コンパイラはbarは、関数が、関数へのポインタではないことを知る必要があり、正しいコードを生成するために

int foo() { return bar(); } 
int (*bar)(); 

は、この単純な例を考えてみましょう。このコードは、fooの定義の前にextern int (*bar)();を置くとコンパイラがどのような型を知っているかを知っている場合にのみ機能します。barです。

コンパイラが2つのパスを使用するように設計されている可能性がありますが、これは言語の設計に大きな変更を必要としました。 2回のパスを必要とすると、コンパイラの複雑さが増し、Cコンパイラをホストできるプラットフォームの数が減ります。これは、64K(65,536)バイトのRAMが大量のメモリだったときに、Cが最初に開発された日の非常に重要な考慮事項でした。今日でも、大規模なプログラムのコンパイル時間に顕著な影響を与えます。

C言語では、暗黙的な関数宣言をサポートすることで、あなたが望むものを並べ替えることができます。 (上記の私の例では、barが以前に宣言されていない場合、fooで何が起こるのですか?)しかし、この機能は時代遅れであり、制限されており危険です。

関連する問題