2007年6月27日水曜日

「コンパイラ」第11回

  • 実施日: 2007-06-27(水) 1限
  • 講義内容: S属性定義、L属性定義、実行時環境(導入)
  • 配布資料あり(7〜9章)
今回は、意味解析やコード生成での重要な技術である翻訳スキームのうち、性質のいいものとしてS属性定義とL属性定義のお話をしました。これらはいずれも、プログラム断片付き解析木を深さ優先に1回走査するだけで、ある計算を行うことができる翻訳スキームです。

「解析木を深さ優先に1回走査する」ということに拘るのには理由があります。講義でもお話した通り、コンパイラでは、解析木が大きくなる可能性があるため、走査の回数はなるべく減らしたほうが効率がよくなるのです。

ただし、講義では述べなかった理由がもう1つあります。LL(1)文法に基づく予測型構文解析では、トークン列を順次読みながら、根から葉に向かって解析木を成長させていきます。このとき、非終端記号と同名の関数を再帰的に呼び出していくのでしたね。予測型構文解析の場合,この関数の呼び出しは、ちょうど解析木を深さ優先探索にたどるのと同じ順番で行われます。ということは、解析木を実際に作らなくても、関数の再帰的な呼び出しを行うことで、あたかも解析木を深さ優先探索にたどるのと同等な処理ができるということになります。この関数の中に、S属性定義やL属性定義のプログラム断片を埋め込むと、何が起こりますか?解析木を作らなくても、翻訳スキームの計算が行えることになります。しかも、構文解析と意味解析が同時に行えてしまいます。現実のコンパイラの設計では、むしろこの理由のほうが重要なのです。

今日の講義では、最後のトピックであるコード生成の話に向けた準備として、プログラム実行時にCPUやレジスタ、メモリ周辺で何が起こっているか、簡単にお話しました。この話の基本的なところは先行科目「計算機アーキテクチャA」で説明があったはずです。ただし、現実のプログラムでは、実行時の記憶領域割り付け(局所変数やmalloc()など)、関数呼び出しなど、より複雑なことを考えねばなりません。次回はこの辺の話をして、さらにコード生成について簡単にお話したいと思っています。

0 件のコメント: