言語理論とコンパイラ

Martin J. Dürst

duerst@it.aoyama.ac.jp

O 棟 529 号室

第一回 (2011年 4月15日)

授業の概要
コンパイラ全体の仕組み

http://www.sw.it.aoyama.ac.jp/2011/Compiler/lecture1.html

AGU

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

今日の内容

自己紹介

授業の位置付け

おすすめ: プログラミング基礎

授業の目標

授業の進め方

授業の日程

夏に予定されている大幅の節電のため、前学期の授業は7月9日まで

日程

成績評価方法

(当初予定と異なる)

授業の内容

理論 コンパイラ 他の応用
フロントエンド 言語理論、オートマトン 字句解析、構文解析 正規表現, XML
バックエンド 最適化、コード生成

入力と出力の違いの例

文字そのもの XML での表現 (エスケープ)
' '
" "
< &lt;
> &gt;
& &amp;

どの方向の変更 (→ 又は ←) が難しいでしょうか

入力の難しさ

コンパイラの役割

ソフトからハードへの橋渡し

入力 (input): 人間が分かるプログラム (高級プログラム言語、source (file/program)、ソース (プログラム)、原始プログラム)

出力 (output): 機械が分かるプログラム (object (file/code)、machine code、目的プログラム、実行プログラム)

コンパイラの仕事の一例

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

sum += price * 25;

出力:

LOAD   R1, price    ; R1 (レジスタ1) に price という名前の場所からロード
CONST  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 を納める

コンパイラの論理的構造

(compiler)

[プリプロセッサ (preprocessor) ]
字句解析 (lexical analysis)
構文解析 (parsing; syntax analysis)
意味解析 (semantic analysis)
最適化 (optimization)
コード生成 (code generation)
[アセンブラ (assembler)]
[リンカ (linker)・ローダ (loader) ]

コンパイラの種類と関連物

字句解析の一例

入力のプログラムの一分 (文字の列):

s u m   + =   p r i c e   *   2 5 ; \n

出力 (記号の列):

id("sum"), plusequal, id("price"), asterisk, int(25), semicolon

構文解析の一例

入力 (記号の列):

id("sum"), plusequal, id("price"), asterisk, int(25), semicolon

出力 (構文木、syntax tree):

 

 

 

もう一つの例

price = pretax / 100 * (105 - discount);

オートマトンの一例

自動販売機:

状態遷移図 (state transition diagram)

言語と文法

形式言語の文法の一例

文法から文の導出 (derivation) の一例:

S → a S o → a a S o o → a a A o o → a a y a o o

S ⇒ a a y a o o

宿題

提出期限と場所: 2011年4月21日 (木) 19:00 まで O棟5階の O-529 号室の前の箱に投入

形式: A4 一枚、表紙なし

  1. 次の行の C プログラムの一文の字句解析の結果、構文解析の結果、そしてコンパイラの出力 (アセンブリ言語; コメントは必要ない; 引き算は SUB、割り算は DIV) を、授業の例に習って書きなさい。
    grade = exercises / 3 + tests - absent * 2;