Лучшие вопросы
Таймлайн
Чат
Перспективы
OpenLisp
Из Википедии, свободной энциклопедии
Remove ads
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 в код на языке Си.
Remove ads
Цели разработки
Целями создания данного диалекта Лиспа были:
- Реализация полностью совместимой с ISLISP системы. (Строгое соответствие спецификации ISLISP ISO/IEC 13816:2007(E) обеспечивается запуском интерпретатора с ключом
-islisp
.) - Создание встраиваемой Лисп-системы, взаимодействующей с кодом на Си/C++ и Java. Взаимодействие с кодом на Java поддерживается через Java Native Interface. Callback-механизм позволяет организовать двунаправленное взаимодействие с внешними программами.
- Пригодность для использования в качестве скриптового языка.
- Возможность генерации полноценных исполняемых модулей для целевой платформы.
Remove ads
Название диалекта
Исходно язык имел внутреннее имя MLisp. В 1993 году это имя было заменено на OpenLisp, так как оказалось, что MLisp уже используется в Gosling Emacs.
В начале 1990-х слово «open» («открытый») в приложении к информационным технологиям чаще применялось для обозначения систем, которые реализуют открытые спецификации на интерфейсы, сервисы и форматы данных, что позволяет без искусственных ограничений использовать эти системы, создавать совместимое и/или взаимодействующее с ними ПО (именно в этом смысле термин используется в определении «открытой компьютерной системы»). Такому пониманию «открытости» вполне соответствуют цели разработки OpenLisp (см. выше), как и то, что он реализует стандарт ISLISP.[7]
Таким образом, название языка призвано символизировать его открытость для использования, но не имеет отношения ни к Open Source Initiative, ни к свободному программному обеспечению вообще. Среда OpenLisp всегда выпускалась и продолжает выпускаться под проприетарной лицензией. Часть исходных текстов является закрытой.
Язык OpenLisp не следует путать с проектом OpenLISP, запущенным в 1997 году для реализации Locator/Identifier Separation Protocol.
Remove ads
Лицензия и условия распространения
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.
Remove ads
Детали реализации
Суммиров вкратце
Перспектива
Менеджер памяти
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, который затем переводится генератором кода в Си, который, в свою очередь, может быть откомпилирован любым Си-транслятором целевой платформы.
Remove ads
История
Remove ads
Портирование
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.
Remove ads
Компиляция
Суммиров вкратце
Перспектива
В данном разделе описывается последовательность трансформации Лисп-кода в код на Си в 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 раз) быстрее в скорости откомпилированных приложений.
Remove ads
Применение
- Некоммерческой организацией SDF (известной также как freeshell.org), предоставляющей Интернет-доступ к оболочке UNIX,[10][11] OpenLisp используется как один из доступных по сети языков программирования.
- Компания Bricsys использует OpenLisp для реализации своего варианта AutoLISP для САПР Bricscad.[12]
- MEVA[13] целиком написана на OpenLisp.
- Университет Палермо применяет OpenLisp как учебный язык.[14]
Remove ads
Примечания
Ссылки
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads