Семья | Лисп |
---|---|
Разработано | Обри Джаффер, Том Лорд, Майлз Бейдер |
Разработчик | Проект GNU |
Впервые появился | 1993 ( 1993 ) | [1]
Стабильный релиз | 3.0.10 [2] / 24 июня 2024 г. ( 2024-06-24 ) [2] |
Платформа | IA-32 , x86-64 , AArch64 , Armel , Armhf , mips , mips64el , mipsel , ppc64el , s390x |
ОС | Linux , BSD , Windows (через MinGW или Cygwin ) |
Лицензия | LGPL-3.0 или более поздняя версия |
Расширения имени файла | .scm .go (объект Guile) |
Веб-сайт | gnu.org/software/guile |
Под влиянием | |
Лисп , Схема , SCM |
GNU Ubiquitous Intelligent Language for Extensions [3] ( GNU Guile ) — предпочтительная система языка расширений для проекта GNU [4] и представляет собой реализацию языка программирования Scheme . Его первая версия была выпущена в 1993 году. [1] В дополнение к большим частям стандартов Scheme, Guile Scheme включает в себя модульные расширения для множества различных задач программирования. [5] [6]
Для расширения программ Guile предлагает libguile , которая позволяет встраивать язык в другие программы и тесно интегрировать его через интерфейс прикладного программирования языка C (API); аналогичным образом, новые типы данных и подпрограммы, определенные через API C, могут быть доступны в качестве расширений Guile. [7]
Guile используется во многих программах под эгидой проекта GNU ( GDB , Make , Guix , GNU TeXmacs , GnuCash , LilyPond , Lepton-EDA...) [8], но он также используется и за его пределами, например, в расколе Google.
Guile Scheme — это универсальный язык программирования высокого уровня , гибкость которого позволяет выражать концепции в меньшем количестве строк кода , чем это было бы возможно в таких языках, как C. Например, его гигиеничная система макросов позволяет добавлять специфичные для домена элементы синтаксиса без изменения Guile. Guile реализует стандарт Scheme R5RS, большую часть R6RS и R7RS, [9] несколько запросов на реализацию Scheme (SRFI) и множество собственных расширений.
Основная идея Guile Scheme заключается в том, что «разработчик реализует критические алгоритмы и структуры данных на языке C или C++ и экспортирует функции и типы для использования интерпретируемым кодом. Приложение становится библиотекой примитивов, организованных интерпретатором, объединяющей эффективность скомпилированного кода с гибкостью интерпретации». [10] Таким образом, Guile Scheme (и другие языки, реализованные Guile) можно расширить новыми типами данных и подпрограммами, реализованными через API C.
Стандартный дистрибутив предлагает модули для системных вызовов Portable Operating System Interface ( POSIX ), планирования , интерфейса внешних функций , обработки XML на основе S-выражений через SXML , SXPath и SXSLT, HTTP и другие API World Wide Web , продолжения с разделителями , программирование массивов [ 11] и другие функциональные возможности. [5] [6] Программы Guile могут использовать возможности из SLIB , переносимой библиотеки Scheme. [12]
При использовании продолжений с call/cc , что является требованием стандарта Scheme, Guile копирует стек выполнения в кучу и обратно. [13] В его руководстве предлагается использовать вместо этого продолжения с разделителями, поскольку они имеют более эффективную реализацию. [14]
Поскольку внешний код может иметь указатели на объекты Scheme, Guile использует консервативный сборщик мусора Boehm–Demers–Weiser (BDW) . [15]
В руководстве Guile приводятся подробности возникновения и ранней истории языка. [16] Ниже приводится краткое изложение:
После успеха Emacs в сообществе свободного программного обеспечения как высокорасширяемого и настраиваемого приложения через его язык расширения (и частично реализации) Emacs Lisp , сообщество начало рассматривать, как эта стратегия проектирования может быть применена к остальной части системы GNU. Том Лорд изначально начал работу над встраиваемой языковой средой выполнения под названием GNU Extension Language (GEL), которая была основана на реализации Scheme Обри Джаффера SCM (которая, в свою очередь, была основана на SIOD Джорджа Карретта ). [17] [18] Лорд убедил Ричарда Столлмана сделать GEL официальным языком расширения проекта GNU, основываясь на аргументе, что Scheme был более чистым диалектом Lisp , чем Emacs Lisp, и что GEL мог бы развиваться для реализации других языков в той же среде выполнения, а именно Emacs Lisp. После того, как Лорд обнаружил, что у GEL есть конфликт имен с другим языком программирования, он запросил предложения по новому названию. Из нескольких предложений в нескольких группах новостей Usenet Лорд спорно выбрал Guile по предложению Ли Томаса. [19] [20] [21] [22]
Во время разработки Guile (тогда GEL) и до его публичного выпуска язык расширений Tcl набирал популярность и продвигался как универсальный язык расширений. Столлман считал, что Tcl недостаточно мощный как язык расширений, и опубликовал критику в новостной группе comp.lang.tcl, которая инициировала флеймовую войну , известную как «Война Tcl». [23] Поскольку публичное объявление о проекте Guile совпало с дебатами о Tcl, стало распространенным заблуждением, что Guile начался как реакция на это.
После первоначального выпуска Guile разработка замерла на много лет, но в 2009–2010 годах произошли значительные улучшения, [24] и в 2011 году был выпущен Guile 2.0 с новой инфраструктурой компилятора , реализацией виртуальной машины , переходом на сборщик мусора Бёма–Демерса–Вайзера , множеством улучшений языка Guile Scheme и другими важными изменениями. [25]
Одна из целей Guile — разрешить использование других языков наряду со Scheme, так что Guile фактически станет нейтральной по отношению к языку средой выполнения. Различные попытки сделать это были сделаны в прошлых версиях: диалект Scheme, существенно отличающийся только его синтаксисом, похожим на C, перевод Emacs Lisp , конвертер Tcl, мотивированный tkWWW , и что-то, грубо напоминающее язык Logo . [26] С версией 2.0 проект успешно перешел к подходу компиляторной башни , что позволило определять компиляторы с одного языка на другой, как правило, с более высокого уровня на промежуточное представление более низкого уровня и, в конечном итоге, байт-код виртуальной машины или собственный машинный код . [27] [28]
16 марта 2017 года Guile 2.2.0 был выпущен с новым оптимизирующим компилятором и высокопроизводительной виртуальной машиной регистров. Согласно объявлению о выпуске Энди Уинго, реальные программы часто показывали ускорение на 30% и более с Guile 2.2 по сравнению с предыдущей серией 2.0. Guile 2.2.0 также снизил использование памяти, ускорил интерпретатор «eval», обеспечил лучшую поддержку многоядерного программирования и снял все фиксированные ограничения на рекурсивные вызовы функций. Он также поддерживал создание средств параллелизма в пространстве пользователя, которые мультиплексируют миллионы одновременных легковесных «волокон» и предоставляли полную реализацию Elisp, совместимую с Emacs, реализуя все функции и особенности Elisp так же, как Emacs. [29]
16 января 2020 года был выпущен Guile 3.0.0 с генерацией собственного кода just-in-time ( JIT ) для гораздо большей производительности. По сравнению с 2.2, производительность микротестов в целом примерно в два раза выше, в то время как некоторые отдельные тесты работают до 32 раз быстрее. Он также включал поддержку чередующихся определений и выражений в лексических контекстах, собственную поддержку структурированных исключений, лучшую поддержку стандартов схем R6RS и R7RS и множество оптимизаций. [30] [31]
1958 | 1960 | 1965 | 1970 | 1975 | 1980 | 1985 | 1990 | 1995 | 2000 | 2005 | 2010 | 2015 | 2020 | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
LISP 1, 1.5, LISP 2 (заброшен) | |||||||||||||||
Маклисп | |||||||||||||||
Интерлисп | |||||||||||||||
молдавский лей | |||||||||||||||
Лисп-машина Лисп | |||||||||||||||
Схема | Р5РС | Р6РС | R7RS маленький | ||||||||||||
НОЛЬ | |||||||||||||||
ZIL (язык реализации Zork) | |||||||||||||||
Франц Лисп | |||||||||||||||
Общий Лисп | стандарт ANSI | ||||||||||||||
Ле Лисп | |||||||||||||||
Схема Массачусетского технологического института | |||||||||||||||
XLISP | |||||||||||||||
Т | |||||||||||||||
Chez Схема | |||||||||||||||
Emacs Лисп | |||||||||||||||
АвтоЛИСП | |||||||||||||||
ПикоЛисп | |||||||||||||||
Гамбит | |||||||||||||||
EuLisp | |||||||||||||||
ИСЛИСП | |||||||||||||||
OpenLisp | |||||||||||||||
Схема PLT | Ракетка | ||||||||||||||
новыйLISP | |||||||||||||||
GNU-хитрость | |||||||||||||||
Визуальный ЛИСП | |||||||||||||||
Кложур | |||||||||||||||
Дуга | |||||||||||||||
ЛФЭ | |||||||||||||||
Хай |
В прошлом было несколько незавершенных попыток заменить или дополнить язык расширений Emacs Lisp с помощью Guile, параллельно с усилиями по поддержке других языков в Guile. [ необходима ссылка ]
С версией Guile 2.0 началась новая попытка внедрения Elisp в башню компилятора Guile и замены реализации Elisp в Emacs на реализацию libguile, которая достигла значительного прогресса в рамках проектов Google Summer of Code . [32] Emacs на основе Guile мог бы предложить лучшую производительность выполнения для Emacs Lisp, более простую поддержку новых языковых возможностей Emacs Lisp, сделать библиотеки Guile, написанные на других языках программирования, доступными для кода Emacs Lisp и разрешить написание расширений Emacs на других языках программирования, поддерживаемых Guile, при этом оставаясь полностью обратно совместимым с существующими кодовыми базами Emacs Lisp.
По состоянию на октябрь 2014 года [обновлять]реализация достигла стадии, на которой Guile Emacs способен надежно запускать большую часть кода Emacs Lisp. Оставшиеся проблемы или возможные проблемы включают различное внутреннее представление строк Emacs Lisp и строк Scheme, разницу между тем, как Emacs Lisp и Scheme обрабатывают объекты Boolean false и empty list, макросы Emacs Lisp не интегрируются со Scheme, Emacs Lisp не был разработан для параллелизма и переносимость Guile на платформы, поддерживаемые Emacs. Другие опасения, поднятые сообществом Emacs, включают относительные размеры сообществ Emacs и Guile, и то, приведет ли это к расколу сообщества, если Emacs будет расширяемым на языках программирования, отличных от Emacs Lisp. [33]
GNU make может быть собран с поддержкой GNU Guile как встроенного языка расширений. [34]
Guile — это GNU Ubiquitous Intelligent Language for Extensions, официальный язык расширений для операционной системы GNU.
scm_cons
, которая является базовой реализацией процедур Scheme cons
". Blandy 1997, стр. 94, 96.SLIB не входит в дистрибутив Guile, но может быть установлен отдельно.
call/cc
копирует весь стек C в кучу; вызов продолжения копирует стек обратно из кучи и использует longjmp
функцию для его повторной активации. Эта реализация имеет ряд недостатков...», Blandy 1997, стр. 99.Guile по-прежнему является по сути Scheme, но он пытается поддерживать широкий спектр языковых структурных элементов, чтобы другие языки могли быть реализованы поверх Guile.
Guile определяет башню языков, начиная со Scheme и постепенно упрощая ее до языков, напоминающих набор инструкций VM.