言語理論とコンパイラ
第十三回:
実行環境、仮想計算機、ゴミ集め、動的コンパイラ
2006 年 7月14日
http://www.sw.it.aoyama.ac.jp/2006/Compiler/lecture13.html
© 2006 Martin
J. Dürst 青山学院大学
目次
- 期末試験について
- 実行環境
- ゴミ集め
- 仮想計算機
- 動的コンパイル
期末試験について
日時: 7月28日 (金曜日) 11:10-12:35 (85分)
全体の資料
2005 年の試験問題
(問題の番号などが見えるようにするには最新のブラウザ
(例えば Opera) が必要。 解答 (例)
を見るにはスタイルシートを切り替える必要がある。)
先週の宿題
問題: if (a==5 || b==10) { c = 12; }
を超単純アセンブリ言語に変換
(コード生成) する
LOAD R1, a
CONST R2, 5
SUB R1, R1, R2
JUMP= R1, if1
LOAD R1, b
CONST R2, 10
SUB R1, R1, R2
JUMP!= R1, else1
if1: CONST R1, 12
STORE c, R1
else1:
再配置可能プログラム
- コンパイラはソースプログラム一つを再配置可能プログラム一つにコンパイルするのが多い
- 例:
.c
や .cpp
ファイルを
.o
や .obj
ファイル
- 主な中身:
- 機械コード
- 定数
- 未定義のシンボルのリスト
- 外部参照可能なシンボルのリスト
- 中身の検証: cygwin などの
nm
コマンド
実行環境
コンパイラと一緒に用意する必要がある
- コマンドラインからの引数の渡し
- 環境変数の渡し
- メモリ管理
- 例外処理
- 入出力など様々なライブラリ
従来の動的メモリの仕組み
- C での動的メモリの仕組み:
- メモリを「生のまま」malloc で用意する
- free で使い終わったメモリをシステムに返す
- C++ での動的メモリの仕組み:
- new で新しいオブジェクトを作る
- delete で使い終わったメモリをシステムに返す
- 問題点:
- 用意するところと返すところが違う
- メモリの返し忘れ (memory leak)
- 対応:
ゴミ集めの仕組み
- 言語は変数などの型を分かるので、動的メモリのどの部分が参照されているか計算は可能
- 参照されなくなった部分は使えないので再利用してよい
- これはゴミ集め (garbage collection) と言う
- 動的メモリを自動的に管理する言語が増えている
(Java, Perl 等々)
- ゴミ集めの利点:
- プログラマはメモリを返さなくて済む。プログラムを書く効率が上がる。
- memory leak がなくなる
- ゴミ集めの問題点:
- ゴミ集めに時間がかかる
(ゴミ集めのために急にプログラムが止まることがある)
ゴミ集めの手法
要点: できるだけ普通の処理と同時に少しづつ進める
- 動的メモリの部分が参照されている数 (reference count)
を記録・更新り、0 になったらゴミとして集める。
- 印掃式 (mark and sweep):
全ての動的メモリの部分に印を付けて、これを最初に
off
にする。静的メモリなどから参照可能な動的メモリの部分の印を
on にする。印が off
になっている部分をゴミとして集める。
- 複写式 (copy):
動的メモリ領域を二つ用意して、参照されている動的メモリの部分をコピーする。
- 利点: 動的メモリの整理
- 問題点: メモリが二倍必要
仮想計算機
- 目的: 移植性の向上、 コンパイラの単純化
- 仕組み:
- (実際存在しない機械の)
機械コードにプログラムをコンパイルする
- このコードを解釈・実行するプログラム (emulator)
を用意する
- 例: Pascal, Java (JVM), Perl, ... の実装
MacIntosh: 680x0 を PowerPC で実装
- 類似物: VMWare, Virtual
PC, wine, cygwin
- 問題点: 機械コードより遅い
(一般的に三倍から十倍)
動的コンパイル
- 目的: 仮想計算機などの効率化
- 仕組み (プログラム実行中):
- よく使われるコード (例えば関数、繰り返し)
の割り出し
- このコードをできるだけ機械の命令に置き換える
- 高度な技法:
- よく使われる引数の値などを割り出し、それ専用のコードの枝分かれを用意する
- 問題点: 高度な技術が必要