言語理論とコンパイラ

第十一回: コード生成

2007 年 6月29日

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

Martin J. Dürst

duerst@it.aoyama.ac.jp, O 棟 529号室

AGU

© 2005-7 Martin J. Dürst 青山学院大学

目次

宿題: 有理数の電卓

提出: 再来週の木曜日 (6月28日) 19時00分、O 棟 529号室の前

簡単な電卓を有理数の電卓に拡張してください。

有理数の表し方として、[分子,分母] を追加 して下さい。

[] 内には割り算は許されないように文法を設計してください。

rational.lexrational.y を A4 の紙で提出ください。

宿題の正解例

[都合により削除]

先週の復習

コンパイルの主な段階

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

コード生成の難しさ

コード生成の手法

機械の主な種類

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

(assembly language)

超単純アセンブリ言語

超単純アセンブリ言語の一例

入力のプログラムの一部:

sum += price * 25;

出力:

LOAD   R1, price    ; R1 (レジスタ1) に price というアドレスからロード
LOAD   R2, 25       ; R2 (レジスタ2) に 25 の定数をロード
MUL    R1, R1, R2   ; R1 に R1 と R2 の掛け算の結果を入れる
LOAD   R2, sum      ; R2 に sum というアドレスからロード
ADD    R2, R1, R2   ; R2 に R1 と R2 の合計を入れる
STORE  sum, R2      ; sum というアドレスに R2 を入れる

if 文などのコード生成

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