# Глава 10. Система времени выполнения (ocamlrun)

Команда `ocamlrun` выполняет файлы с байткодом, созданные на этапе компоновки командой `ocamlc`.

## 10.1 Обзор

Команда `ocamlrun` состоит из трех основных частей - интерпретатор байткода, который собственно и выполняет файлы с байкодом, система выделения памяти и сборщик мусора; кроме того, в ее состав входит набор функций C для реализации примитивных операция типа ввода/вывода.

`ocamlrun` используется так:

    ocamlrun options bytecode-executable arg1 ... argn

Первый неопциональный аргемент считается именем файла, содержащим исполняемый байткод. (Файл ищется в текущей директории и в пути исполняемых файлов.) Следующие аргументы передаются программе Caml в строком массиве `Sys.argv`. Нулевой элемент в этом массиве содержит имя исполняемого файла, элементы от 1 до n - аргументы от `arg`1 до `arg`n.

Как упоминалось в главе 8, файлы с байткодом уже считаются исполняемыми, поэтому команда `ocamlrun` для них вызывается автоматически. Таким образом, если `caml.out` - исполняемый файл с байткодом, то

    caml.out arg1 ... argn

работает точно так же, как

    ocamlrun caml.out arg1 ... argn

Однако при непосредственном вызове `caml.out` передавать параметры `ocamlrun` невозможно.

Windows:

  Во многих версиях Windows файлы с байкодом считаются исполняемыми только в том случае, если их имя заканчивается на `.exe`. Поэтому файлам с байткодом всегда рекомендуется давать такие имена, то есть компилировать программы как `ocamlc -o myprog.exe ...` , а не `ocamlc -o myprog`.

## 10.2 Параметры

`ocamlrun` принимает следующие параметры командной строки:

-b

  Если программа прерывается из-за непредусмотренного исключения, этот параметр позволяет вывести подробную трассировчную информацию, которая показывает, где возникло исключение, и какие функции не выполнились к моменту завершения. Трассировка выпоняется только в том случае, если исполняемый файл содержал отладочную информацию, то есть был скомпилирован и скомпонован с параметром `-g`. Того же результата помогает добится установка флага `b` в переменной среды `OCAMLRUNPARAM` (см. ниже).

-I dir

  В дополнение к стандартному пути поиска искать динамически загружаемые библиотеки в каталоге dir.

-v

  Менеджер памяти выводит некоторые сообщения о ходе исполнения в стандарный поток сообщений об ошибках. Этот параметр эквивалентен флагу `v=63` в переменной среды `OCAMLRUNPARAM` (см. ниже).

Проверяются также следующие переменные среды:

CAML_LD_LIBRARY_PATH

  Дополнительные каталоги для поиска динамически загружаемых библиотек (см. раздел 10.3).

OCAMLLIB

  Каталог, содержащий стандарную библиотеку Objective Caml (если эта переменная не установлена, будет использоваться `CAMLLIB`). Обычно в нем ищется файл `ld.conf` для конфигурации библиотек динамической загрузки (см. раздел 10.3). Если переменная не установлена, по умолчанию используется каталог, заданный при компиляции Objective Caml.

