Microsoft PowerPoint - Compiler01note.pptx

Similar documents
Microsoft Word - Javacc.docx

Microsoft PowerPoint ppt

Microsoft PowerPoint - Compiler06.pptx

Microsoft PowerPoint - Compiler06note.pptx

PowerPoint プレゼンテーション

Microsoft PowerPoint - Compiler03note.pptx

Microsoft PowerPoint - Compiler10note.pptx

Microsoft PowerPoint - Compiler03.pptx

プログラミング基礎

PowerPoint プレゼンテーション

Microsoft PowerPoint ppt

言語プロセッサ2005

PowerPoint Presentation

文法と言語 ー文脈自由文法とLR構文解析2ー

ex04_2012.ppt

Microsoft PowerPoint - 計算機言語 第7回.ppt

数値計算

Java講座

デジタル表現論・第4回

スライド 1

Microsoft Word - problem3.doc

デジタル表現論・第6回

C 言語の式と文 C 言語の文 ( 関数の呼び出し ) printf("hello, n"); 式 a a+4 a++ a = 7 関数名関数の引数セミコロン 3 < a "hello" printf("hello") 関数の引数は () で囲み, 中に式を書く. 文 ( 式文 ) は

Microsoft PowerPoint - prog03.ppt

プログラミング実習I

Microsoft PowerPoint - Compiler05note.pptx

JavaプログラミングⅠ

Prog1_12th

ポインタ変数

Prog1_3rd

PowerPoint プレゼンテーション

Microsoft PowerPoint - Compiler05.pptx

kiso2-03.key

2006年10月5日(木)実施

Java プログラミング Ⅰ 3 回目変数 変数 変 数 一時的に値を記憶させておく機能型 ( データ型 ) と識別子をもつ 2 型 ( データ型 ) 変数の種類型に応じて記憶できる値の種類や範囲が決まる 型 値の種類 値の範囲 boolean 真偽値 true / false char 2バイト文

Microsoft PowerPoint - Compiler04note.ppt [互換モード]

Microsoft PowerPoint - 11.pptx

8 / 0 1 i++ i 1 i-- i C !!! C 2

ガイダンス

情報工学実験 C コンパイラ第 2 回説明資料 (2017 年度 ) 担当 : 笹倉 佐藤

メソッドのまとめ

Java プログラミング Ⅰ 3 回目変 数 今日の講義講義で学ぶ内容 変数とは 変数の使い方 キーボード入力の仕方 変 数 変 数 一時的に値を記憶させておく機能 変数は 型 ( データ型 ) と識別子をもちます 2 型 ( データ型 ) 変数に記憶する値の種類変数の型は 記憶できる値の種類と範囲

計算機アーキテクチャ

ex05_2012.pptx

Microsoft PowerPoint - Compiler04note.ppt [互換モード]

C言語入門

memo

ポインタ変数

講習No.12

Microsoft Word - no01.doc

Microsoft PowerPoint - Compiler04note.ppt [互換モード]

Microsoft PowerPoint - pro-vm2.ppt

Microsoft PowerPoint - ruby_instruction.ppt

PowerPoint プレゼンテーション

Microsoft Word - CompA-Ex doc

COMET II のプログラミング ここでは機械語レベルプログラミングを学びます 1

Microsoft PowerPoint - CproNt02.ppt [互換モード]

Microsoft Word - java a.doc

Microsoft PowerPoint pptx

プログラミングA

JavaプログラミングⅠ


メディプロ1 Javaプログラミング補足資料.ppt

Javaの作成の前に

プログラミング入門1

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 今日の講義講義で学ぶ内容 switch 文 論理演算子 条件演算子 条件判断文 3 switch 文 switch 文 式が case のラベルと一致する場所から直後の break; まで処理しますどれにも一致致しない場合 def

Microsoft Word - 3new.doc

Taro-ファイル処理(公開版).jtd

PowerPoint プレゼンテーション

JavaプログラミングⅠ

slide5.pptx

情報処理演習 B8クラス

Microsoft Word - no11.docx

Microsoft PowerPoint pptx

Microsoft PowerPoint - 3.ppt [互換モード]

文字列操作と正規表現

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

Prog1_6th

Microsoft PowerPoint - C_Programming(3).pptx

Microsoft PowerPoint - prog09.ppt

Microsoft PowerPoint - prog09.ppt

PowerPoint プレゼンテーション

Taro-ポインタ変数Ⅰ(公開版).j

