OpenLisp
OpenLisp — язык программирования из семейства языков Лисп, разработанный Кристианом Джулиеном.[1] Он соответствует[2][3][4] стандарту ISO ISLISP (Стандарт ISO/IEC 13816:1997(E) Архивная копия от 10 апреля 2016 на Wayback Machine[5] переработан ISO/IEC 13816:2007(E) Архивная копия от 30 июля 2016 на Wayback Machine, опубликован ISO). Ядро написано на Си и Лиспе, запускается на большинстве операционных систем. OpenLisp является реализацией стандарта ISLISP, но также содержит ряд расширений, совместимых с Common Lisp (хеш-таблицы, таблицы чтения, пакеты, структуры, последовательности, рациональные числа) и ряд библиотек (сокеты, регулярные выражения, XML, Posix, SQL, LDAP).[6] OpenLisp включает интерпретатор, предназначенный для интерактивной разработки (REPL), компилятор в Lisp Assembly Program (LAP) и генератор кода, преобразующий LAP в код на языке Си. Цели разработкиЦелями создания данного диалекта Лиспа были:
Название диалектаИсходно язык имел внутреннее имя MLisp. В 1993 году это имя было заменено на OpenLisp, так как оказалось, что MLisp уже используется в Gosling Emacs. В начале 1990-х слово «open» («открытый») в приложении к информационным технологиям чаще применялось для обозначения систем, которые реализуют открытые спецификации на интерфейсы, сервисы и форматы данных, что позволяет без искусственных ограничений использовать эти системы, создавать совместимое и/или взаимодействующее с ними ПО (именно в этом смысле термин используется в определении «открытой компьютерной системы»). Такому пониманию «открытости» вполне соответствуют цели разработки OpenLisp (см. выше), как и то, что он реализует стандарт ISLISP.[7] Таким образом, название языка призвано символизировать его открытость для использования, но не имеет отношения ни к Open Source Initiative, ни к свободному программному обеспечению вообще. Среда OpenLisp всегда выпускалась и продолжает выпускаться под проприетарной лицензией. Часть исходных текстов является закрытой. Язык OpenLisp не следует путать с проектом OpenLISP, запущенным в 1997 году для реализации Locator/Identifier Separation Protocol. Лицензия и условия распространенияOpenLisp представляет собой проприетарное программное обеспечение. Интерпретатор доступен бесплатно для некоммерческого использования. Часть исходных текстов системы доступна под свободными лицензиями (GNU GPL, BSD) или является общественным достоянием. Отдельно лицензированы и предоставляются за отдельную плату исходные тексты, необходимые для встраивания OpenLisp в системы, написанные на C/C++. Интерфейс пользователяИнтерпретатор OpenLisp исходно запускается в консольном режиме (в Cmd в Microsoft Windows или из-под эмулятора терминала в Unix-подобных системах). ;; OpenLisp v9.x.y (Build: XXXX) by C. Jullien [Jan 01 20xx - 10:49:13]
;; Copyright (c) Eligis - 1988-20xx.
;; System 'sysname' (64bit, 8 CPU) on 'hostname', ASCII.
;; God thank you, OpenLisp is back again!
? (fib 20)
;; elapsed time = 0.003s, (0 gc).
= 6765
? _
Также возможен запуск REPL под Emacs (требуется инициализировать переменную Детали реализацииМенеджер памятиOpenLisp использует механизм виртуальной памяти для автоматического размещения и модификации памяти объектов. Небольшие однотипные объекты размещаются с помощью технологии BIBOP (BIg Bag Of Pages). Для размещения больших объектов используются прокси-объекты, которые указывают на реальный объект в куче Lisp. Консервативный сборщик мусора использует методику «mark and sweep» и может быть настроен на поддержку многопоточности. Типы данныхOpenLisp использует тэговую архитектуру (4-битный тег на 32-битном, 5-битный тег на 64-битном слове) для быстрой проверки типов (small integer, float, symbol, cons, string, vector). Короткие целые (28 бит на 32-битном, 59 бит на 64-битном слове) хранятся неупакованными, длинные целые (32 бит / 64 бит) — упакованными. В соответствии с требованиями ISLISP также реализованы bignums. Символы (и, следовательно, строки) могут быть либо 8-битными (ANSI, EBCDIC), либо 16/32-битными, если включена поддержка Unicode. Интерпретатор и компиляторЯдро, интерпретатор и базовые библиотеки написаны вручную на Си. Компилятор преобразует исходный текст в промежуточный язык LAP, который затем переводится генератором кода в Си, который, в свою очередь, может быть откомпилирован любым Си-транслятором целевой платформы. История
ПортированиеOpenLisp легко портируем, он может запускаться на множестве операционных систем: Microsoft Windows, большинство систем, основанных на Unix, QNX, MS-DOS, OS/2, Pocket PC, OpenVMS, z/OS. На официальном веб-сайте доступна загрузка более чем 50 различных версий. Стандартные библиотекиВвод-вывод и взаимодействие с другим ПОOpenLisp может взаимодействовать с модулями, написанными на Си, с использованием FFI, потоки ввода-вывода ISLISP расширены для поддержки сетевых сокетов. Каталог Инструменты разработчикаСредства сопровождения разработки включают журналирование, форматирование кода, профайлер, поддержку контрактного программирования и юнит-тестирования. АлгоритмыВ каталоге КомпиляцияВ данном разделе описывается последовательность трансформации Лисп-кода в код на Си в OpenLisp. Исходный кодВ качестве примера используется рекурсивная функция (defun fib (n)
(cond ((eq n 1) 1)
((eq n 2) 1)
(t (+ (fib (- n 1)) (fib (- n 2))))))
LAPКомпилятор транслирует исходный код на Лиспе в промежуточный код в списочном LAP-формате, который подвергается локальной оптимизации (англ. peephole optimization). После оптимизации результирующий LAP-код выглядит так: ((fentry fib 1 0 0)
(param 0)
(jeq _l004 '1)
(jneq _l003 '2)
(move a1 '1)
(return)
_l003
(gsub1 a1)
(recurse 1)
(move a2 a1)
(param 0)
(gsub a1 '2)
(recurse 1)
(gadd a2 a1)
_l004
(return)
(end))
Генерация кода на СиНаконец, генератор кода преобразует LAP-код в инструкции на Си. static POINTER
OLDEFCOMPILED1( olfib_00, p1 )
{
POINTER a1;
POINTER VOLATILE a2;
ollapenter( SN_OLFIB_00 );
a1 = p1;
if( eq( a1, olmakefix( 1 ) ) ) goto _l004;
if( !eq( a1, olmakefix( 2 ) ) ) goto _l003;
ollapleave( SN_OLFIB_00 );
return( olmakefix( 1 ) );
_l003:
a1 = ollapgsub( a1, olmakefix( 1 ) );
a2 = olfib_00( a1 );
a1 = ollapgsub( p1, olmakefix( 2 ) );
a1 = olfib_00( a1 );
a1 = ollapgadd( a2, a1 );
_l004:
ollapleave( SN_OLFIB_00 );
return( a1 );
}
Вышеприведённый фрагмент содержит только сам сгенерированный Си-код. Для получения исполняемого файла данный код должен быть внедрён в соответствующее окружение и откомпилирован с библиотеками, входящими в состав среды OpenLisp. БыстродействиеСогласно данным на странице автора системы Архивная копия от 27 февраля 2021 на Wayback Machine (впрочем, устаревшим — приведённые материалы относятся к версии 7.9, тогда как актуальная версия на 2018 год — 10.3), в сравнении с двумя другими реализациями ISLISP OpenLisp находится на одном уровне или несколько быстрее в режиме интерпретации и значительно (в 10-20 раз) быстрее в скорости откомпилированных приложений. Применение
Примечания
Ссылки
|