ОпенЛисп
![]() OpenLisp, работающий внутри Emacs | |
Парадигмы | Мультипарадигмальность : функциональная , процедурная , объектно-ориентированная , рефлексивная , мета. |
---|---|
Семья | Лисп |
Разработано | Кристиан Жюльен |
Разработчик | Кристиан Жюльен |
Впервые появился | апрель 1988 г |
Стабильная версия | 11.7.0
/ 13 декабря 2022 г |
Дисциплина набора текста | Динамичный , сильный |
Язык реализации | С , ОпенЛисп |
Платформа | x86 , x86-64 , IA-64 , SPARC , PowerPC , MIPS , Alpha , PA-RISC , ARM , AArch64 , RISC-V , Loongson |
ТЫ | Windows , большинство на базе Unix , Linux , macOS , FreeBSD , OpenBSD , NetBSD , Solaris , HP-UX , AIX , QNX , DOS , OS/2 , Pocket PC , OpenVMS , z/OS , Cygwin |
Лицензия | Собственный |
Веб-сайт | www |
Под влиянием | |
Лисп , ИСЛИСП |
OpenLisp — язык программирования семейства Lisp, разработанный Кристианом Жюльеном. [1] от Элигиса . Это соответствует [2] [3] [4] международному стандарту ISLISP , опубликованному совместно Международной организацией по стандартизации (ISO) и Международной электротехнической комиссией (IEC), ISO/IEC 13816:1997(E), [5] [6] пересмотрено в соответствии с ISO/IEC 13816:2007(E). [7]
Написанный на языках программирования C и Lisp, он работает в большинстве распространенных операционных систем . OpenLisp обозначен как реализация ISLISP , но также содержит множество Common Lisp -совместимых расширений (хеш-таблица, таблица чтения, пакет, defstruct, последовательности, рациональные числа) и других библиотек ( сетевой сокет , регулярное выражение , XML , интерфейс переносимой операционной системы ( POSIX ), SQL , облегченный протокол доступа к каталогам (LDAP)). [8]
OpenLisp включает в себя интерпретатор, с циклом чтения-оценки-печати (REPL), программу сборки Lisp (LAP) и внутренний компилятор для языка C. связанный
Цели [ править ]
Основная цель этой версии Lisp — реализация полностью совместимой системы ISLISP (при запуске с --islisp
флаг, он строго ограничен спецификацией ISO/IEC 13816:2007(E). Вторичная цель — предоставить полную встраиваемую систему Lisp, связываемую с C/ C++ или Java (через собственный интерфейс Java (JNI)). обратного вызова Для связи с внешней программой используется механизм . Другие цели заключаются в том, чтобы его можно было использовать в качестве языка сценариев или связующего языка , а также создавать автономные исполняемые файлы программ.
Лицензия [ править ]
Несмотря на свое название , OpenLisp является проприетарным программным обеспечением . Его переводчик доступен бесплатно для любого некоммерческого использования.
Пользовательский интерфейс [ править ]
OpenLisp в основном работает в консольном режиме: cmd.exe
в Microsoft Windows и эмулятор терминала в Unix системах на базе .
;; OpenLisp v11.x.y (Build: XXXX) by C. Jullien [Jan 01 20xx - 10:49:13]
;; Copyright (c) Eligis - 1988-20xx.
;; System 'sysname' (64-bit, 8 CPU) on 'hostname', ASCII.
;; God thank you, OpenLisp is back again!
? (fib 20)
;; elapsed time = 0.003s, (0 gc).
= 6765
? _
Альтернативные решения включают запуск OpenLisp из Emacs через настройку Emacs. inferior-lisp-mode
или с помощью интегрированной среды разработки (IDE), поддерживающей синтаксис OpenLisp . LispIDE от DaanSystems делает это изначально.
Технология [ править ]
Менеджер памяти [ править ]
Внутри OpenLisp использует виртуальную память для автоматического выделения и расширения объектов. Небольшие объекты одного типа выделяются с использованием организации памяти Bibop (BIg Bag Of Pages). Большие объекты используют прокси , который указывает на реальный объект в куче Лиспа. Консервативная сборка мусора представляет собой пометку и очистку с объединенной кучей (фазу очистки можно настроить на использование потоков ).
Типы данных [ править ]
OpenLisp использует архитектуру с тегами (4-битный тег в 32-битной версии , 5-битный тег в 64-битной версии ) для быстрой проверки типов (маленькое целое число, число с плавающей запятой, символ, минусы, строка, вектор). Маленькие целые числа (28 бит в 32-разрядной версии, 59 бит в 64-разрядной версии) распаковываются , большие (32/64-разрядные) целые числа помещаются в рамку. В соответствии с требованиями ISLISP арифметика произвольной точности также реализована (bignum). Символы (следовательно, строки) являются либо 8-битными ( ANSI , EBCDIC ), либо 16/32-битными, если Unicode включена поддержка .
Оценщик и компилятор [ править ]
Ядро Lisp, собственный интерпретатор и базовые библиотеки вручную закодированы на языке C , промежуточный язык LAP , созданный компилятором, затем транслируется на C с помощью внутреннего генератора кода C.
История [ править ]
В 1988 году самой первой целью OpenLisp была реализация подмножества Lisp для расширения EmACT, клона Emacs . ISLISP быстро стал очевидным выбором. Последовало дальнейшее развитие.
Год | Версия | Основная особенность |
---|---|---|
1988 | 1.0 | OpenLisp начинался как игрушечный язык под названием MLisp (Minimal Lisp) для экспериментов с идеями ISLISP. стандартизации процесса |
1993 | 3.3 | Первый порт на 64-битной машине ( DEC Alpha OSF/1 ); изменение имени с MLisp на OpenLisp |
1994 | 4.0 | Первое коммерческое использование |
1995 | 4.5 | Поддержка потоков сокетов |
1997 | 5.7 | OpenLisp — первый Lisp, реализующий стандарт ISLISP ISO/IEC 13816:1997(E). [10] |
1998 | 5.8 | Unicode Дополнительная поддержка |
2000 | 6.6 | Компилятор Lisp в LAP; LAP интерпретируется виртуальной машиной, встроенной в OpenLisp; скорость увеличилась примерно в 2 раза |
2003 | 7.5 | Серверная часть Lisp для C; возможность скомпилировать приложение с множеством файлов Lisp в отдельный исполняемый файл; скорость увеличена с 10x до 20x |
2007 | 8.7 | Изменения в соответствии с версией ISO/IEC 13816:2007(E). [7] |
2010 | 9.2 | Встроенная целочисленной арифметики произвольной точности поддержка |
2021 | 11.2 | Добавлено полное расширение формата CLtL; улучшить обнаружение кучи |
2022 | 11.4 | Переработка блоков активации ускоряет работу интерпретатора примерно на 15%. Экспериментальный клон ASDF. |
2022 | 11.5 | Вызовы общих функций выполняются примерно в 3 раза быстрее. Улучшен внутренний модуль регулярных выражений. |
2022 | 11.6 | Добавьте тип <simple-bit-vector> и связанные с ним функции BIT, аналогичные эквиваленту CLtL. |
2022 | 11.7 | Текущая версия |
1958 | 1960 | 1965 | 1970 | 1975 | 1980 | 1985 | 1990 | 1995 | 2000 | 2005 | 2010 | 2015 | 2020 | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ЛИСП 1, 1.5, ЛИСП 2 (заброшенный) | |||||||||||||||
Маклисп | |||||||||||||||
Интерлисп | |||||||||||||||
леев | |||||||||||||||
Лисп-машина Лисп | |||||||||||||||
Схема | Р5РС | Р6РС | R7RS маленький | ||||||||||||
НОЛЬ | |||||||||||||||
ЗИЛ (язык реализации Zork) | |||||||||||||||
Франц Лисп | |||||||||||||||
Общий Лисп | стандарт ANSI | ||||||||||||||
Лисп | |||||||||||||||
Схема СО | |||||||||||||||
XLISP | |||||||||||||||
Т | |||||||||||||||
На схеме | |||||||||||||||
Эмакс Лисп | |||||||||||||||
АвтоЛИСП | |||||||||||||||
ПикоЛисп | |||||||||||||||
Гамбит | |||||||||||||||
EuLisp | |||||||||||||||
ИСЛИСП | |||||||||||||||
ОпенЛисп | |||||||||||||||
Схема PLT | Ракетка | ||||||||||||||
новыйЛИСП | |||||||||||||||
GNU Коварство | |||||||||||||||
Визуальный ЛИСП | |||||||||||||||
Кложур | |||||||||||||||
Дуга | |||||||||||||||
ЛФЭ | |||||||||||||||
Он | |||||||||||||||
Хиалисп |
Порты [ править ]
OpenLisp утверждает, что он чрезвычайно портативен, он работает во многих операционных системах , включая: Windows , большинство Unix и POSIX на базе ( Linux , macOS , FreeBSD , OpenBSD , NetBSD , Solaris , HP-UX , AIX , Cygwin , QNX ), DOS , OS/ 2 , Карманный ПК , OpenVMS , z/OS . Раздел загрузки официального сайта содержит более 50 различных версий.
Стандартные библиотеки [ править ]
Разъемы [ править ]
OpenLisp может взаимодействовать с модулями, написанными на C, используя интерфейс внешних функций (FFI), потоки ISLISP расширены для поддержки сетевых сокетов ( ./net
Каталог включает образцы для протокола передачи гипертекста (http), нотации объектов JavaScript (JSON), протокола почтового отделения 3 (POP3), простого протокола передачи почты (SMTP), Telnet , Rss ), упрощенного средства чтения расширяемого языка разметки ( XML ), которое можно конвертировать. XML в Лисп. Базовый модуль SQL можно использовать с MySQL , Odbc , SQLite , PostgreSQL . Модуль значений, разделенных запятыми (CSV), может читать и записывать файлы CSV.
Инструменты [ править ]
Инструменты разработчика включают регистрацию данных , Pretty-принтер , профилировщик , проектирование по контракту и модульные тесты .
Алгоритмы [ править ]
Некоторые известные алгоритмы доступны в ./contrib
Данцига каталог ( симплексный алгоритм , алгоритм Дейкстры , алгоритм Форда–Фалкерсона ). Модули поставляются с использованием лицензий BSD .
Происхождение имени [ править ]
Приставка Open относится к открытым системам, а не к модели с открытым исходным кодом . [11]
Имя было выбрано в 1993 году для замены внутреннего кодового имени MLisp, которое уже использовалось Гослингом Emacs (как преемником Mocklisp ).
OpenLisp Язык программирования отличается от OpenLISP, проекта, начатого в 1997 году для реализации протокола разделения локаторов и идентификаторов .
Компилятор [ править ]
В этом разделе описывается, как компилятор преобразует код Lisp в C.
Исходный код [ править ]
Числовая функция Фибоначчи (это классическое определение, используемое в большинстве тестов, не является самым эффективным способом вычисления fib
)
(defun fib (n)
(cond ((eq n 1) 1)
((eq n 2) 1)
(t (+ (fib (- n 1)) (fib (- n 2))))))
Промежуточный код LAP [ править ]
Компилятор Lisp преобразует исходный код Lisp в следующий промежуточный код. За ним следует этап оптимизации «глазок» , который использует этот промежуточный формат для анализа и оптимизации инструкций. После оптимизации окончательный код 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))
Перевод кода C [ править ]
Наконец, генератор кода C использует код LAP для перевода инструкций на C.
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 принимает строки неограниченной длины. Рекомендуемый стиль: каждая строка текста кода должна содержать не более 80 символов .
Принятие [ править ]
Он был выбран SDF Public Access некоммерческой Unix-системой открытого доступа Unix System в Интернете. [12] [13] как один из языков программирования, доступных в Интернете.
Bricsys использует OpenLisp для реализации AutoLISP в своей (САПР) Bricscad системе автоматизированного проектирования . [14]
МОЙ [15] полностью написан на OpenLisp.
Университет Палермо использует OpenLisp для обучения Lisp. [16]
Ссылки [ править ]
- ^ Паркье, Пьер (2000). «JTC1/SC22 N3170» . ИСО/МЭК . Проверено 11 марта 2012 г. [ постоянная мертвая ссылка ]
- ^ Симонсен, Келд (13 марта 1999 г.). «Ислисп – FAQ» . ИСО/МЭК . Проверено 11 ноября 2016 г.
- ^ Нобуто, Идзуми (Университет Тохоку, докторская степень); Такаясу, Ито (Университет Тохоку, аспирантура) (1999). «Интерпретатор и компилятор стандарта ISO Lisp ISLISP» . Транзакции – Общество обработки информации Японии . Сделки Общества обработки информации Японии. ISSN 0387-5806 . Архивировано из оригинала 26 августа 2018 года . Проверено 17 июня 2013 г.
{{cite journal}}
: CS1 maint: несколько имен: список авторов ( ссылка ) - ^ МакДжонс, Пол (2010). «ИСЛИСП» . Группа сохранения программного обеспечения . Проверено 18 марта 2012 г.
- ^ «ИСО/МЭК 13816:1997(Е)» . Международная организация по стандартизации . Проверено 11 ноября 2018 г.
- ^ Паркье, Пьер (руководитель JTC1 SC22 WG16) (1996). «ISO/IEC JTC1 SC22 WG16 N177 – голосование DIS» . ИСО/МЭК . Проверено 15 марта 2012 .
{{cite web}}
: CS1 maint: числовые имена: список авторов ( ссылка ) - ^ Jump up to: Перейти обратно: а б «ИСО/МЭК 13816:2007(Е)» . Международная организация по стандартизации . Проверено 11 ноября 2018 г.
- ^ Жюльен, Кристиан (2011). «Справочное руководство OpenLisp v9.8.0» . Элигис . Проверено 14 марта 2012 г.
- ^ Жюльен, Кристиан (2011). «Журнал изменений OpenLisp» . Элигис . Проверено 15 марта 2012 г.
- ^ Ринехулс, Уильям (4 августа 1999 г.). «JTC1/SC22 N2969» . ИСО/МЭК . Проверено 11 ноября 2016 г.
- ^ Жюльен, Кристиан (2011). «Часто задаваемые вопросы по OpenLisp» . Элигис . Проверено 15 марта 2012 г.
- ^ Стовер, Джин Майкл (2005). «7.2 Языки в SDF» . SDF Unix System открытого доступа, Inc. Проверено 14 марта 2012 г.
- ^ «Хостинговые компании» . ALU (Ассоциация пользователей Lisp). Архивировано из оригинала 9 февраля 2011 года . Проверено 18 марта 2012 г.
- ^ «Новости Брикскад» . Брискад. 2009 . Проверено 20 марта 2012 г.
- ^ «Конкурентная разведка и проблемы принятия решений» . Амос Дэвис. 2013 . Проверено 30 сентября 2014 г.
- ^ «Курс теоретической информатики» . Университет Палермо. 2013 . Проверено 22 марта 2013 г.