コンパイラ資料 1章 概要 2016.4.5更新.

Slides:



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

オブジェクト指向 言語 論 知能情報学部 新田直也. 講義概要  私の研究室: 13 号館 2 階 (13-206)  講義資料について :  参考図書 : 河西朝雄 : 「原理がわかる プログラムの法則」,
プログラミング言語論 第10回(演習) 情報工学科 木村昌臣   篠埜 功.
C言語によるプログラミングスタイル 制御システム工学科 山北 昌毅.
言語処理系(1) 金子敬一.
2014年度 プログラミングⅡ ~ Cプログラミングやってみよう ~.
東京工科大学 コンピュータサイエンス学部 亀田弘之
応用理工学情報処理 第1回(2015年10月 5日) 月曜日担当 前島展也 Manaba
コンパイラ 2011年10月17日
プログラミング言語としてのR 情報知能学科 白井 英俊.
2013年度 プログラミングⅡ ~ Cプログラミングやってみよう ~.
言語処理系(4) 金子敬一.
12.3,E,-15, 12.3,E5,+,=, >,<,…,
プログラミング入門2 第1回 導入 情報工学科 篠埜 功.
オブジェクト指向言語論 知能情報学部 新田直也.
プログラミング言語論 第6回 型 情報工学科 篠埜 功.
プログラミング言語論 理工学部 情報システム工学科 新田直也.
プログラミング言語論 理工学部 情報システム工学科 新田直也.
情報科学1(G1) 2016年度.
言語処理系(8) 金子敬一.
  【事例演習6】  数式インタプリタ      解 説     “インタプリタの基本的な仕組み”.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
コンパイラ 2012年10月15日
2007/1/11 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
プログラミング論 ファイル入出力
言語プロセッサ2016 Language Processors 2016
言語プロセッサ2007 平成19年9月26日(水) (Ver.2 平成19年10月3日変更)
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
FlexとBison+アルファ -実習編-
関数の定義.
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
東京工科大学 コンピュータサイエンス学部 亀田弘之
コンパイラ資料 4章 記号表 改訂1版( ).
コンパイラ資料 実行時環境.
東京工科大学 コンピュータサイエンス学部 亀田弘之
PHP 概要 担当 岡村耕二 月曜日 2限 平成22年度 情報科学III (理系コア科目・2年生)
情報処理Ⅱ 第2回:2003年10月14日(火).
オブジェクト指向プログラミングと開発環境
東京工科大学 コンピュータサイエンス学部 亀田弘之
コンパイラ 2011年10月20日
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
B演習(言語処理系演習)第2回 田浦.
JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文検証手法の提案
C言語ファミリー C# 高級言語(抽象的) Java オブジェクト指向 C++ C 機械語(原始的)
参照されないリテラル 長谷川啓
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
コンパイラ 2012年10月29日
東京工科大学 コンピュータサイエンス学部 亀田弘之
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
第6回放送授業.
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
東京工科大学 コンピュータサイエンス学部 亀田弘之
プログラミング基礎a 第3回 C言語によるプログラミング入門 データ入力
オブジェクト指向言語論 第二回 知能情報学部 新田直也.
コンパイラ 2012年10月11日
関数と再帰 教科書13章 電子1(木曜クラス) 2005/06/22(Thu.).
プログラミング演習I 2003年6月11日(第9回) 木村巌.
第10回 関数と再帰.
プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.
情報処理Ⅱ 小テスト 2005年2月1日(火).
プログラミング基礎a 第3回 C言語によるプログラミング入門 データ入力
1.2 言語処理の諸観点 (1)言語処理の利用分野
情報処理Ⅱ 第8回:2003年12月9日(火).
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
Presentation transcript:

コンパイラ資料 1章 概要 2016.4.5更新

本講義のねらい プログラミング言語の設計実装 ソフトウエア設計全般のための基礎技術 理論と実践の連携

文献 本資料 教科書 参考書 URL: http://thales.philos.k.hosei.ac.jp/compiler.html Modern Compiler Implementation in ML Modern Compiler Implementation in C Modern Compiler Implementation in Java(2nd ed.) (A.W.Appel, Cambridge Univ. Press) 参考書 コンパイラ ― 原理・技法・ツール (第2版) (エイホ,セシィ,ウルマン,ラム, サイエンス社)

コンパイラの構造 原始プログラム 字句解析(Lexical Analysis) 解析 記号表管理 構文解析(Syntactical Analysis) 意味解析(Semantic Analysis) 記号表管理 生成 中間コード レジスタ割り当て・最適化 コード生成 誤り処理 目的プログラム