4 月 東京都立蔵前工業高等学校平成 30 年度教科 ( 工業 ) 科目 ( プログラミング技術 ) 年間授業計画 教科 :( 工業 ) 科目 :( プログラミング技術 ) 単位数 : 2 単位 対象学年組 :( 第 3 学年電気科 ) 教科担当者 :( 高橋寛 三枝明夫 ) 使用教科書 :( プロ

講習No.9

Microsoft PowerPoint - 03BNFScanner.ppt [互換モード]

Microsoft PowerPoint - 03BNFScanner-print.ppt

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

Java Scriptプログラミング入門 3.6~ 茨城大学工学部情報工学科 08T4018Y 小幡智裕

画像ファイルを扱う これまでに学んだ条件分岐, 繰り返し, 配列, ファイル入出力を使って, 画像を扱うプログラムにチャレンジしてみよう

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

第 2 章インタフェース定義言語 (IDL) IDL とは 言語や OS に依存しないインタフェース定義を行うためのインタフェース定義言語です CORBA アプリケーションを作成する場合は インタフェースを定義した IDL ファイルを作成する必要があります ここでは IDL の文法や IDL ファイ

Microsoft Word - Training10_プリプロセッサ.docx

C言語入門

プログラミング実習I

スライド 1

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

2

アセンブラとコンパイラ・インタプリタ

18/12/06 情報工学実験 C コンパイラ (2018 年度 ) 担当 : 笹倉 佐藤 その 3 yacc の構造 定義部 %% 定義部の終了 規則部 %% 規則部の終了 ユーザ定義サブルーチン部 :C のプログラムを書く 形は lex と同じ 1

Transcription:

第 1 回の概要 http://www.info.kindai.ac.jp/compiler 38 号館 4 階 N-411 内線 5459 takasi-i@info.kindai.ac.jp 本科目の内容 (compiler) とは何か の構成 の作成方法 字句解析 構文解析 制約検査 コード生成 最適化情報システムプロジェクト I と連携 成績について 課題レポート (30%) 中間試験 (30%) 期末試験 (40%) 無届欠席禁止 やむを得ず欠席した場合は翌週までに欠席届を提出すること 無届欠席が複数回ある場合は試験の点数に関わりなく不受となる 昨年度の受講状況 学年コース受講者数合格不可不受合格率 3 システム 72 64 3 3 89% 4 システム 0 0 0 0-3 メディア 2 0 1 1 0% 4 メディア 6 4 0 2 67% 全出席し 全レポートを〆切までに提出して不可になった受講生はいない 導入 Javaプログラムの実行 Hello. public class Hello { public static void main (tring args[]) { ystem.out.print( Hello! World! n ); Cプログラムの実行 Hello.c #include <stdio.h> int main () { printf ( Hello! World! n"); 機械語 (machine language) 1,0 の並び 計算機で実行可能 レジスタ, ビット操作が必要 ハードウェアに依存 0001 0000 0101 0010 0000 1010 0000 1100 1110 0100 1111 0011 0101 0000 0001 $ c Hello. $ Hello Hello! World! これは? 実行 $ gcc -o Hello Hello.c $ Hello Hello! World! プログラムの作成が困難 プログラムの理解が困難 プログラムのデバグが困難 実行の前にコンパイル (compile) を行う 人間が機械語を直接操作するのは効率が悪い 1

アセンブリ言語 (assembly language) 機械語命令を簡略名で記述 レジスタ, ビット操作が必要 ハードウェア依存 番地 レジスタ等に名前 実行は機械語変換が必要 機械語よりはプログラムの作成 理解 デバグが容易しかしまだ人間がアセンブリ言語を直接操作するのは効率が悪い A DC 5 B DC 10 TART D GR0, A ADD GR0, B T GR0, A 高水準言語 (high level language) 命令が基本的に英語 ハードウェアに依存しない 変数名 メソッド名等を付けられる メソッド 関数等を定義できる C, Java 等 人間にとって理解し易い しかし計算機はそのままでは高水準言語を理解できない public class ample { public static void main (tring args[]) { int n; int a[n] = new int[8]; for (int i=0; i<n; ++i) { a[i] = i*2; int x, y, z; if (x == 1) { ystem.out. print (y) : else { プログラミング言語の翻訳 プログラミング言語は文法が明確 計算機で 翻訳 可能 高水準言語のプログラム 翻訳 自然言語は文法に曖昧性 計算機での 翻訳 は難しい 低水準言語のプログラム プログラミング言語の文法 < 文 > ::= <if 文 > <while 文 > <for 文 > < 式文 > { < 文の並び > ; ( 空文 ) 文として定義されているもの以外はエラー プログラミング言語の文法 <if 文 > ::= if ( < 式 > ) < 文 > または if ( < 式 > ) < 文 > else < 文 > < 式 > ::= < 項 > + < 項 > < 項 > ::= < 因子 > * < 因子 > < 因子 > ::= < 整数 > < 変数 > ( < 式 > ) 全て厳密に定義されている (compiler) (source program) を (object program) に変換 ( 翻訳 ) するプログラム (source program) 入力 (compiler) 出力 (object program) 2

(source program) (source program) 高水準言語 (high level language) で記述 人間がエディタで作成 そのままでは実行不可 C, Java 等 public class ample { public static void main (tring args[]) { int n; int a[n] = new int[8]; for (int i=0; i<n; ++i) { a[i] = i*2; int x, y, z; if (x == 1) { ystem.out.print (y) : else { (object program) (object program) 低水準言語 (low level language) で記述 ( 高水準言語を出力するもある ) 高水準言語からが変換 実行可能なプログラムもある 機械語, アセンブリ言語 0 PUHI 0 1 POP 5 2 PUH 5 3 PUH 1 4 COP 5 BGE 20 6 JUP 11 7 PUHI 5 8 PUH 5 9 INC と Hello. c public class Hello { public static void main (tring args[]) { ystem.out.print( Hello! World! n ) 人間が読み書き可能 Hello.class ハ コセ???2???????????<init>?()V?Code? inenumbertable?main?([/lang/tring;)v? ourcefile? Hello.?????? Hello! World!????Hello?/lang/Object?/lang/ystem?out?/io/Printtream;?/io/Printtream? println?(/lang/tring;)v?!????????????????????* キ? ア???????????????????%????? イ? カ? ア??????????????????? 人間には理解不能 実行形式プログラム (executable program) 実行形式プログラム (executable program) 実行可能なプログラム 機械語で記述 高水準言語からが変換 Hello.c gcc Hello 実行形式 $ gcc -o Hello Hello.c ファイル名を入力すれば $ Hello 実行可能 Hello! World! ( 注意 ) ファイル名入力で実行できるもの全てが実行形式プログラムではない ライブラリ (library) 多くのプログラムに共通して使われる機能 入出力関数, 数学関数 ( 三角, 指数対数等 ) 等 ライブラリ (library) 多くのプログラムに共通して使われる機能 = プログラムごとに作成するのは無駄 プログラム 1 入出力関数 ライブラリ (library) を用いる プログラム 2 プログラム 3 入出力関数 個別に入出力関数作るのは無駄 予め作成しておけばいい プログラム 1 プログラム 2 プログラム 3 ライブラリ入出力関数 数学関数 結合 3

コンパイルシステム例プリプロセッサアセンブラ分割コンパイル (separate compile) 分割コンパイル (separate compile) をクラス メソッドごとに分割 各クラスごとにコンパイルする 入出力部の 関数計算部の 時間計測部の ライブラリ 入出力部の 関数計算部の 時間計測部の 結合 リンカ (linker) 分割コンパイルの問題点 複数のファイルを別々にコンパイル 他のファイルのサイズ 番地が分からない ファイル 1 ファイル 2 ジャンプ 番地を後から決定できるようにする 再配置可能プログラム (relocatable program) 飛び先の番地は? 再配置可能プログラム (relocatable program) 再配置可能プログラム プログラム先頭を 0 番地として相対的に記述 他のプログラムと結合時に番地を再計算 0 OAD 1000 1 OAD 1: 2 ADD 3 BEQ 10 4 INPUT 5 TORE 1002 : 先頭を 0 番地とした番地 他のプログラムの番地には仮のラベル 分割コンパイル 1 (source) 再配置可能プログラム 1 (relocatable) 実行形式プログラム (executable) 2 (source) 再配置可能プログラム 2 (relocatable) リンカ プリプロセッサ (preprocessor) プリプロセッサ が高水準言語の の前処理として行う ( 高水準言語 ) プリプロセッサ ( 高水準言語 ) ライブラリ リンカ4

インタプリタ (interpreter) 高水準言語低水準言語 インタプリタ (interpreter) 高水準言語 インタプリタ 実行 実行高水準言語を解釈して処理 BAIC, perl, ruby 等 とインタプリタ 一旦コンパイルすれば高速で実行可能 ( インタプリタの数十 ~ 数百倍 ) 繰り返し実行するときに有効 インタプリタ コンパイルすることなく実行可能 1 回だけ実行するときに有効 作成 実行を繰り返すときに有効 処理 とインタプリタ インタプリタ 低水準言語に変換そのまま実行 プログラム作成 + 実行 コンパイルが必要 そのまま実行可能 実行速度 速 遅 処理系の多機種への移植 難 易 作成し易さ難易 Java の場合 Java $ c Hello. $ Hello Hello! World! c Java byte code インタプリタ Java byte code は中間コード (intermidiate code) 実行形式ではない インタプリタ を使用 + インタプリタ の記述言語 (source program) を (object program) に変換 ( 翻訳 ) するプログラム もプログラムその言語は? 高水準言語? 低水準言語? T 図式 原始言語 を目的言語 T に変換する言語 で記述された原始言語目的言語 T 図式 T 記述言語 5

T 図式 ( 言語 ) ( 言語 ) ( 言語 T) T 図式 例 : Java を JBC(Java byte code) に変換する機械語 で記述された c f T f T Hello. Java Java Hello. class c JBC JBC T 図式 ( インタプリタの場合 ) f ( 言語 ) インタプリタ ( 言語 ) T 図式 (Java の場合 ) Java c Java byte code インタプリタ f Hello. Java Java Hello. class c JBC JBC JBC の作成 機械語 のみ実行可能 計算機 計算機 上で動く高水準言語 のが欲しい 必要な しかし機械語 でプログラムは難しい 既存の高水準言語を利用 の作成 計算機 上で動く高水準言語 のが欲しい 計算機 上で動く高水準言語 T のを利用 T T 作成する 既存の 目的の の作成は高水準言語で行える 6

の作成 計算機 上で動く高水準言語 のが欲しい の作成 新しい計算機 N 既存の計算機 N 計算機 上で動く高水準言語 T のを利用 ではTのはどうやって作る? 上で動く既存の高水準言語が無い場合は? 別の計算機 N 上で動くを利用 N 作成する N 既存の N 目的の クロスコンパイル (cross compile) 情報システムプロジェクト I の場合 原始言語 : k19 言語 (C 風言語 ) 目的言語 : V(Virtual tack achine) アセンブラ言語 記述言語 : Java k19 Kc. V k19 Java Java 作成する sort.k c k19 既存の Kc.classV V JBC JBC JBC 既存のインタプリタ sort.asm V vsm 授業で配布するインタプリタ の構造 字句解析系 構文解析系 制約検査系 中間コード生成系 最適化系 目的コード生成系 字句解析系 (lexical analyzer, scanner) 字句解析系 空白 コメントを読み飛ばす 単語 (token) に区切る マイクロ構文エラーを検出 if (ans >= 123 ) /* ans の値で分岐 */ ( 改行 ) ( 空白 )output ( 1 ) ; 予約語 if 左括弧 ( 変数 ans 不等号 >= 整数 123 右括弧 ) 予約語 output : 構文解析系 (syntax analizer, parser) 構文解析系 構文解析木を作成 if (ans > 123 ) output ( 1 ) ; 変数 if 文 if ( 式 ) 文 式 > 式 ans 123 出力文 整数 output ( 式 ) ; 文字 1 7

制約検査系 (constraint checker) 制約検査系 変数の未定義 二重定義 型の不一致などを検査 変数 x は未定義 変数 i は配列ではない 代入の左辺が変数ではない int i, j; x = 0; i[10] = 5; 0 = 10; 中間コード生成系 (semantics analyzer, intermediate code generator) 意味解析系 単純な命令の列 ( 中間コード ) を生成する 中間コード (intermediate code) ハードウェアには依存しない 3 番地コード (three address code) が多用される A := B op C if (a>0) b:=2*a+b; if (a 0) goto : t := 2 * a b := t + b : 中間コードを用いる利点 中間コードはハードに依存しない 異なるハードで共通で使用可能 中間コード中間コード 中間コード中間コード N 計算機 用 計算機 N 用 最適化系 (optimizer) 最適化系 中間コードを改良 実行速度を速く メモリ使用領域を小さく if (a 0) goto : t := 2 * a b := t + b : if (a 0) goto : t := a + a b := t + b : 掛け算より足し算の方が速い 目的コード生成系 (object code generator) 目的コード生成系 変数の記憶位置決定 レジスタの割付 D GR1, a EA GR1, 0, GR1 if (a 0) goto : t := a + a b := t + b : JI : JZE : ADD GR1, a ADD GR1, b T : GR1, b 表管理 (table manegement, bookkeeping) 表管理 中の変数, 関数等の名前, 型情報等を記憶 int i, j; char ch; int a[10]; 変数名 型 サイズ 番地 i int 1 0 j int 1 1 ch char 1 2 a int[] 10 3~12 8

管理表の構成 誤り処理 (error handling) 誤り処理 が言語の制約を満たしていない場合にエラーメッセージを出す int あ, い, う ; if () output (1); 5 = a; 1 行目で字句解析エラー : 変数名に日本語は使えません 2 行目で構文解析エラー : if 文の条件式がありません 3 行目で制約検査エラー : 代入の左辺が変数ではありません 字句解析構文解析制約検査中間コード生成最適化目的コード生成 字句解析誤り処理 構文解析誤り処理 制約検査誤り処理 ( 情報システムプロジェクトIの場合 ) K18 言語字句解析字句解析誤り処理構文解析構文解析誤り処理制約検査制約検査誤り処理中間コード生成最適化目的コード生成 Vアセンブラ言語 管表理の構成 処理の流れ ( 情報システムプロジェクト I の場合 ) output (ab); 字句解析系 output ( 変数名 ) ; 構文解析系 マイクロ構文の文法に従い解析 マクロ構文の文法に従い解析 <output_statement> ::= output ( <exp> ) ; コード生成系 1. PUH ab 2. OUTPUT V アセンブラの文法に従い生成 スタックマシン (stack machine) スタックマシン (stack machine) スタックマシン Instruction Iseg[] : アセンブラプログラムを格納 int Dseg[] : 実行中の変数値を格納 int tack[] : スタック ( 作業場所 ) int Program Counter : 現在の Iseg の実行位置 int tack Top : 現在のスタックの操作位置 Program Counter 3 Iseg 0 PUHI 0 1 PUHI 3 2 AGN 3 PUHI 7 4 AGN 5 ADD 6 OUTPUT 7 HAT Dseg 0 3 1 0 2 0 3 0 4 0 5 0 6 0 7 0 tack 0 3 1 7 2-3 - 4-5 - 6-7 - tack Top 1 9

Iseg と Program Counter V の動作 1. Iseg の PC 番地の命令を実行 2. PC := PC+1 or ジャンプ命令で指定した先 Program Counter 34 Iseg 0 PUHI 0 1 PUHI 3 2 AGN 3 PUHI 7 4 AGN 5 ADD Dseg 実行中の変数値を格納 int i, j, x=2, y=3; char c = a ; int a[5]; Dseg 0 0 i 1 0 j 2 2 x 3 3 y 4 a c 5 0 a[0] 6 0 a[1] 7 0 a[2] 8 0 a[3] 9 0 a[4] tack tack 作業場所, 処理中のデータの一時置き場 ast In First Out tack 0 3 1 7 2-3 - 4 - tack Top 1 最後に入れたデータの位置 初期値 = -1 ( スタック内にデータ無し ) プログラムの構造 ( 字句解析系 構文解析系 ) Filecanner. ファイル探査部 char nextchar(); //1 文字読み込む k 言語 exicalanalyzer. 字句解析部 Kc. 構文解析部 char Token Token nexttoken(); void parse<a>(); // トークンを切り出す // 非終端記号 <A> を // 解析をする Token. トークン定義部 boolean checkymbol(ymbol); // トークンを識別する ymbol. トークン名列挙部 プログラムの構造 ( コード生成系 ) Kc. 構文解析部 void parse<a>(); // 非終端記号 <A> を // 解析をする VarTable. 変数表格納部 boolean registernewvariable(); // 変数を加える boolean exist(); // 変数の存在判定 boolean checktype(type); // 型識別 PseudoIseg. 命令表格納部 int appendcode(); // 命令を加える void replacecode(); // 命令を変更する void dump2file(); // 命令を出力する Var. 変数部 Type. 型名列挙部 Instruction. 命令部 Operetor. 命令名列挙部 V アセンブラ 宿題 言語理論とオートマトン の復習をする 有限オートマトン 正則表現 正則文法 BNF 記法, EBNF 記法 10