言語理論とコンパイラ

Martin J. Dürst

duerst@it.aoyama.ac.jp

O 棟 529 号室

第一回 (2013年 4月12日)

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

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

AGU

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

今日の内容

自己紹介

授業の位置付け

授業の目標

コンパイラの大切さ

Steve Yegge のブログ

Executive Summary:

If you don't know how compilers work, then you don't know how computers work.

If you're not 100% sure whether you know how compilers work, then you don't know how they work.

授業の進め方

授業の日程

日程

授業の内容

理論 コンパイラ 他の応用
フロントエンド 言語理論、オートマトン 字句解析、構文解析 正規表現, 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

宿題

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

形式: A4 一枚、表紙なし

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