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