言語理論とコンパイラ

第一回 (2014年 4月11日)

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

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

Martin J. Dürst

duerst@it.aoyama.ac.jp

O 棟 529 号室


© 2006-14 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;

出力 (アセンブリ言語, assembly language):

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 * (108 - discount);

オートマトンの一例

自動販売機:

状態遷移図 (state transition diagram)

言語と文法

命令文の文法

命令文 → 動詞 名詞

動詞 → eat

動詞 → read

動詞 → play

名詞→ bread

名詞→ books

名詞→ music

形式言語の文法の一例

文法から文の導出 (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

宿題

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

形式: A4 一枚、表紙なし

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