Глава
1
Глава
2
Глава
3
Глава
4
Глава
5
Глава
6
Глава
7
Глава
8
Глава
9  navigation 
Глава
11
Глава
12
Глава
13
Глава
14 

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

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

10 . 1 Обзор

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

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

ocamlrun options bytecode-executable arg1 ... argn

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

Как упоминалось в главе 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 ищет разделяемые библиотеки в следующем порядке:

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