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 | |
---|---|
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 системы. (Строгое соответствие спецификации ISLISP ISO/IEC 13816:2007(E) обеспечивается запуском интерпретатора с ключом
-islisp
.) - Создание встраиваемой Лисп-системы, взаимодействующей с кодом на Си/C++ и Java. Взаимодействие с кодом на Java поддерживается через Java Native Interface. Callback-механизм позволяет организовать двунаправленное взаимодействие с внешними программами.
- Пригодность для использования в качестве скриптового языка.
- Возможность генерации полноценных исполняемых модулей для целевой платформы.
Название диалектаПравить
Исходно язык имел внутреннее имя 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Править
Компилятор транслирует исходный код на Лиспе в промежуточный код в списочном 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 раз) быстрее в скорости откомпилированных приложений.
ПрименениеПравить
- Некоммерческой организацией SDF (известной также как freeshell.org), предоставляющей Интернет-доступ к оболочке UNIX,[10][11] OpenLisp используется как один из доступных по сети языков программирования.
- Компания Bricsys использует OpenLisp для реализации своего варианта AutoLISP для САПР Bricscad.[12]
- MEVA[13] целиком написана на OpenLisp.
- Университет Палермо применяет OpenLisp как учебный язык.[14]
ПримечанияПравить
- ↑ Pierre Parquier. JTC1/SC22 N3170 (неопр.). ISO/IEC (2000). Дата обращения: 11 марта 2012. (недоступная ссылка)
- ↑ Keld Simonsen. Islisp - faq (неопр.). ISO/IEC (13 марта 1999). Дата обращения: 11 ноября 2016. Архивировано 1 ноября 2018 года.
- ↑ IZUMI NOBUTO (Tohoku Univ., Grad. Sch.) ITO TAKAYASU (Tohoku Univ., Grad. Sch.). Interpreter and Compiler of the ISO Standard Lisp ISLISP. (неопр.) Transactions of Information Processing Society of Japan (1999). Дата обращения: 17 июня 2013. Архивировано из оригинала 26 августа 2018 года.
- ↑ Paul McJones. ISLISP (неопр.). Software Preservation Group (2010). Дата обращения: 18 марта 2012. Архивировано 26 августа 2018 года.
- ↑ Pierre Parquier (JTC1 SC22 WG16 Convenor). ISO/IEC JTC1 SC22 WG16 N177 - DIS vote (неопр.). ISO/IEC (1996). Дата обращения: 15 марта 2012. Архивировано 27 января 2021 года.
- ↑ C. Jullien. OpenLisp v9.8.0 Reference Manual (неопр.). Eligis (2011). Дата обращения: 14 марта 2012. Архивировано 4 июня 2001 года.
- ↑ C. Jullien. OpenLisp FAQ (неопр.). Eligis (2011). Дата обращения: 15 марта 2012.
- ↑ C. Jullien. OpenLisp ChangeLog (неопр.). Eligis (2011). Дата обращения: 15 марта 2012.
- ↑ William Rinehuls. JTC1/SC22 N2969 (неопр.). ISO/IEC (4 августа 1999). Дата обращения: 11 ноября 2016. Архивировано 26 января 2021 года.
- ↑ Gene Michael Stover. 7.2 Languages on SDF (неопр.). SDF Public Access UNIX System, Inc. (2005). Дата обращения: 14 марта 2012. Архивировано 10 мая 2017 года.
- ↑ Hosting companies (неопр.). ALU (Association of Lisp Users). Дата обращения: 18 марта 2012. Архивировано из оригинала 9 февраля 2011 года.
- ↑ Bricscad News (неопр.). Bricscad (2009). Дата обращения: 20 марта 2012. Архивировано 27 августа 2018 года.
- ↑ Competitive Intelligence and Decision Problems (неопр.). Amos Davis (2013). Дата обращения: 30 сентября 2014.
- ↑ Corso di Informatica Teorica (неопр.). Università degli Studi di Palermo (2013). Дата обращения: 22 марта 2013. Архивировано 9 июля 2018 года.
СсылкиПравить
- eligis.com — официальный сайт OpenLisp
- Lisp Compilers and Interpreters в каталоге ссылок Curlie (dmoz)
- ISLISP on Software Preservation Group Архивная копия от 26 августа 2018 на Wayback Machine