Previous Contents Next
Chapter 10 The runtime system (ocamlrun)

ocamlrun コマンドは ocamlc コマンドのリンクで生成されたバイトコードファイルを実行します。

10.1 Overview

ocamlrun コマンドは、実際にバイトコードファイルを実行するバイトコードインタプリタ、メモリ割り当てとガベージコレクタ、入力力のようなプリミティブ処理の実装を行う C 関数の集合、の 3 つの部分から構成されます。

ocamlrun の使い方は以下のようになります。
        ocamlrun options bytecode-executable arg1 ... argn
オプションを除いた最初の引数が実行するバイトコードのファイル名と認識されます (カレントディレクトリと実行可能パスからこのファイルを検索します) 。それ以降の引数は Caml プログラムに文字列配列 Sys.argv として渡されます。この配列の 0 番目の要素はバイトコード実行ファイルの名前です。1 番目から n 番目までの要素が以降の引数 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 ... としてコンパイルしてください。
10.2 Options

ocamlrun に認識されるコマンドラインオプションは以下の通りです。
-b
プログラムがキャッチされない例外で異常終了するとき、例外の詳細な「バックトレース」を表示します。どこで例外が発生して、どの関数から飛び出したかがわかります。バックトレースはバイトコード実行ファイルがデバッグ情報がついているときのみ表示されます (つまり ocamlc-g オプション付きでコンパイル、リンクされているとき) 。このオプションは環境変数 OCAMLRUNPARAM (後述) に b フラグをセットするのと同値です。
-I dir
動的にロードするライブラリを検索しにいく標準検索パスに、与えられたディレクトリを追加します (セクション 10.3 を見てください) 。
-v
メモリ管理機構が進捗メッセージを標準エラー出力へ表示するようになります。環境変数 OCAMLRUNPARAM (後述) に v=63 を設定するのと同値です。
以下の環境変数も参照します。
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)
Start of major GC cycle.
2 (= 0b0000000010)
Minor collection and major GC slice.
4 (= 0b0000000100)
Growing and shrinking of the heap.
8 (= 0b0000001000)
Resizing of stacks and memory manager tables.
16 (= 0b0000010000)
Heap compaction.
32 (= 0b0000100000)
Change of GC parameters.
64 (= 0b0001000000)
Computation of major GC slice size.
128 (= 0b0010000000)
Calling of finalization functions
256 (= 0b0100000000)
Startup messages (loading the bytecode executable file, resolving shared libraries).
l
(stack_limit) スタックサイズの制限 (ワード単位) 。
h
メジャーヒープの初期サイズ (ワード単位) 。
マルチプライヤは kMG のいずれかです。それぞれ 210 倍、220 倍、230 倍になります。たとえば 32 ビットマシンで、bash で以下のコマンド
        export OCAMLRUNPARAM='b,s=256k,v=1'
を実行したあと ocamlrun を実行すると、キャッチされない例外でバックトレースを表示して、マイナーヒープの初期サイズを 1 メガバイトに設定して、メジャー GC サイクルが開始するたびにメッセージが表示されるようになります。

PATH
バイトコード実行ファイルを検索するディレクトリのリストです。
10.3 Dynamic loading of shared libraries

On platforms that support dynamic loading, ocamlrun can link dynamically with C shared libraries (DLLs) providing additional C primitives beyond those provided by the standard runtime system. The names for these libraries are provided at link time as described in section 18.1.4), and recorded in the bytecode executable file; ocamlrun, then, locates these libraries and resolves references to their primitives when the bytecode executable program starts.

The ocamlrun command searches shared libraries in the following directories, in the order indicated:
  1. Directories specified on the ocamlrun command line with the -I option.
  2. Directories specified in the CAML_LD_LIBRARY_PATH environment variable.
  3. Directories specified at link-time via the -dllpath option to ocamlc. (These directories are recorded in the bytecode executable file.)
  4. Directories specified in the file ld.conf. This file resides in the Objective Caml standard library directory, and lists directory names (one per line) to be searched. Typically, it contains only one line naming the stublibs subdirectory of the Objective Caml standard library directory. Users can add there the names of other directories containing frequently-used shared libraries; however, for consistency of installation, we recommend that shared libraries are installed directly in the system stublibs directory, rather than adding lines to the ld.conf file.
  5. Default directories searched by the system dynamic loader. Under Unix, these generally include /lib and /usr/lib, plus the directories listed in the file /etc/ld.so.conf and the environment variable LD_LIBRARY_PATH. Under Windows, these include the Windows system directories, plus the directories listed in the PATH environment variable.
10.4 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 で実行するか、環境変数 OCAMLRUNPARAMb=1 をセットして実行するかしてください。

Out of memory
実行していたプログラムが利用可能量を超えたメモリを要求しました。プログラムが非常に大きなデータ構造を構築したか、関数呼び出しをネストしすぎてスタックオーバーフローしたかです。プログラムに間違いはなく、単にマシンにあるメモリより多くのメモリを要求しただけの場合もありますが、停止しない再帰呼び出しや、非常に大きな配列や文字列の確保、無限リストなどのデータ構造の構築などなど、プログラムに間違いがある場合もあります。

このエラーの原因を突き止めるためには、ocamlrun-v オプション付きで実行してください (または環境変数 OCAMLRUNPARAMv=63 をセットして) 。``Growing stack...'' メッセージが大量に表示されていたら、再帰関数がループしている可能性があります。``Growing heap...'' メッセージが大量に表示されていて、ヒープサイズがゆっくり増えていたら、セルの数が多すぎる (無限に多い?) データ構造を構築しようとしている可能性があります。``Growing heap...'' メッセージが大量に表示されていて、ヒープサイズがどんどん増えていたら、非常に大きな配列や文字列を確保しようとしている可能性があります。

Previous Contents Next