Тройная туманность
- 1 year ago
- 0
- 0
OpenLisp — язык программирования из семейства языков Лисп , разработанный Кристианом Джулиеном. Он соответствует стандарту ISO ISLISP ( от 10 апреля 2016 на Wayback Machine переработан от 30 июля 2016 на Wayback Machine , опубликован ISO ).
Ядро написано на Си и Лиспе, запускается на большинстве операционных систем. OpenLisp является реализацией стандарта ISLISP , но также содержит ряд расширений, совместимых с Common Lisp (хеш-таблицы, таблицы чтения, пакеты, структуры, последовательности, рациональные числа) и ряд библиотек ( сокеты , регулярные выражения , XML , Posix , SQL , LDAP ).
OpenLisp включает интерпретатор , предназначенный для интерактивной разработки ( REPL ), компилятор в Lisp Assembly Program (LAP) и генератор кода, преобразующий LAP в код на языке Си.
Целями создания данного диалекта Лиспа были:
-islisp
.)
Исходно язык имел внутреннее имя MLisp. В 1993 году это имя было заменено на OpenLisp, так как оказалось, что MLisp уже используется в Gosling Emacs .
В начале 1990-х слово «open» («открытый») в приложении к информационным технологиям чаще применялось для обозначения систем, которые реализуют открытые спецификации на интерфейсы, сервисы и форматы данных, что позволяет без искусственных ограничений использовать эти системы, создавать совместимое и/или взаимодействующее с ними ПО (именно в этом смысле термин используется в определении « открытой компьютерной системы »). Такому пониманию «открытости» вполне соответствуют цели разработки OpenLisp (см. выше), как и то, что он реализует стандарт ISLISP.
Таким образом, название языка призвано символизировать его открытость для использования, но не имеет отношения ни к Open Source Initiative , ни к свободному программному обеспечению вообще. Среда OpenLisp всегда выпускалась и продолжает выпускаться под проприетарной лицензией . Часть исходных текстов является закрытой.
Язык OpenLisp не следует путать с проектом OpenLISP, запущенным в 1997 году для реализации .
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 также реализованы . Символы (и, следовательно, строки) могут быть либо 8-битными ( ANSI , EBCDIC ), либо 16/32-битными, если включена поддержка Unicode .
Ядро, интерпретатор и базовые библиотеки написаны вручную на Си . Компилятор преобразует исходный текст в LAP, который затем переводится генератором кода в Си , который, в свою очередь, может быть откомпилирован любым Си-транслятором целевой платформы.
Год | Версия | Основные изменения |
---|---|---|
1988 | 1.0 | Проект запущен в качестве исследовательского языка под названием MLisp (Minimal Lisp) для экспериментов с идеями из разрабатываемого стандарта ISLISP . В 1988 году основным мотивом была реализация Лиспа для расширения 'а, клона 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). |
1998 | 5.8 | Реализована поддержка Unicode . |
2000 | 6.6 | Компилятор в LAP. LAP интерпретируются виртуальной машиной, входящей в состав системы. Быстродействие повышено в два раза. |
2003 | 7.5 | Реализован бэк-энд «Lisp в C». Стала доступна компиляция многофайловых Лисп-программ в исполняемый модуль. Скорость возросла в 10-20 раз. |
2007 | 8.7 | Внесены изменения в связи с выходом нового стандарта от 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 может взаимодействовать с модулями, написанными на Си, с использованием
, потоки ввода-вывода ISLISP расширены для поддержки сетевых сокетов. Каталог
./net
в развёрнутой системе включает примеры для работы с
Http
,
Json
,
,
,
Telnet
,
Rss
. Простой
XML
-ридер может преобразовывать XML в Лисп-списки. Базовый модуль
SQL
может использоваться для доступа к
MySQL
,
,
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-код выглядит так:
((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 раз) быстрее в скорости откомпилированных приложений.