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 | |
---|---|
![]() OpenLisp, запущенный в среде Emacs | |
Тип | Компилятор, интерпретатор |
Автор | Кристиан Джулиен |
Написана на | Си и OpenLisp |
Операционная система | Windows, Linux, MacOS, Solaris, HP-UX, AIX, OpenBSD, FreeBSD, NetBSD, PocketPC, QNX, VMS, Z/OS, Cygwin |
Первый выпуск | апрель 1988; 34 года назад (1988-04) |
Аппаратная платформа | x86, x86_64, ia64, sparc, sparcv9, PowerPC, mips, alpha, parisc, ARM, AArch64 |
Последняя версия | 10.3.0 (5 марта 2017; 5 лет назад (2017-03-05)) |
Лицензия | Проприетарное программное обеспечение |
Сайт | eligis.com |
Ядро написано на Си и Лиспе, запускается на большинстве операционных систем. OpenLisp является реализацией стандарта ISLISP, но также содержит ряд расширений, совместимых с Common Lisp (хеш-таблицы, таблицы чтения, пакеты, структуры, последовательности, рациональные числа) и ряд библиотек (сокеты, регулярные выражения, XML, Posix, SQL, LDAP).[6]
OpenLisp включает интерпретатор, предназначенный для интерактивной разработки (REPL), компилятор в Lisp Assembly Program (LAP) и генератор кода, преобразующий LAP в код на языке Си.
Целями создания данного диалекта Лиспа были:
-islisp
.)Исходно язык имел внутреннее имя 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 (требуется инициализировать переменную inferior-lisp-mode
путём к бинарному файлу интерпретатора OpenLisp). LispIDE от DaanSystems имеет встроенную поддержку синтаксиса OpenLisp.
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, который затем переводится генератором кода в Си, который, в свою очередь, может быть откомпилирован любым Си-транслятором целевой платформы.
Год | Версия | Основные изменения |
---|---|---|
1988 | 1.0 | Проект запущен в качестве исследовательского языка под названием MLisp (Minimal Lisp) для экспериментов с идеями из разрабатываемого стандарта ISLISP. В 1988 году основным мотивом была реализация Лиспа для расширения EmACT'а, клона Emacs'а. ISLISP оказался наиболее подходящим выбором. |
1993 | 3.3 | Первый порт на 64-битную архитектуру (DEC Alpha OSF/1). Смена имени на OpenLisp. |
1994 | 4.0 | Первое коммерческое использование. |
1995 | 4.5 | Реализованы поддержка сокетов. |
1997 | 5.7 | OpenLisp стал первой реализацией стандарта ISLISP ISO/IEC 13816:1997(E).[9] |
1998 | 5.8 | Реализована поддержка Unicode. |
2000 | 6.6 | Компилятор в LAP. LAP интерпретируются виртуальной машиной, входящей в состав системы. Быстродействие повышено в два раза. |
2003 | 7.5 | Реализован бэк-энд «Lisp в C». Стала доступна компиляция многофайловых Лисп-программ в исполняемый модуль. Скорость возросла в 10-20 раз. |
2007 | 8.7 | Внесены изменения в связи с выходом нового стандарта ISO/IEC 13816:2007(E) Архивная копия от 30 июля 2016 на Wayback Machine. |
2010 | 9.2 | Реализация целой арифметики с неограниченной точностью. |
2017 | 10.3 | Текущая версия (2017-03-05). |
OpenLisp легко портируем, он может запускаться на множестве операционных систем: Microsoft Windows, большинство систем, основанных на Unix, QNX, MS-DOS, OS/2, Pocket PC, OpenVMS, z/OS. На официальном веб-сайте доступна загрузка более чем 50 различных версий.
OpenLisp может взаимодействовать с модулями, написанными на Си, с использованием FFI, потоки ввода-вывода ISLISP расширены для поддержки сетевых сокетов. Каталог ./net
в развёрнутой системе включает примеры для работы с Http, Json, Pop3, Smtp, Telnet, Rss. Простой XML-ридер может преобразовывать XML в Лисп-списки. Базовый модуль SQL может использоваться для доступа к MySQL, Odbc, SQLite, PostgreSQL. Модуль CSV обеспечивает чтение и запись файлов в формате CSV.
Средства сопровождения разработки включают журналирование, форматирование кода, профайлер, поддержку контрактного программирования и юнит-тестирования.
В каталоге ./contrib
доступны реализации некоторых известных алгоритмов (симплекс-алгоритм, алгоритм Дейкстры, алгоритм Форда-Фалкерсона и другие). Модули предоставляются под лицензией BSD.
В данном разделе описывается последовательность трансформации Лисп-кода в код на Си в OpenLisp.
В качестве примера используется рекурсивная функция fib
, выполняющая вычисление n-го числа Фибоначчи (это классическое определение, используемое во многих бенчмарках, не является наиболее эффективным для реальных вычислений).
(defun fib (n)
(cond ((eq n 1) 1)
((eq n 2) 1)
(t (+ (fib (- n 1)) (fib (- n 2))))))
Компилятор транслирует исходный код на Лиспе в промежуточный код в списочном 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 раз) быстрее в скорости откомпилированных приложений.
![]() | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Характеристики |
| ||||||||||||||
Реализации |
| ||||||||||||||
Аппаратное обеспечение |
| ||||||||||||||
Сообщество |
| ||||||||||||||
|