r7 - 21 Jan 2007 - 01:56:06 - Anton OrlovYou are here: TWiki >  Refaldevel Web > UserInterface

rfp.sh — скрипт для быстрой компиляции программ без сложных зависимостей

Скрипт rfp.sh последовательно выполняет все стадии компиляции и линковку поданых ему аргументов. В случае успешного выполнения всех этапов создаётся исполняемый файл.

Таким образом, по функциональности скрипт rfp.sh эквивалентен программе rfp (версий <= 1.8.7).

Usage: rfp.sh [options] [files]

Файлы:

  • вида *.rf и *.rfi передаются для обработки компилятору Refal+ --> C++
  • вида *.cc передаются для обработки компилятору C++
  • остальные файлы (а также файлы, полученные в результате работы программ из предыдущих пунктов) передаются линкеру

Опции:

  • -o <name>   задаёт имя результатного исполняемого файла
  • -R <opt>   передаёт опцию <opt> компилятору Refal+ --> C++
  • -C <opt>   передаёт опцию <opt> компилятору C++

На работу скрипта также можно повлиять, передав ему параметры через переменные окружения:

  • rfpc — компилятор Refal+ --> C++ (по умолчанию refal/compiler/rfpc)
  • rflags — параметры компилятора Refal+ --> C++
  • cxx — компилятор C++ (по умолчанию g++)
  • cflags — параметры компилятора C++
  • ldflags — параметры линкера
  • ldlibs — дополнительные библиотеки для линковки

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

Пример (для bash):

  • $ rfp.sh a.rf b.rf c.rf
    скомпилировать программу, состоящую из трёх модулей, результат назвать a
  • $ export cflags=-O3
  • $ rfp.sh -o d a.rf b.cc c.o
    из a.rf получить a.cc, скомпилировать a.cc и b.cc, используя оптимизацию (-O3), результаты слинковать с c.o, полученный исполняемый файл назвать d
  • $ rflags='-u -v' rfp.sh -C -O0 a.rf b.rf c.rf
    при компиляции рефал-файлов переводить слова без кавычек в верхний регистр и печатать информацию о текущих этапах компиляции, при компиляции полученных С++-программ не использовать оптимизацию (перекрывает -O3 из $cflags)

rfpc — компилятор Refal+ --> АС(Р+)? --> АИЯ --> C++

Usage: rfpc [options] file1 [file2 ...]
Options:
 -I, -ipath <dir>            add <dir> to the list of directories to be searched
                             for .rfi files
 -nc, -no-check              don't perform syntax check
 -nt, -no-transform          don't perform AS-to-AS transformations
 -c, -check                  check only, causes no file creation in the absence
                             of other output control options
 -no, -no-optim              don't perform ASAIL-optimization
 -ci, -comp-item <item>      compile <item> only, not the whole source
                             (may be used several times)
 -v, -verbose                display information about the stages of compilation
 -u                          convert all symbol-words without surrounding quotes
                             to upper case
 -o <name| - >               place outputs for file1 into files <name>.* or send
                             them to stdout
 -cc                         output C++ code
 -hh                         generate header files
 -asr, -as-refal             output Refal Abstract Syntax
 -ast, -as-transformed       output Refal Abstract Syntax after AS-to-AS
                             transformations
 -asi, -as-ail               output Abstract Syntax of Abstract Imperative
                             Language
 -int <class_name>           class to use for literal integers
 -replace-module <m1> <m2>   use module <m2> instead of <m1>

Запуск скомпилированной программы

Программа, скомпилированная с помощью rfpc, линкуется с ситемой поддержки периода исполнения (RTS). RTS обеспечивает понимание программой нескольких стандартных опций, с помощью которых можно контролировать размер и расположение в памяти машины хипа, используемого для хранения рефал-выражений, и стека, используемого для хранения аргументов при вызовах рефал-функций.

Интерфейс к опциям RTS сделан анлогично используемому в Glasgow Haskell Compiler (см. http://haskell.org/ghc/docs/latest/html/users_guide/runtime-control.html).

При старте программы, RTS извлекает из командной строки все опции, заключённые между +RTS и -RTS, и самостоятельно обрабатывает их. Если после опций RTS нет опций, предназначенных для обработки в программе, то заключительную -RTS можно не ставить. Cпециальная опция --RTS сообщает о том, что все далее идущие опции командной строки предназначены для обработки в программе (а не для RTS).

Функция Arg библиотеки Dos работает так, будто бы в командной строке не было опций +RTS...-RTS и --RTS.

Опции RTS:

  • -heap_size <size>   задаёт размер хипа в байтах. По умолчанию 32 Mb.
  • -heap_start <address>   задаёт стартовый адрес хипа. По умолчанию выбирается ситемой автоматически.
  • -stack_size <size>   задаёт размер стека в байтах. По умолчанию 16 Mb.
  • -stack_start <address>   задаёт стартовый адрес стека. По умолчанию выбирается ситемой автоматически.

    size округляется в большую сторону до степени двойки.
    address выравнивается в меньшую сторону по размеру страницы памяти.

Пример:

  • rfpc -o - +RTS -heap_size 4000000 -heap_start 0x50000000 -RTS rfpc.rf +RTS -stack_size 100000
    Скомпилировать rfpc.rf, выдав результат на экран, используя при этом не более 100 Kb стека и не более 4 Mb хипа, расположив последний по адресу 0x50000000.

Если в некоторый момент программе перестанет хватать отведённого пространства под хип, она прекратит совю работу и выдаст сообщение "Heap exhausted". Аналогично, если заполнится весь стек, будет выдано сообщение "Stack exhausted".

Если система не сможет зарезервировать запрашиваемое количество памяти, программа прекратит работу с соответствующим сообщением об ошибке. В этом случае следует попробовать уменьшить значения -heap_size и -stack_size. В качестве ориентировочных значений: для обработки своего собственного исходного кода, rfpc требуется 8 Mb хипа и 100 Kb стека.

ALERT! Будьте осторожны с опциями -heap_start и -stack_start! Их неверное использование может привести к непредсказуемым последствиям.

ToDo Считывание опций RTS из переменной окружения.

ToDo Задание дефолтных значений опций RTS для каждой конкретной программы, например, с помощью специальных прагм в тексте.

Edit | WYSIWYG | Attach | Printable | Raw View | Backlinks: Web, All Webs | History: r7 < r6 < r5 < r4 < r3 | More topic actions
 
R+

This site is powered by the TWiki collaboration platformCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback