言語プロセッサ 第7回目 平成27年11月16日.

Slides:



Advertisements
Similar presentations
2.5 プログラムの構成要素 (1)文字セット ① ASCII ( American Standard Code for Interchange ) JIS コードと同じ ② EBCDIC ( Extended Binary Coded Decimal for Information Code ) 1.
Advertisements

和田俊和 資料保存場所 /2/26 文法と言語 ー正規表現とオートマトンー 和田俊和 資料保存場所
プログラミング言語論 第10回(演習) 情報工学科 木村昌臣   篠埜 功.
Problem J: いにしえの数式 問題作成・解説: 北村 解答作成協力: 八森.
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
演算、整数型と浮動小数点型 第3回目 [4月27日、H.16(‘04)] 本日のメニュー 1)前回の課題・宿題 2)ファイルサーバの利用
東京工科大学 コンピュータサイエンス学部 亀田弘之
コンパイラ 2011年10月17日
データ構造とアルゴリズム 第10回 mallocとfree
基礎プログラミングおよび演習 第9回
コンパイラ 第9回 コード生成 ― スタックマシン ―
プログラミング言語論 第6回 型 情報工学科 篠埜 功.
文法と言語 ー文脈自由文法とLL構文解析ー
プログラミング言語論 第4回 式の構文、式の評価
言語処理系(5) 金子敬一.
言語処理系(8) 金子敬一.
東京工科大学 コンピュータサイエンス学部 亀田弘之
コンパイラ 2012年10月15日
コンパイラ 2012年10月22日
東京工科大学 コンピュータサイエンス学部 亀田弘之
言語プロセッサ2015 Language Processors 2015
コンパイラ 2011年10月24日
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
プログラミング言語論 第3回 BNF記法について(演習付き)
FlexとBison+アルファ -実習編-
東京工科大学 コンピュータサイエンス学部 亀田弘之
プログラミング演習I 2003年5月7日(第4回) 木村巌.
コンパイラ 第13回 上昇型構文解析(1) 38号館4階N-411 内線5459
東京工科大学 コンピュータサイエンス学部 亀田弘之
言語プロセッサ 第8回目 平成22年11月22日.
言語と文法 言語とは,ルールに従う記号列の無限集合である. 文法を与えることで言語が定義できる.
東京工科大学 コンピュータサイエンス学部 亀田弘之
言語プロセッサ ー第9回目ー 構文解析(続き).
平成20年10月5日(月) 東京工科大学 コンピュータサイエンス学部 亀田弘之
情報処理Ⅱ 第2回:2003年10月14日(火).
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
文法と言語 ー文脈自由文法とLL構文解析ー
コンパイラ 2011年10月20日
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
アルゴリズムとプログラミング (Algorithms and Programming)
参照されないリテラル 長谷川啓
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
文法と言語 ー文脈自由文法とLR構文解析ー
コンパイラ 2012年10月29日
プログラミング論 ポインタ
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田 弘之
4.プッシュダウンオートマトンと 文脈自由文法の等価性
情報処理Ⅱ 2005年10月28日(金).
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
言語プロセッサ 第12日目 平成20年1月9日.
オブジェクト指向言語論 第二回 知能情報学部 新田直也.
コンパイラ 2012年10月11日
言語プロセッサ ー第9回目ー 構文解析(続き).
言語プロセッサ ー第7回目ー 構文解析(続き).
東京工科大学 コンピュータサイエンス学部 亀田 弘之
東京工科大学 コンピュータサイエンス学部 亀田 弘之
プログラミング演習I 2003年6月11日(第9回) 木村巌.
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
プログラミング基礎a 第5回 C言語によるプログラミング入門 配列と文字列
プログラミング入門2 第5回 配列 変数宣言、初期化について
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
Presentation transcript:

