[[FrontPage]] 2008/05/17からのアクセス回数 &counter; #contents * 第7章 コードの生成 [#u53265b5] 以上のことで、架空の計算機においてメモリの割当てができるようになったので、その計算 機に対するコードを生成するコンパイラを作成する準備は整ったと言える。この章の大部分 は、スタック・マシンに対するコードの生成をいかにして行なうかを示す。7.2節では、マシ ン上で利用可能な命令を定義することから始まり、式の値の計算や、ステートメントの割当て のためのコードの生成をポし、その上で、ifやwhileといった制御構造を実現するためのコー ドの生成に関する問題点を考える。生成されるコードの最適化についてはほとんど扱わない。 しかし、この章の最後の問題では、いかにして効率を良くするかについてある程度示す。 ** 原理 [#odf557af] コード生成において行なう基本的なことは、プログラミング言語において表現されるおのお のの動作(action)に対して、どのような命令が実行されなければならないかを決定することで ある。もっとも直接的な方法は、スタック・マシンを仮定して、式を決められた形に変更して しまうことである。局所変数や広域変数を指定可能とすることに対しては、対象となるマシン のアドレス構造に依存した問題を提起するであろう。 これを実現するための、非常に重要であるが、しかし困難な問題とは、関数コールに対する 呼出し手続きの設計である。以下で示す例のために、ここでは“適当な''命令を仮定している。 実際のマシン上での作業領域スタックの管理を行なうためには、専用のサブプログラムを作成 し、コンパイルされたそれぞれのプログラムにリンクすることが必要である。このようなサブ プログラムは、コンパイルされたコードのデバッグや実行過程表示のためのトレースを挿入す るためにも使用される。 繰返しや、なんらかの決定を行なうステートメントの実現のためには、通常、前方への分岐 が多数必要となる。たとえば、if文のelse部の周辺などでは、残念ながら、前方分岐の命令 は通常2回実行されなければならない。目的となるアドレスがわからない場合には、命令に対 してはある空白値がとられる。そしてその後、決定されたアドレスが代入される。もしプログ ラムがメモリ上に存在するのであれば、関連したメモリを直接修正することが必要となる。 もしアセンブラのテキストを出力するのであれば、そのアセンブラに適切なプログラム・ア ドレスを示すための。rigin疑似命令を使用することが可能である。これによって、実際の目 的アドレスが判明した時点でjump命令を再発行することが可能となる。しかし、この場合で のもっとも臭い方法は、ただ単に、シンボリック・ラベルを作成し、アセンブラに前方分岐を 扱わせることである。 sampleCのbreakおよびcontinue文を実現するためには、whileやそれに類似した文が実 行された場合に、関連したラベルの情報をf呆存しておくためのスタ・ソクが必要である。もし、 switch文が言語に含まれているのであれば、二つのスタックが必要である。と言うのも、 continueのための情報と、breakのための情報とはまったく異なるからである。また、スタ ックはこれらの文が使用可能か否かを決定するというセマンディックスの検査のためにも用い られる。 ** コメント [#ueedca7c] この記事は、 #vote(おもしろかった,そうでもない,わかりずらい) 皆様のご意見、ご希望をお待ちしております。 #comment