言語理論とコン
パイラ
第十二回:
実行環境、仮想計算機、ゴミ集め、動的コンパイラ
http://www.sw.it.aoyama.ac.jp/2005/Language%20Theory%20and%20Compilers/lecture12.html
© 2005 Martin
J. Dürst 青山学院大学
今日の予定
期末試験について
- 7月 29日 (金)、11:10-12:35 (85分)
再配置可能プログラム
- コンパイラはソースプログラム一つを再配置可能プログラム一つにコンパイルするのが多い
- 例: .c や .cpp ファイルを .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 にする。印が on
になってない部分をゴミとして集める。
- 複写式 (copy):
動的メモリ領域を二つ用意して、参照されている動的メモリの部分をコピーする。
- 利点: 動的メモリの整理
- 問題点: メモリが二倍必要
仮想計算機
- 目的: 移植性の向上、 コンパイラの単純化
- 仕組み:
- (実際存在しない機械の)
機械コードにプログラムをコンパイルする
- このコードを解釈・実行するプログラム (emulator)
を用意する
- 例: Pascal, Java (JVM), Perl, ...
MacIntosh: 680x0 を PowerPC で実装
- 類似物: VMWare,
Virtual
PC, wine, cygwin
- 問題点: 機械コードより遅い
(一般的に三倍から十倍)
動的コンパイル
- 目的: 仮想計算機などの効率化
- 仕組み (プログラム実行中):
- よく使われるコード (例えば関数、繰り返し)
の割り出し
- このコードをできるだけ機械の命令に置き換える
- 高度な技法:
- よく使われる引数の値などを割り出して、それ専用のコードの枝分かれを用意する
- 問題点: 高度な技術が必要