言語理論とコンパイラ
第一回、2005年 4月15日、Martin J. Dürst
自己紹介
授業の位置付け
- 3 年前期
- 第二科目群 (選択必修)
- ベースになる科目:
- 計算機概論
- 情報数学
- 計算機実習 (プログラミング)
授業の内容
|
理論 |
コンパイラ |
他の応用 |
フロントエンド |
言語理論、オートマトン |
字句解析、構文解析 |
regexp, XML |
バックエンド |
|
最適化、コード生成 |
|
- 出力より入力に注目、入力の難しさに挑戦
- 理論から応用まで様々な表現を使う
コンパイラの役割
ソフトからハードへの橋渡し
入力: 人間が分かるプログラム
(高級プログラムイング言語、ソース言語、原始言語)
出力: 機械が分かるプログラム
(目的プログラム、実行プログラム)
コンパイラの仕事の一例
入力のプログラムの一分:
sum += price * 25;
出力:
LOAD price, R1
LOAD 25, R2
MUL R1, R2, R1
LOAD sum, R2
ADD R1, R2, R2
STORE R2, sum
コンパイラの論理的構造
- [プリプロセッサ (preprocessor) ]
- 字句解析 (lexical analysis)
- 構文解析 (parsing; syntax analysis)
- 意味解析 (semantic analysis)
- 最適化 (optimization)
- コード生成 (code generation)
- [アセンブラ (assembler)]
- [リンカ (linker)・ローダ (loader) ]
コンパイラの種類と関連物
- ワンパス・コンパイラ (one pass compiler)
- x-パス・コンパイラ (x は 2 から 70 (PL/1))
- 動的コンパイラ (dynamic/just-in-time (JIT) compiler)
- クロスコンパイラ
- プリプロセッサ
- インタプリタ (通訳系)
字句解析の一例
入力のプログラムの一分 (文字の列):
s |
u |
m |
|
+ |
= |
|
p |
r |
i |
c |
e |
|
* |
|
2 |
5 |
; |
\n |
出力 (記号の列):
id("sum"), plusequal, id("price"), asterisk, int(25), semicolon
- 一つの記号 (符、token) が複数の文字からなる
- 記号に属性が付いていることがある
- 空白は解析に使われるが出力しない
構文解析の一例
入力 (記号の列):
id("sum"), plusequal, id("price"), asterisk, int(25), semicolon
出力 (構文木、syntax tree):
statement (+= (sum, * (price, 25))
オートマトンの一例
自動販売機:
状態遷移図 (state transition diagram)
言語と文法
- 文法は言語の構成規則である
- 簡単な文の例 (命令文): eat bread、read books、play music
- 文法的には read bread とか play books も正しい
形式言語の文法の一例
- S, A: 非終端記号 (nonterminal symbols, 大文字)
- a, o, y: 終端記号 (terminal symbols, 小文字)
- 書き換え規則 (rewriting rules)
S → a S o
S → A
A → y a
- S: 初期記号 (initial symbol, start symbol)
文法から文の導出 (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