OpenLisp

OpenLisp — язык программирования из семейства языков Лисп, разработанный Кристианом Джулиеном.[1] Он соответствует[2][3][4] стандарту ISO ISLISP (Стандарт ISO/IEC 13816:1997(E)[5] переработан ISO/IEC 13816:2007(E), опубликован ISO).

OpenLisp

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

История

Основные вехи в развитии 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).
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.

Быстродействие

Согласно данным на странице автора системы (впрочем, устаревшим — приведённые материалы относятся к версии 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 March 1999). Дата обращения: 11 ноября 2016.
  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.
  5. Pierre Parquier (JTC1 SC22 WG16 Convenor). ISO/IEC JTC1 SC22 WG16 N177 - DIS vote. ISO/IEC (1996). Дата обращения: 15 марта 2012.
  6. C. Jullien. OpenLisp v9.8.0 Reference Manual. Eligis (2011). Дата обращения: 14 марта 2012.
  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 August 1999). Дата обращения: 11 ноября 2016.
  10. Gene Michael Stover. 7.2 Languages on SDF. SDF Public Access UNIX System, Inc. (2005). Дата обращения: 14 марта 2012.
  11. Hosting companies (недоступная ссылка). ALU (Association of Lisp Users). Дата обращения: 18 марта 2012. Архивировано 9 февраля 2011 года.
  12. Bricscad News. Bricscad (2009). Дата обращения: 20 марта 2012.
  13. Competitive Intelligence and Decision Problems. Amos Davis (2013). Дата обращения: 30 сентября 2014.
  14. Corso di Informatica Teorica. Università degli Studi di Palermo (2013). Дата обращения: 22 марта 2013.

Ссылки

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.