言語理論とコンパイラ

第一回 (2015年 4月10日)

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

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

Martin J. Dürst

duerst@it.aoyama.ac.jp

O 棟 529 号室

AGU

© 2006-15 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.

授業の進め方

授業の日程

日程

参考書

(授業は言語理論とコンパイラ両方をカバーするが、参考書は片方に集中)

授業の内容


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

入力と出力の違いの例

(計算機実習 I の 041A と 04C1 の問題)

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

→ は内部のデータの出力
← は外部からの入力
どの方向の変更が難しいか

 

入力の難しさ

コンパイラの役割

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

コンパイラの仕事の一例

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

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)

  1. [プリプロセッサ (preprocessor)]
  2. 字句解析 (lexical analysis)
  3. 構文解析 (parsing; syntax analysis)
  4. 意味解析 (semantic analysis)
  5. 最適化 (optimization)
  6. コード生成 (code generation)
  7. [アセンブラ (assembler)]
  8. [リンカ (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

宿題

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

形式: A4 一枚、表紙なし

課題: 下記一行の C プログラム断片の字句解析の結果、構文解析の結果、そしてコンパイラの出力を、授業の例に習って書きなさい。

アセンブリ言語でのコメントは不必要; 引き算は SUB、割り算は DIV
grade = math/2 + english - absent*3;