OpenLisp

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
OpenLisp
Скриншот программы OpenLisp
OpenLisp, запущенный в среде Emacs
Тип Компилятор, интерпретатор
Автор Кристиан Джулиен
Написана на Си и OpenLisp
Операционные системы Windows, Linux, MacOS, Solaris, HP-UX, AIX, OpenBSD, FreeBSD, NetBSD, PocketPC, QNX, VMS, Z/OS, Cygwin
Первый выпуск апрель 1988; 36 лет назад (1988-04)
Аппаратные платформы x86, x86_64, ia64, sparc, sparcv9, PowerPC, mips, alpha, parisc, ARM, AArch64
Последняя версия 10.3.0 (5 марта 2017; 7 лет назад (2017-03-05))
Лицензия Проприетарное программное обеспечение
Сайт eligis.com

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 в код на языке Си.

Цели разработки

[править | править код]

Целями создания данного диалекта Лиспа были:

  • Реализация полностью совместимой с 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, который затем переводится генератором кода в Си, который, в свою очередь, может быть откомпилирован любым Си-транслятором целевой платформы.

Основные вехи в развитии OpenLisp.[8]
Год Версия Основные изменения
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 раз) быстрее в скорости откомпилированных приложений.

Применение

[править | править код]
  • Некоммерческой организацией SDF (известной также как freeshell.org), предоставляющей Интернет-доступ к оболочке UNIX,[10][11] OpenLisp используется как один из доступных по сети языков программирования.
  • Компания Bricsys использует OpenLisp для реализации своего варианта AutoLISP для САПР Bricscad.[12]
  • MEVA[13] целиком написана на OpenLisp.
  • Университет Палермо применяет OpenLisp как учебный язык.[14]

Примечания

[править | править код]
  1. Pierre Parquier. JTC1/SC22 N3170. ISO/IEC (2000). Дата обращения: 11 марта 2012. (недоступная ссылка)
  2. Keld Simonsen. Islisp - faq. ISO/IEC (13 марта 1999). Дата обращения: 11 ноября 2016. Архивировано 1 ноября 2018 года.
  3. 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 года.
  4. Paul McJones. ISLISP. Software Preservation Group (2010). Дата обращения: 18 марта 2012. Архивировано 26 августа 2018 года.
  5. Pierre Parquier (JTC1 SC22 WG16 Convenor). ISO/IEC JTC1 SC22 WG16 N177 - DIS vote. ISO/IEC (1996). Дата обращения: 15 марта 2012. Архивировано 27 января 2021 года.
  6. C. Jullien. OpenLisp v9.8.0 Reference Manual. Eligis (2011). Дата обращения: 14 марта 2012. Архивировано 4 июня 2001 года.
  7. C. Jullien. OpenLisp FAQ. Eligis (2011). Дата обращения: 15 марта 2012.
  8. C. Jullien. OpenLisp ChangeLog. Eligis (2011). Дата обращения: 15 марта 2012.
  9. William Rinehuls. JTC1/SC22 N2969. ISO/IEC (4 августа 1999). Дата обращения: 11 ноября 2016. Архивировано 26 января 2021 года.
  10. Gene Michael Stover. 7.2 Languages on SDF. SDF Public Access UNIX System, Inc. (2005). Дата обращения: 14 марта 2012. Архивировано 10 мая 2017 года.
  11. Hosting companies. ALU (Association of Lisp Users). Дата обращения: 18 марта 2012. Архивировано из оригинала 9 февраля 2011 года.
  12. Bricscad News. Bricscad (2009). Дата обращения: 20 марта 2012. Архивировано 27 августа 2018 года.
  13. Competitive Intelligence and Decision Problems. Amos Davis (2013). Дата обращения: 30 сентября 2014.
  14. Corso di Informatica Teorica. Università degli Studi di Palermo (2013). Дата обращения: 22 марта 2013. Архивировано 9 июля 2018 года.