Interested Article - OpenLisp

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 системы. (Строгое соответствие спецификации ISLISP ISO/IEC 13816:2007(E) обеспечивается запуском интерпретатора с ключом -islisp .)
  • Создание встраиваемой Лисп-системы, взаимодействующей с кодом на Си/C++ и Java . Взаимодействие с кодом на Java поддерживается через Java Native Interface . Callback -механизм позволяет организовать двунаправленное взаимодействие с внешними программами.
  • Пригодность для использования в качестве скриптового языка .
  • Возможность генерации полноценных исполняемых модулей для целевой платформы.

Название диалекта

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

История

Основные вехи в развитии OpenLisp.
Год Версия Основные изменения
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-формате, который подвергается локальной оптимизации ( англ. ). После оптимизации результирующий 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 , OpenLisp используется как один из доступных по сети языков программирования.
  • Компания Bricsys использует OpenLisp для реализации своего варианта AutoLISP для САПР Bricscad .
  • MEVA целиком написана на OpenLisp.
  • Университет Палермо применяет OpenLisp как учебный язык.

Примечания

  1. Pierre Parquier. . ISO/IEC (2000). Дата обращения: 11 марта 2012. (недоступная ссылка)
  2. Keld Simonsen. . ISO/IEC (13 марта 1999). Дата обращения: 11 ноября 2016. 1 ноября 2018 года.
  3. IZUMI NOBUTO (Tohoku Univ., Grad. Sch.) ITO TAKAYASU (Tohoku Univ., Grad. Sch.). Transactions of Information Processing Society of Japan (1999). Дата обращения: 17 июня 2013. Архивировано из 26 августа 2018 года.
  4. Paul McJones. . Software Preservation Group (2010). Дата обращения: 18 марта 2012. 26 августа 2018 года.
  5. Pierre Parquier (JTC1 SC22 WG16 Convenor). . ISO/IEC (1996). Дата обращения: 15 марта 2012. 27 января 2021 года.
  6. C. Jullien. . Eligis (2011). Дата обращения: 14 марта 2012. 4 июня 2001 года.
  7. C. Jullien. . Eligis (2011). Дата обращения: 15 марта 2012.
  8. C. Jullien. . Eligis (2011). Дата обращения: 15 марта 2012.
  9. William Rinehuls. . ISO/IEC (4 августа 1999). Дата обращения: 11 ноября 2016. 26 января 2021 года.
  10. Gene Michael Stover. . SDF Public Access UNIX System, Inc. (2005). Дата обращения: 14 марта 2012. 10 мая 2017 года.
  11. . ALU (Association of Lisp Users). Дата обращения: 18 марта 2012. Архивировано из 9 февраля 2011 года.
  12. . Bricscad (2009). Дата обращения: 20 марта 2012. 27 августа 2018 года.
  13. . Amos Davis (2013). Дата обращения: 30 сентября 2014.
  14. . Università degli Studi di Palermo (2013). Дата обращения: 22 марта 2013. 9 июля 2018 года.

Ссылки

  • — официальный сайт OpenLisp
  • в каталоге ссылок Curlie (dmoz)
  • от 26 августа 2018 на Wayback Machine
Источник —

Same as OpenLisp