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