Chapter 10 ランタイムシステム (ocamlrun)
このページは最後に更新されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
last mod. 2008-10-01 (水) 12:07:22
The Objective Caml system release 3.10
ocamlrun コマンドは ocamlc コマンドのリンクで生成されたバイトコードファイルを実行します。
Overview
ocamlrun コマンドは、実際にバイトコードファイルを実行するバイトコードインタプリタ、メモリ割り当てとガベージコレクタ、入力力のようなプリミティブ処理の実装を行う C 関数の集合、の 3 つの部分から構成されます。
ocamlrun の使い方は以下のようになります。
ocamlrun options bytecode-executable arg1 ... argn
8 章で解説しているように、ocamlc が生成するバイトコード実行ファイルはそれ自体実行可能になっていて、自動的に ocamlrun を起動して自分を実行させようとします。つまり、caml.out をバイトコード実行ファイルとすると、
caml.out arg1 ... argn
は以下と全く同じように動作します。
ocamlrun caml.out arg1 ... argn
caml.out を直接起動した場合は、ocamlrun にオプションを渡せないことに注意してください。
Windows:
Windows のバージョンによっては、バイトコード実行ファイルの名前が .exe で終わっていないと実行不可能になります。バイトコード実行ファイルには .exe 付きの名前を与えるようにすることを推奨します。ocamlc -o myprog ... ではなく ocamlc -o myprog.exe ... としてコンパイルしてください。
Options
ocamlrun に認識されるコマンドラインオプションは以下の通りです。
- -b
- プログラムがキャッチされない例外で異常終了するとき、例外の詳細な「バックトレース」を表示します。どこで例外が発生して、どの関数から飛び出したかがわかります。バックトレースはバイトコード実行ファイルがデバッグ情報がついているときのみ表示されます (つまり ocamlc に -g オプション付きでコンパイル、リンクされているとき) 。このオプションは環境変数 OCAMLRUNPARAM (後述) に b フラグをセットするのと同値です。
- -I dir
- 動的にロードするライブラリを検索しにいく標準検索パスに、与えられたディレクトリを追加します (セクション 10.3 を見てください) 。
- -v
- メモリ管理機構が進捗メッセージを標準エラー出力へ表示するようになります。環境変数 OCAMLRUNPARAM (後述) に v=63 を設定するのと同値です。
- -version
- バージョンを表示して終了します。
以下の環境変数も参照します。
- CAML_LD_LIBRARY_PATH
- 動的ロードライブラリの検索パスに追加します (セクション 10.3 を見てください) 。
- OCAMLLIB
- Objective Caml 標準ライブラリのあるディレクトリです (OCAMLLIB が設定されていなかったら代わりに CAMLLIB を使用します) 。動的ロードの設定ファイル ld.conf の位置を特定するために使用します (セクション 10.3 を見てください) 。設定されていなかったら、Objective Caml のコンパイル時に指定したデフォルトの標準ライブラリパスを使用します。
- OCAMLRUNPARAM
- ランタイムシステムのオプションやガベージコレクションのパラメータを設定します (OCAMLRUNPARAM が設定されていなかったら代わりに CAMLRUNPARAM を使用します) 。この環境変数はパラメータ指定の列にしてください。パラメータ指定はオプション文字に続いて = 記号、10 進数字、マルチプライヤ (これはなくてもよい) となります。9 個のオプションがあり、そのうち 6 個が Module Gc で説明されている control レコードのフィールドに対応します。
- b
- (バックトレース) キャッチされない例外でプログラムが異常終了するとき、バックトレーススタックを表示します。このオプションは引数をとりません。
- p
- (構文解析器トレース) ocamlyacc で生成した構文解析器のデバッグ補助を有効にします。このオプションが有効ならば、構文解析を行うプッシュダウンオートマトンがそのアクションをトレースするようになります。このオプションは引数をとりません。
- s
- (minor_heap_size) マイナーヒープのサイズ。
- i
- (major_heap_increment) メジャーヒープのメモリ増加量の最小サイズ。
- o
- (space_overhead) メジャー GC の速度設定。
- O
- (max_overhead) ヒープ圧縮の頻度設定。
- v
- (verbose) GC が何のメッセージを標準エラー出力に表示するか設定します。これには以下から選択してその和を指定します。
- 1 (= 0b0000000001)
- メジャーGCの開始.
- 2 (= 0b0000000010)
- マイナーコレクションとメジャーGCのスライス。
- 4 (= 0b0000000100)
- ヒープの増減。
- 8 (= 0b0000001000)
- スタックとメモリマネージャーテーブルのリサイズ。
- 16 (= 0b0000010000)
- ヒープ圧縮。
- 32 (= 0b0000100000)
- GCパラメータの変更。
- 64 (= 0b0001000000)
- メジャーGCスライスのサイズ計算
- 128 (= 0b0010000000)
- ファイナライズ関数の呼び出し時
- 256 (= 0b0100000000)
- スタートアップメッセージ。(バイトコードが読み込まれ、共有ライブラリが解決された時)
- l
- (stack_limit) スタックサイズの制限 (ワード単位) 。
- h
メジャーヒープの初期サイズ (ワード単位) 。
マルチプライヤは k 、M 、G のいずれかです。それぞれ 210 倍、220 倍、230 倍になります。たとえば 32 ビットマシンで、bash で以下のコマンド
export OCAMLRUNPARAM='b,s=256k,v=1'
を実行したあと ocamlrun を実行すると、キャッチされない例外でバックトレースを表示して、マイナーヒープの初期サイズを 1 メガバイトに設定して、メジャー GC サイクルが開始するたびにメッセージが表示されるようになります。
- CAMLRUNPARAM
- OCAMLRUNPARAMが見つからない場合、CAMLRUNPARAMが代わりに用いられます。CAMLRUNPARAMも見つからない場合は、デフォルト値が用いられます。
- PATH
- バイトコード実行ファイルを検索するディレクトリのリストです。
Dynamic loading of shared libraries
動的ロードをサポートするプラットフォーム上では、ocamlrunは標準的なランタイムシステム以外にも、Cプリミティブを提供しているC共有ライブラリ(DLLなど)を動的にリンクすることができます。
これらのライブラリの名前は、18.1.4で述べたようにリンク時に提供され、バイトコード内に記録されます。
ocamlrunはバイトコードを実行する際に、これらのこれらライブラリを探し、Cプリミティブへの参照を解決します。
ocamlrunは共有ライブラリを、以下のディレクトリを上から順に探します。
- ocamlrunに-Iオプションで渡されたディレクトリ
- CAML_LD_LIBRARY_PATH環境変数で指定されたディレクトリvariable.
- リンク時にocamlcに-dllpathオプションで渡されたディレクトリ。(このディレクトリは、バイトコード実行ファイルに記録されます)
- ld.confファイルで指定されたディレクトリ.
このファイルは、Objective Camlの標準ディレクトリに置かれ、一行に一つのディレクトリが書かれています。通常は、Objective Camlの標準ライブラリのディレクトリのみがかかれています。ユーザは、よく使用するライブラリを含んだディレクトリを追加することができます。しかし、インストールを簡潔にするために、共有ライブラリはシステムのstublibディレクトリにインストールすることを薦めます。
- システムの動的ローダのデフォルトディレクトリ。Unixでは一般的に、/libと/usr/lib、/etc/ld.so.confに書かれたディレクトリ、LD_LIBRARY_PATH環境変数で指定されたディレクトリなどです。
Windowsでは、システムディレクトリとPATH環境変数に書かれたディレクトリです。
Common errors
このセクションではよく出るエラーメッセージを解説します。
- filename: no such file or directory
- filename が実行可能なバイトコードファイルの名前ならば、これはそのファイルが存在しないか、ocamlrun バイトコードインタプリタの起動に失敗したことを意味します。後者の場合は、Objective Caml がシステムにきちんとインストールできていない可能性があります。
- Cannot exec ocamlrun
- (実行可能なバイトコードファイルを起動したとき) ocamlrun が実行可能パスから見つかりませんでした。Objective Caml がシステムにきちんとインストールされているかチェックしてください。
- Cannot find the bytecode file
- ocamlrun が実行しようとしたファイル (オプションを除いて最初の引数のファイル名) が見つからなかったか、不正な実行可能バイトコード実行ファイルでした。
- Truncated bytecode file
- ocamlrun が実行しようとしたファイルは不正な実行可能バイトコード実行ファイルでした。おそらく作成後に何かあって壊れてしまっています。消して再度生成し直してください。
- Uncaught exception
- 実行していたファイルが「迷子」の例外を発生しました。つまり、どこかで発生した例外がどこにもキャッチされませんでした。例外の名前が表示されます。例外の引数が文字列か整数ならそれも表示します (それより複雑な型の引数は正常に表示されません) 。キャッチされない例外の位置を特定するためには、プログラムを -g オプション付きでコンパイルして、ocamldebug デバッガで再度実行するか (16 章を見てください) 、ocamlrun -b で実行するか、環境変数 OCAMLRUNPARAM に b=1 をセットして実行するかしてください。
- Out of memory
- 実行していたプログラムが利用可能量を超えたメモリを要求しました。プログラムが非常に大きなデータ構造を構築したか、関数呼び出しをネストしすぎてスタックオーバーフローしたかです。プログラムに間違いはなく、単にマシンにあるメモリより多くのメモリを要求しただけの場合もありますが、停止しない再帰呼び出しや、非常に大きな配列や文字列の確保、無限リストなどのデータ構造の構築などなど、プログラムに間違いがある場合もあります。
このエラーの原因を突き止めるためには、ocamlrun を -v オプション付きで実行してください (または環境変数 OCAMLRUNPARAM に v=63 をセットして) 。Growing stack... メッセージが大量に表示されていたら、再帰関数がループしている可能性があります。Growing heap... メッセージが大量に表示されていて、ヒープサイズがゆっくり増えていたら、セルの数が多すぎる (無限に多い?) データ構造を構築しようとしている可能性があります。Growing heap... メッセージが大量に表示されていて、ヒープサイズがどんどん増えていたら、非常に大きな配列や文字列を確保しようとしている可能性があります。