言語理論とコンパイラ
Martin J. Dürst
duerst@it.aoyama.ac.jp
O 棟 529 号室
第一回 (2010年 4月9日)
授業の概要
コンパイラ全体の仕組み
http://www.sw.it.aoyama.ac.jp/2010/Compiler/lecture1.html
© 2006-10 Martin
J. Dürst 青山学院大学
今日の内容
- 自己紹介
- 授業の位置づけ・進め方・内容
- 入力の難しさ
- コンパイラの構造
- 字句解析と構文解析
- オートマトンの一例
- 形式言語の文法の一例
自己紹介
授業の位置付け
- 3 年前期
- 第二科目群 (選択必修)
- ベースになる科目:
- 計算機概論
- 情報数学
- 計算機実習 (プログラミング)
おすすめ: プログラミング基礎
- 青山スタンダード
- 月曜日 3 限
- 前期 (プログラミング基礎 I): XML, HTML, SVG
- 後記 (プログラミング基礎 II): Ruby
授業の目標
- (言語) 理論と応用の関係の理解
- ツールによる応用
- コンパイラ
- 文書処理
- 入力の解析
- データ形式の設計
授業の進め方
- 前方着席
- 資料配付とウェブ公開
- 書き込みが重要
- 一部ノートパソコンで演習
- 宿題、ミニテストはアナウンスなしも
- 出席しないと損
成績評価方法
- 授業中のミニテスト: ~20%
- 演習課題: ~30%
- 最終試験: ~50%
授業の内容
|
理論 |
コンパイラ |
他の応用 |
フロントエンド |
言語理論、オートマトン |
字句解析、構文解析 |
正規表現, XML |
バックエンド |
|
最適化、コード生成 |
|
- 出力より入力に注目、入力の難しさに挑戦
- 理論から応用まで様々な表現を使う
入力の難しさの一例
計算機実習 I の問題:
'
↔ '
"
↔ "
<
↔ <
>
↔ >
&
↔ &
どの方向の変更 (→ 又は ←) が難しかったでしょうか
入力の難しさ
- 構造化されてない (ただのバイト列・文字列)
- 何でもあり (エラーも含む)
- 入力が「正しい」かどうかの判断が計算のモデル
- 入力が「正しい」かどうかが認識と同じ
コンパイラの役割
ソフトからハードへの橋渡し
入力 (input): 人間が分かるプログラム
(高級プログラム言語、source (file/program)、ソース
(プログラム)、原始プログラム)
出力 (output): 機械が分かるプログラム (object
(file/code)、machine code、目的プログラム、実行プログラム)
コンパイラの仕事の一例
入力のプログラムの一部:
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 を入れる
コンパイラの論理的構造
- [プリプロセッサ (preprocessor) ]
- 字句解析 (lexical analysis)
- 構文解析 (parsing; syntax analysis)
- 意味解析 (semantic analysis)
- 最適化 (optimization)
- コード生成 (code generation)
- [アセンブラ (assembler)]
- [リンカ (linker)・ローダ (loader) ]
コンパイラの種類と関連物
- ワンパス・コンパイラ (one pass compiler)
- x-パス・コンパイラ (x は 2 から 70 (PL/1))
- クロスコンパイラ (cross-compiler)
- 動的コンパイラ (dynamic/just-in-time (JIT) compiler)
- プリプロセッサ (preprocessor)
- インタプリタ (通訳系, interpreter)
字句解析の一例
入力のプログラムの一分 (文字の列):
s |
u |
m |
|
+ |
= |
|
p |
r |
i |
c |
e |
|
* |
|
2 |
5 |
; |
\n |
出力 (記号の列):
id("sum"), plusequal, id("price"), asterisk, int(25), semicolon
- 一つの記号 (符、トークン、token)
が複数の文字からなる
- 記号に属性がついていることがある
例: id (identifier、識別子の名前)、int
(integer、整数の値)
- 記号の名前は形の由来が多い (* は mult 等ではなく
asterisk)
- 空白は解析に使われるが出力しない
構文解析の一例
入力 (記号の列):
id("sum"), plusequal, id("price"), asterisk, int(25), semicolon
出力 (構文木、syntax tree):
もう一つの例
price = pretax / 100 * (105 - discount);
オートマトンの一例
自動販売機:
状態遷移図 (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
宿題
提出期限と場所: 2010年4月15日 (木) 19:00 まで O棟5階のO529
号室の前の箱に投入
形式: A4 一枚
- XML
について調べ、結果をページ半分程度にまとめなさい。
(この授業に関係あることの方がよい。キーワード:
構文解析、DTD、スキーマ)
- 次の行の
Cプログラムの一文の字句解析の結果、構文解析の結果、そしてコンパイラの出力
(アセンブリ言語; コメントは必要ない; 割り算は
DIV
で) を、授業の例に習って書きなさい。
grade_average = english + math + physics/2;