言語理論とコンパイラ

第十一回: コード生成

2005 年 7月 7日

http://www.sw.it.aoyama.ac.jp/2006/Compiler/lecture11.html

AGU

© 2006 Martin J. Dürst 青山学院大学

目次

これからの日程

補講日: 7月11日 (火曜日) 4限 E202

最終の授業: 7月14日 (金曜日) 2限 E202

期末試験: 7月28日 (金曜日) 2限 (11:10-12:35)

全体の日程

宿題: 複素数の電卓

提出: 再来週の金曜日 (7月7日) 10時45分、O 棟 529号室の前

簡単な電卓を複素数の電卓に拡張してください。複素数の表し方は 5i で虚数を表し、[実部,虚部] で複素数を表すようにして下さい。[] 内には実数演算は許されるが 5i みたいなものが使えないように文法を設計してください。

complex.lex と complex.y を提出ください。紙の大きさは A4。複数の紙はホチキスで止めること。

宿題の正解例

[都合により削除]

宿題のヒント

入力の一例

構文エラー処理

エラー処理の難しさ

エラー処理の要点

エラー処理の技法

bison でのエラー処理

コンパイラの段階

字句解析 (lexical analysis)

構文解析 (parsing; syntax analysis)

意味解析 (semantic analysis)

コード生成 (code generation)

最適化 (optimization)

中間表現: 名前表

(symbol table)

名前表が扱うデータ

中間表現: 構文木

(parse tree)

簡単なプログラム言語と簡単なマシーン・アーキテクチャの場合 (例えば Pascal からスタック・マシーン) には構文解析しながらコード生成を行う (すなわち構文木を生成しない) こともある

構文木の生成: 構文規則ごとの処理で生成。例:

expression: expression '+' term { $$ = $1 + $3; }

を次に変える:

expression: expression '+' term
{ $$ = newnode(PLUS, $1, $3; }

(YYSTYPE も変更)

二分木が普通だが、関数の引数などに特別な措置が必要

意味解析

型が同じかどうか複数の定義がある:

型の役割

プログラム言語によって型の役割が違う:

コード生成と最適化の関係

コード生成の難しさ

コード生成の手法

機械の主な種類

コードの書き方: アセンブリ言語

(assembly language)

超単純アセンブリ言語

if 文などのコード生成

関数呼び出しのコード生成