各部の役割 解析:プログラムの意味を調べる 生成 記号表管理:変数名(識別子)の管理 誤り処理:各フェーズで誤り検出しながら処理を継続 字句解析:「字面」の解析。字句の認識 構文解析:文法にしたがって構文木をつくる 意味解析:各要素の意味と型の整合性 生成 中間コード生成:抽象機械に対するコード レジスタ割り当て:対象機械のレジスタ利用コード 最適化:意味上の無駄を省いて高速化する コード生成:目的コードを生成する 記号表管理:変数名(識別子)の管理 誤り処理:各フェーズで誤り検出しながら処理を継続

授業の進め方 概ね前ページのモジュールごとに講義 講義に沿って各モジュールを作成 (可能なら)講義(4限)と演習(5限)は通し授業とする (宿題の一部解答) 講義 (コードの雛形配布) 課題プログラム(授業時間内) 解答・解説 宿題プログラム (可能なら)講義(4限)と演習(5限)は通し授業とする

プログラミング言語 kitty Cに似た構文 静的スコープルール 代入文, If文, while文, print文 関数定義/関数呼び出し 基本型(int, bool)のみ 算術・論理演算、結果の印字

kittyプログラムの例 int fact(int n) { int x, y; if(n=0) x:=1; else x:=fact(n-1)*n; return x; } int main() int x; x:=fact(11); print x; return 0; kittyプログラムの例

授業で製作するkittyコンパイラ x86アセンブリ(MASM版,32bit)を生成 リンカ, アセンブラは含まない(授業ではMSリンカ・アセンブラで実行ファイル作成) 構文・型検査でエラー報告

//プログラム名:学ぶこと (導入構文要素) 1章 hello: 開発環境の使い方 count: 入力記号列、語の切り出し countalpha: 文字種の区別 2章 iddfa : 英数字受理オートマトン (id) inr: 字句解析     (num, rel) ddinr: 要求駆動型字句解析 lexer: 字句解析完全版 3章 literal: 構文解析,属性 (関係式) ifprint : 構文解析   (if文、print文) exppp: 再帰下降解析   (数式) expast: 抽象構文木生成   astpp: 抽象構文木の利用 clause : 構文要素の追加   (論理式) 4章 calc: 評価器      (ブロック) varcalc : 記号表 (宣言文、代入文) scopecalc: スコープ interpreter: インタプリタ print_visitor: visitorパターン 5章 blood: 型の表現  stmtype:  文の型検査 typecheck_visitor: 型検査完全版 6章 translate_visitor:中間コード生成 7章 callprint: ライブラリ呼び出し   tv:実行環境 (関数定義・呼出, return文) 8章 def_use: レジスタ利用調査  liveness: 生存解析 ralloc: 簡易版レジスタ割り当て spill: レジスタあふれ対策 emit: コード生成 9章 control_flow: 制御フローグラフ・大域版 liveness:生存解析・大域版 interference: 干渉グラフ 10章 color: レジスタ割り当て・大域版 11章 kittyc: 全体の組み立て

開発言語・環境 開発言語: C++ 推奨開発環境・ツール プラットフォーム: WindowsXP以降(x86) 開発ツール:Visual Studio 2010 VS 2012使用も推奨

演習の手順 スライド内で提示された課題プログラムを授業内作成 (場合により)授業内で解答・解説。 課題に関して不明な点を質問して解決。 のこった課題=宿題プログラムを次回までに作成 (次の授業)宿題プログラムに関する質問

質問について 質問は講義中・演習中問わず、随時OK ほかに、月曜5限(オフィスアワー)S413 など

課題 hello ”Hello World!”を印字するプログラムを作成せよ。

課題 count 標準入力の非空白文字列の数をカウントするプログラムを作れ。 作成したプログラムが正常に動かない入力はあるか? ヒント:バッファサイズを考慮せよ。 hello! This is a sample input file. It’s April 11th today. Unixでは Ctrl-Z Ctrl-D Enter 11

課題 countalpha  標準入力から英字列(英字だけからなる非空白文字列)の数をカウントするプログラムを書け。

C++のヒント std:cin 標準入力 >>演算子 非空白文字列を右被演算数に格納  値は、条件式ではEOFを読んだときfalse 厳密には、戻り値(左被演算数への参照)がbool型に型変換されたときの値は読み込み成功時以外でfalse 英字: 文字(char型)の値がa...zまたはA...Zの範囲か否か調べよ。