PicoLisp

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
PicoLisp
Класс языка язык программирования
Появился в 1988
Автор Александр Бюргер
Выпуск
Система типов динамическая
Лицензия лицензия MIT
Сайт picolisp.com
Платформа POSIX

PicoLisp — минималистичный свободный диалект языка программирования Лисп, рассчитанный на использование на Linux и других POSIX-системах.

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

Автором PicoLisp является немецкий разработчик Александр Бюргер (Alexander Burger). Предшественником PicoLisp был «8kLisp», созданный в 1986—1987 годах тем же автором для компьютеров под управлением операционной системы CP/M; основные идеи были заложены уже тогда.

Первая версия интерпретатора PicoLisp была создана для компьютеров Macintosh в конце 1980-х годов. Первая коммерческая разработка на PicoLisp, система обработки изображений и подготовки макета для печати, работавшая на Mac II, была выполнена в 1988 году[2].

В 2009 году появилась 64-битная версия, написанная на «общем машинном коде», который с помощью PicoLisp переводится в конкретный код целевой платформы.

В 2010 году была выпущена Java-версия «Ersatz Picolisp»[3].

Принципы и особенности[править | править код]

Только интерпретатор.
PicoLisp строился как исключительно интерпретируемый Лисп. По мнению автора[2][4] для техники программирования, использующей специфические возможности Лиспа, такие как сложные преобразования списочных структур и динамическое порождение кода, выигрыш в скорости за счёт компиляции незначителен и не стоит усложнений, которые ради эффективной компиляции приходится вносить в язык. Автор полагает, что нет смысла в усложнении языка и среды ради разницы в скорости, которую пользователь, скорее всего, даже не заметит.
По утверждению автора[4], типичные для Лиспа программы обработки списков, работающие под управлением интерпретатора PicoLisp, показывают примерно равную производительность с откомпилированными в CMUCL и существенно обгоняют откомпилированные в CLISP и Scheme 48. Для кода с большим количеством вычислений интерпретатор PicoLisp оказывается медленнее компилированных программ. Поэтому критичные по времени участки, для которых интерпретатор действительно становится ограничивающим фактором, предлагается реализовывать внешним кодом на компилируемом языке (обычно — на языке Си или языке ассемблера), который, как правило, оказывается быстрее любого откомпилированного лисповского кода.
Простота и ясность.
Язык ориентирован на простоту и минимализм. Количество синтаксических конструкций, базовых понятий и системных функций сводится к минимуму, достаточному для эффективной работы. На уровне языка существует лишь три типа данных — числа, строки и списки, на уровне виртуальной машины — единственный тип данных — Cons-ячейка[5]. Отказ от компиляции позволил существенно упростить язык, а за счёт этого — упростить ядро интерпретатора, что привело к созданию очень экономичной по памяти и эффективной среды исполнения.
Ортогональность.
Благодаря высокой степени универсальности базовых синтаксических конструкций (достигаемой во многом за счёт отказа от компиляции) из языка исключены дополнительные дублирующие их механизмы. Так, одной из ярких особенностей является отказ от функции lambda, традиционной для Лисп-систем (в том числе для Common Lisp и Emacs Lisp) — она потеряла необходимость благодаря изменению функции quote, которая в PicoLisp возвращает неизменными все свои аргументы, а не только первую ячейку[4]. Универсальный механизм описания функций с поддержкой управления вычислением параметров дал возможность отказаться и от специального синтаксиса для макросов и функциональных значений; все они могут быть адекватно представлены общим синтаксисом описания функций. Благодаря интерпретации функции свободны от многих ограничений и могут эффективно работать с данными произвольных типов обрабатывать произвольное количество параметров. В языке нет даже поддержки массивов, единственным неатомарным типом данных является список.
Динамическое связывание.
В отличие от большинства современных диалектов, PicoLisp основывается на динамическом связывании данных, поскольку оно намного проще и эффективнее реализуется в интерпретаторе.
Объектная ориентированность.
PicoLisp имеет лёгкую, но мощную объектно-ориентированную систему, написанную на самом языке. И классы, и объекты реализуются в виде лисповских символов. Поддерживаются свойства и методы, причём как объектов, так и классов, множественное и единичное наследование. Динамический характер языка позволяет при необходимости добавлять свойства и методы к конкретным объектам.
Практичность.
Благодаря большому числу встроенных функций обработки списков программы на PicoLisp получаются компактными, выразительными и достаточно производительными[6].
Среда.
PicoLisp — это не только язык программирования, но и программная платформа для разработки приложений, включающая в себя базу данных, сервер веб-приложений и веб-фреймворк (представленный в виде XHTML-библиотеки для GUI). Платформа также включает встроенную реализацию Пролога, обеспечивается вызов функций на языках Си и Java из лисп-кода.
Локализация.
Язык поддерживает кодировку UTF-8, что обеспечивает возможность прозрачной работы со знаками любых алфавитов. Строковый тип в PicoLisp отсутствует, вместо него могут использоваться временные (transient) символы — символы, имя которых представляет собой последовательность знаков, заключённых в кавычки. В отличие от строк других языков, такие символы имеют все присущие символам свойства, в том числе могут иметь значение. Манипулируя этими значениями, можно обеспечить прозрачный перевод на любой язык.

Примеры[править | править код]

Код, кодирующий информацию в Base58[7]:

(setq *B58Alpha 
   (chop "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz") )
(de hex2L (H)
   (make
      (for (L (chop H) L (cddr L))
         (link (hex (pack (car L) (cadr L)))) ) ) )
(de b58enc (Lst)
   (let
      (P 1
         Z 0
         A 
         (sum 
            '((X)
               (* X (swap 'P (>> -8 P))) )
            (reverse Lst) ) )
   (for L Lst
      (T (n0 L))
      (inc 'Z) )
   (pack
      (need Z "1")
      (make
         (while (gt0 A)
            (yoke
               (prog1
                  (get *B58Alpha (inc (% A 58)))
                  (setq A (/ A 58)) ) ) ) ) ) ) )

На официальном сайте языка представлен ряд примеров законченных приложений, среди них веб-приложение со встроенной базой данных, полнофункциональный консольный текстовый редактор (менее 1 тыс. строк кода), IRC-клиент.

Примечания[править | править код]

  1. https://software-lab.de/down.html
  2. 1 2 http://software-lab.de/radical.pdf Архивная копия от 28 июля 2019 на Wayback Machine Pico Lisp. A Radical Approach to Application Development. Alexander Burger, 2006.
  3. Alexander Burger. Ersatz PicoLisp. picolisp.com. Дата обращения: 26 июля 2017. Архивировано 12 ноября 2017 года.
  4. 1 2 3 PicoLisp FAQ (англ.). software-lab.de. Дата обращения: 25 июля 2017. Архивировано 6 августа 2017 года.
  5. Burger Alexander. "Internal structures". PicoLisp.com. Дата обращения: 26 июля 2017. Архивировано 25 декабря 2016 года.
  6. Примеры на Rosetta Code[en]: Category:PicoLisp - Rosetta Code (англ.). rosettacode.org. Дата обращения: 25 июля 2017. Архивировано 6 августа 2017 года.
  7. mihailp / tankfeeder / source / base58.l — Bitbucket (англ.). bitbucket.org. Дата обращения: 26 июля 2017. (недоступная ссылка)

Ссылки[править | править код]