言語プロセッサ 第7回目 平成27年11月16日

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 前回演習課題の確認 文法G4について答えよ。 終端記号はどれか? 非終端記号はどれか? 開始記号はどれか? First集合を求めよ。 Follow集合を求めよ。 構文解析表を求めよ。 G4はLL(1)か? G4: S → i C t S S‘| a S’→e S | ε C→b 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 説明 if condition_is_true then sentence if condition_is_true then sentence else sentence if A then if B then C else D の解釈は?  if A then if B then C else D if A then if B then C else D 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 前回までにやったこと 言語プロセッサ(コンパイラ,インタープリタ) 処理過程の概要 字句解析 正規表現,トークン Flex(入門) 構文解析 文法(文脈自由文法,LL(1),LR(1) など) 括りだし,左再帰とその回避法,バックトラック First,Follow,構文解析表,予測的構文解析法 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) コード生成の概要 原始プログラム 目的コード 字句解析 構文解析 意味解析 中間コード生成 コード生成 最適化 中間コード 中間コード 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) もう一度具体例で確認 program daikei(input,output); var abc,xyz,t:integer; begin write('abc xyz = '); read(abc,xyz); abc := xyz + abc * 123; writeln('result = ',abc) end. 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) abc := xyz + abc * 123; (読み込み) 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) abc := xyz + abc *123; トークンへの分解(字句解析) ( 変数1, abc ) ( 代入記号, := ) ( 変数2, xyz ) ( 加算記号, + ) ( 変数1, abc ) ( 乗算記号, * ) ( 定数1, 123 ) ( 文区切り記号, ; ) 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) abc := xyz + abc * 123 (構文解析) 代入記号 変数1 加算記号 変数2 乗算記号 変数1 定数1 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) コード生成の概要 原始プログラム 目的コード 字句解析 構文解析 意味解析 中間コード生成 コード生成 最適化 中間コード 中間コード 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 意味解析 名前の宣言と使用との対応付け 例: int x, y; float z; x = z * y; 整数型 = 浮動小数点型 * 整数型 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 意味解析 例: int x, y; float z; x = z * y; 整数型 = 浮動小数点型 * 整数型 整数型 = 浮動小数点型*浮動小数点型 整数型 = 浮動小数点型 整数型 = 整数型 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 変数等の宣言された情報を参照する必要がある。 => 記号表を用意しよう! ・名前 (spell) ・型 (int, float, …, struct char *, etc.) ・記憶域 (static, auto, …) ・その他 (const, etc.) 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 変数の場合(例) 型 大きさ(バイト数) 有効範囲 通常変数/仮引数 宣言の有無(暗黙宣言が許されている言語) 実行時に割り当てられるアドレス など 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 関数名・手続き名(例) 仮引数の個数および仮引数の型 戻り値の型(関数の場合) 有効範囲 コードの先頭番地(entry point) 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 定数名(例) 型 定数の内部表現 アドレス 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 型名(例) 型の種別(int, float, array, structure, etc.) 型の種別ごとの情報 (arrayならば、添字の範囲、要素の型など) 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 記号表に対する操作 登録 参照 更新 削除 =>表探索問題(Table Search Problem) 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 記号表の操作は 速くなければならない =>どうすればいいのか? => これ以降の議論は、   「データ構造とアルゴリズム」や   「計算可能性と計算量」など   の授業で学んでください。 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 探索アルゴリズム 線形探索法(改良版には番兵法) 2分探索法 ハッシュ法(ハッシング法) 2分最適木法 B木法 etc. 自分で作るときには、まず「線形探索」でOK。 その後、例えばhashing法にしてみよう。 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 中間言語 原始プログラムの構文解析結果は、 「解析木」である。 実際には、解析木とは異なる内部表現を 使うことも多い。 =>これを「中間言語」と呼ぶ。 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 中間言語とは コンパイラは、原始プログラムを目的プログラムに変換する途中段階で、中間的なプログラムを作る場合がある。これを「中間コード」あるいは、「中間言語プログラム」といい、これを記述する言語を「中間言語」という。 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 中間言語 構文木 後置記法(Polish notation) 三つ組 四つ組 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 1.構文木 (いままで幾つか例を見てきましたので省略) 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 2.後置記法 前置記法(prefix notation) 中置記法(infix notation) 後置記法(postfix notation) 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 2.後置記法 前置記法(prefix notation) + X Y 中置記法(infix notation) X + Y 後置記法(postfix notation) X Y + 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 練習問題   言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 後置記法の長短 長所: 括弧が不要 コード生成がし易い スタックを利用すると、インタープリタが容易に 実現可能(教科書pp.15-19参照のこと) 短所: 四つ組(後述)と比べ表現に融通性欠如 そのため、最適化に不向き 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 3.三つ組 形式: 番号 (演算子,被演算子1,被演算子2) 例: 7.(+,X,15) (意味) ⑦ ← X+15 二番地命令/コードともいう 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 例 A = 10 * B ー C / D => (*,10,B) ( / ,C,D) (ー,①,②) (=,③,A) 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 4.四つ組 形式: (演算子,被演算子1,被演算子2,結果の変数) 例: (+,X,15,t) (意味) t ← X+15 三番地命令/コードともいう 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

