Microsoft PowerPoint ppt

Similar documents
Microsoft PowerPoint ppt

Microsoft PowerPoint ppt

Microsoft Word - problem3.doc

Microsoft Word - problem5.doc

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

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

Microsoft PowerPoint - 03BNFScanner-print.ppt

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

プログラミング基礎

PowerPoint プレゼンテーション

kantan_C_1_iro3.indd

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

Microsoft Word - 3new.doc

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

PowerPoint プレゼンテーション

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

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

PowerPoint Presentation

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

PowerPoint プレゼンテーション

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

計算機アーキテクチャ

新版 明解C++入門編

第2回講義:まとめ

スライド 1

プログラミング実習I

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

Javaによるアルゴリズムとデータ構造

JavaプログラミングⅠ

ex05_2012.pptx

Microsoft Word - Javacc.docx

Microsoft PowerPoint - prog03.ppt

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

ex04_2012.ppt

Microsoft PowerPoint - 11.pptx

変数を使えるようにする arithr.y を拡張して変数を使えるようにする 変数はアルファベット小文字一文字だけからなるものとする 変数の数はたかだか 26 なので,26 個の要素をもつ配列 vbltable に格納する 一行だけで計算が終わるのではなく数式を連続で計算できるようにし,$ が入力され

Microsoft PowerPoint - C_Programming(3).pptx

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

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

Java講座

Microsoft PowerPoint - ruby_instruction.ppt

UNIX 初級講習会 (第一日目)

関東/関西/九州同時開催 女性エンジニア大集合!新春LT 座談会 スクリプト インタプリタを 作ってみた 1 スクリプトインタプリタを作ってみた

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

Microsoft Word - CompA-Ex doc

PowerPoint プレゼンテーション

Microsoft Word - Cプログラミング演習(1)_2012

PowerPoint Presentation

