言語理論とコンパイラ
第十三回:
実行環境、仮想計算機、ゴミ集め、動的コンパイラ
2011 年 7 月 8 日
http://www.sw.it.aoyama.ac.jp/2011/Compiler/lecture13.html
Martin J. Dürst
© 2005-11 Martin
J. Dürst 青山学院大学
今日の予定
- 平常試験
- 実行環境
- ゴミ集め
- 仮想計算機
- 動的コンパイル
再配置可能プログラム
- コンパイラはソースプログラム一つを再配置可能プログラム一つにコンパイルするのが多い
- 例:
.o
ファイル (Unix/Linux) や .obj
ファイル (Windows)
- 主な中身:
- 機械コード
- 定数
- 未定義のシンボルのリスト
- 外部参照可能なシンボルのリスト
- アドレスの修正が必要な個所のリスト
- 中身の検証: cygwin などの
nm
コマンド
実行環境
コンパイラと一緒に用意が必要
- コマンドラインからの引数渡し
- 環境変数の渡し
- メモリ管理
- 例外処理
- 入出力など様々なライブラリ
従来の動的メモリの仕組み
- C の動的メモリの仕組:
- 「なま」のメモリ
malloc
で用意
- 使用完了後
free
でシステムに返却
- C++ の動的メモリの仕組:
new
で新しいオブジェクトを作成
- 使用完了後
delete
でシステムに返却
- 問題点:
- 用意する場所と返す場所がの相違
- メモリの返却忘れ (memory leak) や早期返却
- 対応:
ゴミ集めの仕組み
- プログラム言語で変数などの型が決定
- 動的メモリにて参照される部分が計算可能
- 参照されない部分は使用不可能のため、再利用可能
- これはゴミ集め (garbage collection) と言う
- 現在、動的メモリを自動的に管理する言語が主流 (Java,
Perl, Ruby など)
- ゴミ集めの利点:
- プログラマはメモリ管理に気を取られる必要がない
- プログラム作成の効率が向上
- memory leak などが撲滅
- ゴミ集めの問題点:
- ゴミ集めに時間がかかる
(ゴミ集めのために急にプログラムが止まることがある)
ゴミ集めの手法
要点: できるだけ普通の処理と同時に少しづつ進める
- 動的メモリの部分が参照されている数 (reference count)
を記録・更新、0 になったらゴミとして回収
- 印掃式 (mark and sweep):
全ての動的メモリの部分に印を付けて、これを最初に
off
にする。静的メモリなどから参照可能な動的メモリの部分の印を
on にする。印が off
になっている部分をゴミとして集める。
- 複写式 (copy):
動的メモリ領域を二つ用意し、参照されている動的メモリだけをコピー
- 利点: 動的メモリの整理
- 問題点: メモリが二倍必要
仮想計算機
- 目的: 移植性の向上、 コンパイラの単純化
- 仕組み:
- (実際存在しない機械の)
機械コードにプログラムをコンパイルする
- このコードを解釈・実行するプログラム (emulator)
を用意する
- 例: Pascal, Java (JVM: Java Virtual Machine), Perl, Ruby 1.9, ...
の実装
MacIntosh: 680x0 を PowerPC で実装、PowerPC を i386 系で実装
- 問題点: 機械コードより遅い
(一般的に三倍から十倍)
- 類似物: cygwin, wine, VMWare, Virtual
PC, VirtualBox,...
動的コンパイル
- 目的: 仮想計算機などの効率化
- 仕組み (プログラム実行中):
- よく使われるコード (例えば関数、繰り返し)
の割り出し
- このコードをできるだけ機械の命令に置き換える
- 高度な技法:
- よく使われる引数の値などを割り出し、それ専用のコードの枝分かれを用意
- 問題点: 高度な技術が必要
まとめ
- プログラムでは出力より入力が大変
- 入力は言語理論でモデル化可能
- コンパイラでは字句解析と構文解析に言語理論を使用
- 言語理論や字句解析・構文解析の知識はコンパイラ以外にも応用が多数
- プログラム言語の設計と実装がまだまだ進行中