例 A = 10 * B ー C / D => 1.(*,10,B,t1) 2.( / ,C,D,t2) 3.(ー,t1,t2,A) 1と2の順序を入れ替えても、結果は変わらない! 最適な計算順序がある? 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 例2:X=(A+B-C)/(A+B) 練習問題 (まずは自分でやってみよう) 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 例2:X=(A+B-C)/(A+B) (+,A,B,t1) (ー,t1,C,t2) (+,A,B,t3) ( / ,t2,t3,X) 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 例2:X=(A+B-C)/(A+B) (+,A,B,t1) (ー,t1,C,t2) (+,A,B,t3) ( / ,t2,t3,X) t1とt3は実は同じもの! 最適化しよう! 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 例2:X=(A+B-C)/(A+B) (+,A,B,t1) (ー,t1,C,t2) ( / ,t2,t1,X) (最適化された!) 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 練習問題 今日の 練習問題 式 x + y * ( z – w ) を 構文木 後置記法 三つ組 の列 四つ組 の列  として表せ。 出席用紙に答案を書いてください。最後に、提出してもらいます。 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) コードの最適化 コンパイル過程において、生成するコードを改良することを「コード最適化」という。 では、「改良」とはどうすること? 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 最適化の内容(例) コードを小さくする 実行時の効率をよくする 実行時の使用メモリを小さくする 一般には、2が重要視される。 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) コード最適化の手法 共通部分の削除 複写伝播 不要コードの削除 ループ不変量の抽出とコード移動 演算子の強さの軽減 などなど 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 1.共通部分の削除 A=B/(C+D)-(C+D); ( +, C, D, t1 ) ( /, B, t1, t2 ) ( +, C, D, t3) ( -, t2, t3, A) 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 1.共通部分の削除 A=B/(C+D)-(C+D); ( +, C, D, t1 ) ( /, B, t1, t2 ) ( +, C, D, t3 ) ( -, t2, t3, A ) ( +, C, D, t1 ) ( /, B, t1, t2 ) ( -, t2, t1, A ) 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 2.複写伝播 X = Y; Z = X + 1; W = X; X = Y; Z = Y + 1; W = Y; Yだけ。Xなし。 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 3.不要コードの削除 X = Y; Z = Y + 1; W = Y; Z = Y + 1; W = Y; 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 4.ループ不変量の抽出とコード移動 for ( i=0; i<100; i++ ) x[ i ] = 10 * a[ j ] + y[ i ]; w = 10*a[ j ]; for( i = 0; i < 100; i++ ) x[ i ] = w + y[ i ] 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 5.演算子の強さの軽減 Y = A*2 Y = A + A 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) コード生成の概要(再) 原始プログラム 目的コード 字句解析 構文解析 意味解析 中間コード生成 コード生成 最適化 中間コード 中間コード 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) お知らせ 来週からPCを用いた演習をやります。 PCを持参してください。 gcc, Flex, Bisonなどを使っていきます。 事前に準備しください。 授業自体は、教壇のPC中心で行います。 周りの仲間とわいわいとやりましょう。 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)

言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之) 最後に 寒くなってきました,またインフルエンザの流行時期になりました.手洗い,うがいをしましょう. インフルエンザに罹ったら,病院へ行くとともに,他人にうつさないためにも,自宅でしっかりと療養してください. その際には,大学・先生に連絡すること. 病院で診断書をもらうことを忘れずに! 以上 言語プロセッサ2015 東京工科大学CS学部 (担当 亀田弘之)