OCAMLRUNPARAM

  Устанавливает параметры системы времени исполнения, а также сборщика мусора (если эта переменная не установлена, используется `CAMLRUNPARAM`). Перемення должна включать последовательность спецификаций параметров, то есть букву, представляющую паораметр, знак `=`, десятичное число и необязательный множитель. Параметров определено восемь, причем шесть из них соотвествуют полям записи `control`, документированной в модуле `Gc`.

  b

    (трассировка) Переключает вывод трассировки стека в случаях остановки программы из-за непредусмотренного исключения. Этот параметр не принимает аргументов.

  p

    (трассировка синтаксического анализатора) Включает возможность отладки для синтаксических анализаторов, сгененированных `ocamlyacc`. При включении этого параметра автомат с магазинной памятью, исполняющий анализатор, выводит трассировку своих действий. Этот параметр не принимает аргументов.

  s

    (`minor_heap_size`) Размер малой кучи.

  i

    (`major_heap_increment`) Минимальный размер, добавляемый к главной куче.

  o

    (`space_overhead`) Установка скорости основного сборщика мусора.

  O

    (`max_overhead`) Переключение параметра сжатия кучи.

  v

    (`verbose`) Устанавливает, какие сообщения сборщика мусора должны выводится. Значение - сумма следующих значений:

    1 (=0b0000000001)

      Начало главного цикла сборщика мусора.

    2 (=0b0000000010)

      Малая сборка и главный срез сборщика мусора.

    4 (=0b0000000100)

      Рост и уменьшение кучи.

    8 (=0b0000001000)

      Изменение размеров стеков и таблиц менеджера памяти.

    16 (=0b0000010000)

      Сжатие кучи

    32 (=0b0000100000)

      Изменение параметров сборщика мусора

    64 (=0b0001000000)

      Вычисление размера главного среза сборщика мусора.

    128 (=0b0010000000)

      Вызов финализаторов.

    256 (=0b0100000000)

      Сообщения при запуске (загрузка исполняемого файла, поиск библиотек динамеческой загруки).

  I

    (`(stack limit)`) Лимит стека (в словах).

  h

    Начальный размер главной кучи (в словах).

  Множитель может быть `k`, `M` или `G` для умножения на 210, 220 или 230, соответственно. Например, на 32-битной машине, в оболочке `bash` команда

      export OCAMLRUNPARAM='b,s=256k,v=1'

  приведет к тому, что при последующих вызовах `ocamlrun` непредусмотренные исключения будут трассироваться, начальный размер малой кучи будет установлен в 1 мегабайт, а старт каждого главного цикла сборщика мусора будет сопровождаться выводом сообщения.

PATH

  Список каталогов для поиска исполняемых файлов с байткодом.

## 10.3 Динамическая загрузка библиотек

На платформах, поддерживающих динамическую загрузку, `ocamlrun` может динамически компоновать с разделяемыми библиотеками С (DLL), дополняя примитивы, доступные стандартной системе времени выполнения новыми функциями С. Имена таких библиотек указываются во время компоновки (см. раздел 18.1.14) и записываются в исполняемом файле с байткодом. Затем `ocamlrun` находит их и разрешает ссылки на соответствующе примитивы при старте программы.

Команда `ocamlrun` ищет разделяемые библиотеки в следующем порядке:

- В каталогах, указанных в командной строке `ocamlrun` параметром `-I`.

- В каталогах, перечисленных в переменной среды `CAML_LD_LIBRARY_PATH`.

- В каталогах, заданных параметром `-dllpath` во время компоновки `ocamlc` (каталоги в этом случае записываются в исполняемом файле).

- В каталогах, записанных в файле `ld.conf`. Он находится в каталоге стандартной библиотеки Objective Caml и состоит из списка каталогов поиска (по одному на строку). Обычно он содержит всего одну строку - `stublibs` - подкаталог стандартной библиотеки Objective Caml. Поользоватли могут добавлять свои записи, ссылающиеся на каталоги с часто используемыми разделяемыми библиотеками, однако ради целостности инсталляции такие библиотеки все же лучше просто помещать непосредственно в каталог `stublibs`.

- В каталогах по умолчанию для системного динамического загрузчика. В среде Unix это обычно `/lib`, `/usr/lib`, каталоги, перечисленные в файле `/etc/ld.so.conf` и переменной среды `LD_LIBRARY_CONF`, под Windows - системные каталоги и каталоги, записанные в переменной среды `PATH`.

## 10.4 Распространенные ошибки

В этом разделе описывются наиболее распространенные сообщения об ошибках.

filename: no such file or directory

  Если filename - имя исполняемого файла, это сообщение означает, что либо файл не существует, либо он не может вызвать интерпретатор байткода `ocamlrun`. Во втором случае Objective Caml скорее всего установлен неправильно.

Cannot exec ocamlrun

  (При запуске исполняемого файла с байткодом). Команда `ocamlrun` не найдена в списке каталогов с исполняемыми файлам. Проверьте правильность установки Objective Caml.

Cannot find 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..`, но размер кучи растет медленно, скорее всего, предпринята попытка создать структуру данных со слишком большим (бесконечно большим?) количеством ячеек. Если же теких сообщений мало, но куча увеличивается на большие значения, то программа пытается построить громоздкий массив или строку.