* ライブラリ関数 islower(),toupper() を使ったプログラム 1 /* 2 Program : trupper.c 3 Student-ID : K 4 Author : TOUME, Kouta 5 Comments : Used Library function i

Microsoft PowerPoint pptx

Microsoft PowerPoint - 09.pptx

4 分岐処理と繰返し処理 ( 教科書 P.32) プログラムの基本的処理は三つある. (1) 順次処理 : 上から下に順番に処理する ぶんきそろ (2) 分岐処理 : 条件が揃えば, 処理する はんぷく (3) 反復処理 : 条件が揃うまで処理を繰り返す 全てのプログラムは (1) から (3) の

JavaプログラミングⅠ

プログラミング基礎

命令セットの構成例 a) 算術 演算命令 例 )ADD dest, source : dest dest + source SUB dest, source : dest dest - source AND dest, source : dest dest AND source SHR reg, c

ポインタ変数

Prog1_10th

オートマトンと言語

物質工学科 田中晋

Microsoft PowerPoint - Compiler03.pptx

Microsoft PowerPoint - Compiler03note.pptx

第1回 プログラミング演習3 センサーアプリケーション

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

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

Microsoft Word - VBA基礎(3).docx

C#の基本2 ~プログラムの制御構造~

Microsoft PowerPoint - OS07.pptx

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

プログラミング基礎

Microsoft PowerPoint - prog03.ppt

ポインタ変数

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

主記憶の使われ方 システム領域 SP スタックポインタ システム用 スタック用 プログラム起動時に OS によって確 保される (SP が決められる ) プログラム用 メインルーチン プログラム領域 命令コードの列定数 変数用領域サブルーチン命令コードの列 先頭番地は リンク時に OS によって決め

講習No.1

コンピュータの仕組み(1)ハードウェア

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

VelilogHDL 回路を「言語」で記述する

スライド 1

プログラミング入門1

プログラミング言語処理系論 (4) Design and Implementation of Programming Language Processors

compiler-text.dvi

解答編 第 7 章実数型の計算と標準数学関数 演習問題 7.1 文法事項 1 ) 暗黙の型変換とは何か答えなさい 代入演算子 (=) や算術演算子 (+,-,*,/,%) では 2 つの演算項のデータ型が揃っている事が必要です 2 つの演算項のデータ型が異なる場合 可能ならば 演算項のデータ型を変換

数値計算

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

PowerPoint プレゼンテーション

C 言語第 3 回 2 a と b? 関係演算子 a と b の関係 関係演算子 等しい a==b 等しくない a!=b より大きい a>b 以上 a>=b より小さい a<b 以下 a<=b 状態 真偽 値 条件が満たされた場合 TRUE( 真 ) 1(0 以外 ) 条件が満たされなかった場合 F

Microsoft PowerPoint - 10Com2.ppt

gengo1-2

第 1 回 C 言語講座 1. コンピュータって? だいたいは 演算装置 制御装置 記憶装置 入出力装置から構成されている 演算装置 CPU の一部で実際に計算を行う装置 制御装置 CPU の一部で演算装置や入出力装置 記憶装置の読み書きなどを制御する装置 記憶装置プログラムや情報 データを一時的

プログラミング入門1

スライド 1

スライド 1

計算機プログラミング

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

Microsoft Word - no103.docx

プログラミング実習I

< F2D837C E95CF CF68A4A94C5816A2E6A>

memo

JavaScriptで プログラミング

Transcription:

仮想マシン (2), コード生成 http://cis.k.hosei.ac.jp/~asasaki /lect/compiler/2007-1204.pdf ( 訂正版 ) 1

概要 仮想マシン 概要 ( 復習 ) 制御命令 出力命令 コード生成 式のコード生成 文 文の列のコード生成 記号表 2

演習で作るコンパイラの例 test.hcc Int main() { int i j; i = 3; j = 4; putint(i+j); } test.hsm PUSH 0 2 LDC 0 3 STV 0 0 LDC 0 4 STV 0 1 LDV 0 0 LDV 0 1 WRI 0 0 POP 0 2 HLT 0 0 Test.class を逆アセンブル javap c Test で表示 0: iconst_3 1: istore_1 2: iconst_4 3: istore_2 4: getstatic #2; 7: iload_1 8: iload_2 9: iadd 10: invokevirtual #3; 13: return 3

Hsm (HiStackMachine) の概要 (1) 演習で用いる仮想機械 ( スタックマシン ) 構成プログラム P 命令列の置き場 プログラムカウンタ (pc) 次に実行する命令を指示 スタック (S) 演算対象 ( 被演算数 演算結果 ) を置く 記憶域 スタックポインタ (sp) スタックトップを指す フレームポインタ (fp) 関数 ( 手続き ) のフレームの開始アドレス ( 後の講義で説明 ) 4

Hsm (HiStackMachine) の概要 (2) 命令セット (1) ロード ストア命令 ロード命令 : スタックトップに値を置く ストア命令 : 記憶域として確保した所に値を保存する 記憶域の確保 開放の命令 (2) 演算命令 算術演算 関係演算 ( 論理演算はない ) (3) ジャンプ命令 制御命令 無条件ジャンプ 条件ジャンプ 停止命令 (4) 入出力命令 入力 出力 5

hsm の構成図 0 命令 0 pc 1 2 命令 1 命令 2 0 3 命令 3 5 4 5 命令 4 命令 5 sp -1 4 3 2 1 0 P pc = 0 のとき 命令 0 を実行する pc = 1 のとき 命令 1 を実行する pc = n のとき命令 n を実行する 値をロードする場合には sp sp+1 として S[sp] に置く S 6

制御命令 J 0 N ジャンプ命令 : pc N; FJ 0 N 条件ジャンプ命令 : if (S[sp] == 0) pc N; else pc++; sp--; J 0 20 LDC 0 1 LDC 0 2 20 番地に飛ぶ ( 次の命令は P[20]) EQ 0 0 FJ 0 20 1==2 が偽 (0) であれば 20 番地に飛ぶ そうでなければ次の命令へ (Fall through ( この場合 1==2 は a 偽であるから 必ず 20 番地に飛ぶ ) 7

出力命令 WRI 0 0 整数表示 : S[sp] を表示 ; sp--; pc++; WRC 0 0 文字表示 : 文字コード S[sp] に対する文字の表示 ; sp--; pc++; WNL 0 0 改行表示 : 改行 ; pc++; LDC 0 1 WRI 0 0 LDC 0 70 WRC 0 0 文字コード 70 番の文字 (F) を表示 整数 1 を表示 8

練習問題 (1) FJ 命令の動きに注意して VM の動作をシミュレートしてみよ ( 紙と鉛筆を使って手で確認せよ その後 hsm で確かめると良い ) 最初の命令が 0: LDC 0 2 の場合どうなるかも考えよ 0: LDC 0 1 1: LDC 0 2 2: EQ 0 0 3: FJ 0 6 4: LDC 0 84 5: WRC 0 0 6: HLT 0 0 0: LDC 0 1 1: LDC 0 2 2: EQ 0 0 3: FJ 0 7 4: LDC 0 84 5: WRC 0 0 6: J 0 9 7: LDC 0 70 8: WRC 0 0 9: HLT 0 0 9

コード生成

プログラムの構成要素 ( パーツ ) とコード生成 int main() { int i, j; i = 3; j = 4; putint(i+j); } 出力文 putint( ) 宣言部 (declaration) int i,j; 文 (statement) 代入文 i =3; LDC 0 3 STV 0 0 PUSH 0 2 POP 0 2 式 (expression) 加算式 (expression) i+j LDV 0 0 LDV 0 1 WRI 0 0 文の列 ( 連接文 ) stm1; stm2; stm3; 定数式 (expression) 3 LDC 0 3

コード生成 = 各パーツのコードをつなぎ合わせ る int main() { int i, j; i = 3; j = 4; putint(i+j); } 式 i+j 出力文 putint(i+j) LDV 0 0 LDV 0 1 WRI 0 0 宣言部 (declaration) int i,j; 文 (statement) 文の列 ( 連接文 ) stm1; stm2; stm3; 代入文 i =3; 代入文 J =4; LDC 0 3 STV 0 0 LDC 0 4 STV 0 1 PUSH 0 2 LDC 0 3 STV 0 0 LDC 0 3 STV 0 1 LDV 0 0 LDV 0 1 WRI 0 0 POP 0 2

コード生成 ( 式 ) LDC 0 1 1 +2 *3 LDC 0 2 LDC 0 3 ML 0 0 定数式 (3 つ ) 加算式 乗算式の各パーツのコードを組み合わせる 加算式のコード生成ルール ( パーツの組み合わせ方 ) 左辺 左辺 + 右辺 右辺 左辺式 ( コード生成の結果 ) の後に 右辺式を並べて 最後に命令 をくっつける 13

原始言語 (Source Language): 式の文法 <EXPRESSION>::= <TERM> <EXPRESSION> '+' <TERM> <EXPRESSION> '-' <TERM> <TERM>::= <UNARY> <TERM> '*' <UNARY> <TERM> '/' <UNARY> <UNARY>::== <FACTOR> '-' <UNARY> <FACTOR>::= <IDENT> <NUMBER> '(' <EXPRESSION> ')' <IDENT>::=a~z の英字 <NUMBER>::= 数字の 1 回以上の繰り返し文字列 14

式 のコード生成 (1) 式 左辺 左辺 + 右辺 右辺 式 - 式 NEG 0 0 15

式 のコード生成 (2) 数字列 LDC 0 数字列に対する整数 名前 LDV 0 addr( 名前 ) 16

例 : 1+2*3 (1) 1+2*3 1 1 + 2*3 2*3 1 LDC 0 1 2*3 2 * 3 17

例 : 1+2*3 (2) 2 * 3 2 3 ML 0 0 2 LDC 0 2 3 LDC 0 3 2*3 LDC 0 2 LDC 0 3 ML 0 0 18

例 : 1+2*3 (3) 1 + 2*3 1 LDC 0 1 2*3 LDC 0 2 LDC 0 3 ML 0 0 19

例 : 1+2*3 (4) 1 + 2*3 加算式 1 2*3 定数式 乗算式 LDC 0 1 2 3 ML 0 0 定数式 定数式 LDC 0 2 LDC 0 3 20

構文解析と同時に行うコード生成 1 + 2*3 E T F + F T * F E T { '+' T } T F { '*' F} F NUM NUM: 1 NUM: 2 NUM: 3 21

構文解析と同時に行うコード生成 E T + T E T { '+' T } T F { '*' T } F NUM F F * F ML 0 0 NUM: 1 LDC 0 1 NUM: 2 NUM: 3 LDC 0 2 LDC 0 3 E T { '+' T []} T F { '* F [ML 0 0]} F NUM [LDC 0, NUM に対する整数 ] 22

構文解析と同時に行うコード生成 E E T { '+' T } T F { '*' T } F NUM T + T LDC 0 1 LDC 0 2 F F * F ML 0 0 LDC 0 3 ML 0 0 NUM: 1 NUM: 2 NUM: 3 LDC 0 1 LDC 0 2 LDC 0 3 23

練習問題 (2) 1+2*3+4*5 に対するコード生成を前頁のスライドを参考に 構文木に沿った形で行え (1+2)*3 の場合は どうか? 24

原始言語 (Source Language): 文 ブロック等 <PROGRAM>::= <MAIN> <MAIN>::= 'int' 'main' '(' ')' <BLOCK> <BLOCK>::= '{' <STATEMENTLIST> '}' <STATEMENTLIST>::=empty <STATEMENTLIST> <STATEMENT> <STATEMENT>::= <SUBSTITUTION> '=' <EXPRESSION> ';' '{' <STATEMENTLIST> '}' 'putint' '(' <EXPRESSION> ')' ';' 'putnl'';' <SUBSTITUTION>::= <IDENT> -------------------------------------------- putint <EXPRESSION> の値を整数で出力 putnl 改行コードをコンソールに出力する 25

出力文のコード生成 putint(123) ; putint(1+2*3) ; LDC 0 123 WRI 0 0 LDC 0 1 LDC 0 2 LDC 0 3 ML 0 0 WRI 0 0 WRI 0 0 整数表示 : S[sp] を表示 ; sp--; pc++; putint( 式 ); 式 WRI 0 0 26

文の列 (statementlist) のコード生成 putint(123) ; LDC 0 123 WRI 0 0 putint(123) ; putint(1+2*3); putint(1+2*3) ; LDC 0 1 LDC 0 2 LDC 0 3 ML 0 0 WRI 0 0 LDC 0 123 WRI 0 0 LDC 0 1 LDC 0 2 LDC 0 3 ML 0 0 WRI 0 0 27

文の列 (statementlist) のコード生成 文の列 文の列 文 文の列 文 ε( 空文 ) φ 28

文 (statement) のコード生成 文 名前 = 式 ; STV 0 式 addr( 名前 ) { 文の列 } 文の列 putint( 式 ); 式 WRI 0 0 putnl; WNL 0 0 29

代入文のコード生成 名前 = 式 ; STV 0 式 addr( 名前 ) addr( 名前 ) は 名前に対して割り当てた記憶域のアドレス a = 1+2*3 ; LDC 0 1 今 変数 a の値を保持するアドレスが 1(addr( a )=1 ) だとすれば LDC 0 2 LDC 0 3 ML 0 0 STV 0 1 30

練習問題 (3) 下記のプログラムを 構文木に沿ってコード生成することで翻訳せよ ただし int a; int b; の宣言部は 変数 a,b の値を保持する領域を確保するコード (PUSH 0 2) に翻訳されるものとする また addr(a)=0, addr(b)=1 とする int a; Int b; a = 1+2*3; b = a * 4; putint(a); 31

記号表 ( 変数表 ) を使った記憶域の管理 宣言された変数の記憶場所などを管理するために 記号表が必要となる int main() { int abc; int cd; int efg; cd = 10; putint(cd); } 記号表 ident= abc ident= cd ident= efg address=0 address=1 address=2 名前 ( エントリ ).. 記号表に登録する内容 ident= abc つづり address=0 値を保持するアドレス 32

記号表 ( 変数表 ) を使った記憶域の管理 必要なメモリの領域確保 ( 下記では 3 変数分必要 ) cd = 10, putint(cd) の各文では addr(cd) を知る必要がある 記号表から ident が cd である名前 ( エントリ ) を検索する int main() { int abc; int cd; int efg; cd = 10; putint(cd); } 記号表 ident= abc ident= cd ident= efg address=0 address=1 address=2 コード PUSH 0 3 LDC 0 10 STV 0 1 LDV 0 1 WRI 0 0 POP 0 3 HLT 0 0 33

演習問題 2(Problem2) (1) 文法の書き換えの演習 (2)JavaCC を用いたコンパイラの演習 (3) 記号表の演習 34

演習問題 2 (Problem 2) 問題は下記 http://cis.k.hosei.ac.jp/~asasaki /lecturecompiler/problem2.htm プログラムの提出指針 http://cis.k.hosei.ac.jp/~asasaki /lecturecompiler/guideline.html プログラムの提出状況 ( 準備中 ) http://cis.k.hosei.ac.jp/~asasaki /lecturecompiler/status.htm 35

コンパイラ作成の流れと プログラムの実行 20+10*5 cs07k1234.class JavaCC/javac cs07k1234.jj LDC 0 20 LDC 0 10 LDC 0 5 ML 0 0 HLT 0 0 コンパイラ作成の流れ hsm プログラムのコンパイル 実行の流れ 36

再提出レポート等についての注意 再提出レポートは 他のレポートとは別に提出してください 前回との差分がわかるように 最初に提出したものも一緒に提出してください 37