コンパイラ 2012年10月1日 酒居敬一@A468(sakai.keiichi@kochi-tech.ac.jp) http://www.info.kochi-tech.ac.jp/k1sakai/Lecture/COMP/2012/index.html
テキスト 参考書 『コンパイラとバーチャルマシン』 今城哲二,布広永示,岩澤京子,千葉雄司 共著 オーム社 『コンパイラ』 今城哲二,布広永示,岩澤京子,千葉雄司 共著 オーム社 参考書 『コンパイラの構造と最適化』 中田育男 著(朝倉書店) 『コンパイラ』 中井央 著(コロナ社) 『プログラミング言語C』 B.W.カーニハン,D.M.リッチー 著,石田晴久 訳(共立出版).
講義計画 コンパイラの概要 (10月1日2時限) コンパイラの構成 (10月4日2時限) コンパイラの概要 (10月1日2時限) コンパイラの構成 (10月4日2時限) プログラミング言語の形式的な記述 (10月11日2時限) 字句解析 (10月15日2時限) 構文解析1 (10月18日2時限) 構文解析2 (10月22日2時限) 中間表現 (10月25日2時限) 意味解析 (10月29日2時限) コード生成 (11月1日2時限) コード最適化 (11月5日2時限) 例外処理 (11月8日2時限) コンパイラと実行環境の連携1 (11月12日2時限) コンパイラと実行環境の連携2 (11月15日2時限) 動的コンパイラ (11月19日2時限) [クォータ末試験] (未定11月22日?)
成績評価 クオータ末試験および演習を総合的に評価する. 試験や演習で持ち込めるもの 教科書・ノート・配布資料 再試験はしない.
本講義の位置づけ プログラムの勉強(技術的な知識) アルゴリズムとデータ構造(抽象的な知識) 計算機のしくみの勉強(低水準の知識) 計算機言語、情報学群実験1 背景は、表現方法としてのプログラミング言語 アルゴリズムとデータ構造(抽象的な知識) 計算機システムの基礎 数学と計算法(計算機はΣや∫を知らない) 計算機のしくみの勉強(低水準の知識) 情報学群実験2 コーディング対象を知る システム設計の勉強(高水準の知識) オペレーティングシステム コンパイラ
コンパイラ コンパイラは、ソースファイルをオブジェクトファイルに 翻訳する。 その過程で言語仕様に合わない記述があれば、エラー。 目的 プログラム 目的 コンパイラ エラーメッセージ ソースリスト 実行中の プログラム プログラム ファイル コンパイラは、ソースファイルをオブジェクトファイルに 翻訳する。 その過程で言語仕様に合わない記述があれば、エラー。
さまざまなプログラム ソースプログラム(Source Program) オブジェクトプログラム(Object Program) 人間が読み書き可能な、人工言語で書いたプログラム。 オブジェクトプログラム(Object Program) ソースプログラムを機械語に翻訳したプログラム。 ただし、そのままでは実行できない。 実行プログラム(Executable Program) 実行時ライブラリなどと結合し計算機で実行できるプログラム。 これらは通常、ファイルに格納しておく。 それぞれに読み書きするプログラムが存在する。 エディタ、コンパイラ、リンケージエディタ、OS、デバッガ
・・・ ・・・ 言語処理系の構成 実行時 ライブラリ ソース プログラム 目的 コンパイラ 動的 リンカ 実行 プログラム エディタ リンケージ エディタ OSの上で 実行 デバッガ ソース プログラム 目的 コンパイラ
クロスコンパイラ 多くのコンパイラではコンパイラが動作する計算機と、 実行プログラムが動作する計算機は同じ。 しかし、そうでない場合もある。 多くのコンパイラではコンパイラが動作する計算機と、 実行プログラムが動作する計算機は同じ。 しかし、そうでない場合もある。 学群実験2で演習したはず。覚えてますか? ソース プログラム 目的 プログラム C コンパイラ マイコンで 実行 開発用PC 組み込みマイコン
プリプロセッサ 高水準言語記述のファイルを入力し、高水準言語の ファイルを出力するプログラムをトランスレータと呼ぶ。 高水準言語記述のファイルを入力し、高水準言語の ファイルを出力するプログラムをトランスレータと呼ぶ。 PascalからC、FORTRANからCへの変換系がある。 コンパイラの前段階で特別に変換するものを、 プリプロセッサと呼ぶ。 C++ソース プログラム Cソース 目的 C++プリ プロセッサ C コンパイラ
インタプリタ 解釈と実行を行うプログラムをインタプリタと呼んでいる。 翻訳するプログラムはコンパイラ。 ソース プログラム インタプリタ コンパイラ部 インタプリタ部 中間語 (メモリ上) ソース プログラム 中間語 インタプリタ コンパイラ
コンパイラとインタプリタの比較 実行速度はざっと一桁くらい、コンパイルして得た プログラムのほうが速い。 実行速度はざっと一桁くらい、コンパイルして得た プログラムのほうが速い。 コンパイラは「解釈」がいらない水準まで「翻訳」する。 翻訳には時間がかかる。 プロセッサで即実行できるので実行は速い。 OSは実行可能形式ファイルをメモリにロードするだけ。 解釈と実行はプロセッサというハードウェアが行っている。 インタープリタは「翻訳」する場合もある。 プロセッサで即実行できないので、「解釈」に時間がかかる。 OSは解釈実行プログラム(インタプリタ)をメモリにロードする。 解釈と実行をインタプリタというソフトウェアが行っている。 ここまでは、現在でも生きているけど、古い話。
インタプリタの例 数値計算 (計算機の前で電卓たたいてませんか?) 雑多な処理 プログラミング言語 bc 雑多な処理 bash, perl, awk, sed ruby, python プログラミング言語 (かつての)BASIC scheme 再利用することはないプログラムは、インタプリタ言語で 書いて、使って、捨てる。 一桁も二桁も遅くてもいい。仕事するのは機械だから。
・・・ 仮想計算機とJava バイトコードが中間語、Java VMがインタープリタ、 というように見える。 実際は、解釈をプロセッサに任せるべく、 実行時に機械語へコンパイルしている。 2ページ前に「古い」と書いた理由。 Java プログラム バイトコード コンパイラ ・・・ Java VM OS B 計算機B OS A 計算機A OS C 計算機C