GNU Коварство
![]() | |
Семья | Лисп |
---|---|
Разработано | Обри Джаффер, Том Лорд, Майлз Бэйдер |
Разработчик | Проект GNU |
Впервые появился | 1993 год [1] |
Стабильная версия | |
Платформа | IA-32 , x86-64 , AArch64 , Armel , Armhf , mips , mips64el , mipsel , ppc64el , s390x |
ТЫ | Linux , BSD , Windows (через MinGW или Cygwin ) |
Лицензия | LGPL-3.0 или более поздняя версия |
Расширения имен файлов | .scm .go (объект Guile) |
Веб-сайт | ГНУ |
Под влиянием | |
Лисп , Схема , SCM |
Повсеместный интеллектуальный язык GNU для расширений [3] ( GNU Guile ) — предпочтительная языковая система расширений для проекта GNU. [4] и содержит реализацию языка программирования Scheme . Его первая версия была выпущена в 1993 году. [1] В дополнение к значительной части стандартов Scheme, Guile Scheme включает модульные расширения для множества различных задач программирования. [5] [6]
Для расширения программ Guile предлагает библиотеку libguile , которая позволяет встраивать язык в другие программы и тесно интегрировать его через C языка интерфейс прикладного программирования (API) ; Аналогичным образом, новые типы данных и подпрограммы, определенные через C API, могут быть доступны как расширения Guile. [7]
Guile используется во многих программах под эгидой проекта GNU ( GDB , Make , Guix , GNU TeXmacs , GnuCash , LilyPond , Lepton-EDA ...) [8] но он также находит применение и за пределами этого, например, в расколе Google .
Коварная схема [ править ]
Guile Scheme — это общего назначения , язык программирования высокого уровня гибкость которого позволяет выражать концепции в меньшем количестве строк кода как C. , чем это было бы возможно в таких языках , Например, его гигиеничная система макросов позволяет добавлять элементы синтаксиса, специфичные для предметной области, без изменения Guile. Guile реализует стандартную схему R5RS, большую часть R6RS и R7RS, [9] несколько запросов на реализацию схемы (SRFI) и множество собственных расширений.
Основная идея Guile Scheme заключается в том, что «разработчик реализует важные алгоритмы и структуры данных на C или C++ и экспортирует функции и типы для использования интерпретируемым кодом. Приложение становится библиотекой примитивов, управляемых интерпретатором, сочетая в себе эффективность скомпилированных код с гибкостью интерпретации». [10] Таким образом, Guile Scheme (и другие языки, реализованные Guile) можно расширить за счет новых типов данных и подпрограмм, реализованных через C API.
Стандартный дистрибутив предлагает модули для интерфейса переносимой операционной системы ( POSIX системных вызовов ), планирования , интерфейса внешних функций , S-выражений на основе обработки XML через SXML , SXPath и SXSLT, HTTP и других World Wide Web API , продолжений с разделителями , программирования массивов. , [11] и другой функционал. [5] [6] Программы Guile могут использовать возможности SLIB , переносимой библиотеки Scheme. [12]
Детали реализации [ править ]
При использовании продолжений с call/cc , что является требованием стандарта Scheme, Guile копирует стек выполнения в кучу и обратно. [13] В его руководстве предлагается вместо этого использовать продолжения с разделителями, потому что они имеют более эффективную реализацию. [14]
Поскольку внешний код может иметь указатели на объекты Scheme, Guile использует консервативный Бема-Демерса-Вайзера (BDW) сборщик мусора . [15]
История [ править ]
Руководство Guile подробно описывает возникновение и раннюю историю языка. [16] Ниже приводится краткое изложение:
После успеха Emacs в сообществе свободного программного обеспечения как широко расширяемого и настраиваемого приложения посредством расширения (и частичной реализации) языка Emacs Lisp , сообщество начало рассматривать, как эту стратегию проектирования можно применить к остальной части системы GNU. Том Лорд первоначально начал работу над встраиваемой средой выполнения языка под названием GNU Extension Language (GEL), которая была основана на реализации схемы SCM Джорджа Карретта Обри Джаффера (которая, в свою очередь, была основана на SIOD ). [17] [18] Лорд убедил Ричарда Столлмана сделать GEL официальным языком расширения проекта GNU, основываясь на аргументе, что Scheme является более чистым диалектом Lisp, чем Emacs Lisp, и что GEL может развиваться для реализации других языков в той же среде выполнения, а именно Emacs Lisp. После того, как Лорд обнаружил, что у GEL конфликт имен с другим языком программирования, он запросил предложения по новому имени. Из нескольких публикаций в нескольких группах новостей Usenet Лорд неоднозначно выбрал Гайла по предложению Ли Томаса. [19] [20] [21] [22]
Во время разработки Guile (тогда GEL) и до его публичного выпуска язык расширения Tcl набирал популярность и продвигался как универсальный язык расширения. Столлман считал, что Tcl недостаточно силен в качестве языка расширения, и опубликовал критику в группе новостей comp.lang.tcl, которая инициировала пламенную войну, известную как «Война Tcl». [23] Поскольку публичное объявление о проекте Guile совпало с дебатами по Tcl, стало распространенным заблуждением, что Guile возник как реакция на это.
После первого выпуска Guile разработка замедлилась на долгие годы, но в 2009–2010 годах произошли серьезные улучшения. [24] и Guile 2.0 был выпущен в 2011 году с новой инфраструктурой компилятора , реализацией виртуальной машины , переходом на сборщик мусора Бёма-Демерса-Вайзера , множеством улучшений языка 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», обеспечил лучшую поддержку многоядерного программирования и удалил любые фиксированные ограничения на рекурсивные вызовы функций. Он также поддерживал создание средств параллелизма в пользовательском пространстве, которые мультиплексируют миллионы одновременных легких «волокон» и обеспечивал полную Emacs-совместимую реализацию Elisp, реализуя все функции и особенности Elisp так же, как Emacs. [29]
16 января 2020 года был выпущен Guile 3.0.0 с JIT -генерацией собственного кода для гораздо большей производительности. По сравнению с версией 2.2 производительность микротестов в целом примерно в два раза выше, а некоторые отдельные тесты — до 32 раз быстрее. Он также включал поддержку чередующихся определений и выражений в лексическом контексте, встроенную поддержку структурированных исключений, улучшенную поддержку стандартов схем R6RS и R7RS и множество оптимизаций. [30] [31]
1958 | 1960 | 1965 | 1970 | 1975 | 1980 | 1985 | 1990 | 1995 | 2000 | 2005 | 2010 | 2015 | 2020 | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ЛИСП 1, 1.5, ЛИСП 2 (заброшенный) | |||||||||||||||
Маклисп | |||||||||||||||
Интерлисп | |||||||||||||||
леев | |||||||||||||||
Лисп-машина Лисп | |||||||||||||||
Схема | Р5РС | Р6РС | R7RS маленький | ||||||||||||
НОЛЬ | |||||||||||||||
ЗИЛ (язык реализации Zork) | |||||||||||||||
Франц Лисп | |||||||||||||||
Общий Лисп | стандарт ANSI | ||||||||||||||
Лисп | |||||||||||||||
Схема СО | |||||||||||||||
XLISP | |||||||||||||||
Т | |||||||||||||||
На схеме | |||||||||||||||
Эмакс Лисп | |||||||||||||||
АвтоЛИСП | |||||||||||||||
ПикоЛисп | |||||||||||||||
Гамбит | |||||||||||||||
EuLisp | |||||||||||||||
ИСЛИСП | |||||||||||||||
ОпенЛисп | |||||||||||||||
Схема PLT | Ракетка | ||||||||||||||
новыйЛИСП | |||||||||||||||
GNU Коварство | |||||||||||||||
Визуальный ЛИСП | |||||||||||||||
Кложур | |||||||||||||||
Дуга | |||||||||||||||
ЛФЭ | |||||||||||||||
Он | |||||||||||||||
Хиалисп |
Интеграция Emacs [ править ]
В прошлом было несколько незавершенных попыток заменить или дополнить язык расширения 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 г. [update], реализация достигла стадии, когда Guile Emacs может надежно запускать большую часть кода Emacs Lisp. Остающиеся проблемы или возможные проблемы включают в себя различное внутреннее представление строк Emacs Lisp из строк Scheme, разницу между тем, как Emacs Lisp и Scheme обрабатывают логические объекты ложного и пустого списка, макросы Emacs Lisp, не интегрируемые со Scheme, Emacs Lisp не предназначен для параллелизм и переносимость Guile на платформы, поддерживаемые Emacs. Другие опасения, поднятые сообществом Emacs, включают относительные размеры сообществ Emacs и Guile, а также то, приведет ли это к расколу сообщества, если Emacs будет расширяться на других языках программирования, кроме Emacs Lisp. [33]
Интеграция GNU Make [ править ]
GNU make может быть построен с поддержкой GNU Guile как встроенного языка расширений. [34]
Ссылки [ править ]
- ^ Jump up to: Перейти обратно: а б Блэнди 1997, с. 102.
- ^ Jump up to: Перейти обратно: а б «Выпущен GNU Guile 3.0.9» . gnu.org.
- ^ «Коварство GNU (О коварстве)» . Проект ГНУ.
Guile — это вездесущий интеллектуальный язык расширений GNU, официальный язык расширений для операционной системы GNU.
- ^ «Стандарты кодирования GNU, какие языки использовать» . Проект ГНУ.
- ^ Jump up to: Перейти обратно: а б «Руководство Guile, Справочник по API» . Проект ГНУ.
- ^ Jump up to: Перейти обратно: а б «Руководство по Guile, Модули Guile» . Проект ГНУ.
- ^ «Чтобы стимулировать настройку, Guile предоставляет обширные интерфейсы, позволяющие коду C взаимодействовать с миром Scheme. Код C может свободно создавать, получать доступ и изменять объекты Scheme; функции C могут вызывать функции Scheme и наоборот; код C может добавлять новые типы в мир Scheme и воспользоваться преимуществами сборки мусора Guile… Большинство стандартных процедур Scheme реализованы функциями C, видимыми для клиентов Guile, например, приложения могут вызывать функцию C;
scm_cons
, который является базовой реализацией процедур Schemecons
.» Блэнди 1997, стр. 94, 96. - ^ «Приложения, использующие Guile» . Проект ГНУ. Архивировано из оригинала 24 ноября 2017 г.
- ^ «Несовместимость R7RS (Справочное руководство Guile)» . Проект ГНУ . Проверено 20 января 2020 г.
- ^ Бланди 1997, с. 87.
- ^ «Руководство по хитрости, Массивы» . Проект ГНУ.
- ^ «Руководство по коварству, СЛИБ» . Проект ГНУ.
SLIB не входит в дистрибутив Guile, но может быть установлен отдельно.
- ^ «Поскольку Guile позволяет сторонним функциям и функциям Scheme свободно вызывать друг друга, продолжение Guile может включать в себя кадры стека как C, так и Scheme. Для простоты реализация Guile
call/cc
копирует весь стек C в кучу; вызов продолжения копирует стек обратно из кучи и использует методlongjmp
функцию, чтобы повторно активировать ее. Эта реализация имеет ряд недостатков...», Blandy 1997, стр. 99. - ^ «Руководство по коварству, Продолжение» . Проект ГНУ.
- ^ «Руководство по коварству, консервативный GC» . Проект ГНУ.
- ^ «Руководство по коварству, История» .
- ^ "Трудно определить, кто разработал Guile. Большая часть заслуг, несомненно, принадлежит Обри Джафферу, чей превосходный интерпретатор Scheme, SCM, составляет ядро реализации. Система модулей была спроектирована и построена Майлзом Бейдером…" "An Анатомия хитрости, Интерфейс к Tcl/Tk", 1995 г.
- ^ «Вот очень, очень краткая история этого интерпретатора. Я надеюсь, что люди, участвовавшие в его прошлом, внесут больший вклад в этот документ. SIOD: Джордж Карретт написал SIOD, самую раннюю версию. Хотя большая часть этого кода была переписана или заменена со временем сборщик мусора из SIOD по-прежнему остается важной частью SIOD, он по-прежнему активно развивается и доступен бесплатно. Коварная схема 1995.
- ^ «Имя Guile было впервые предложено Ли Томасом в обсуждении в Usenet». Коварная схема 1995.
- ^ Ли Томас (4 ноября 1994 г.). «Имя розы» . Группа новостей : gnu.misc.discuss .
- ^ «КОЛОВАРСТВО – еще две причины предпочесть его» .
- ^ «ГЕЛЬ: Важное изменение имени» .
- ^ Архивы войны Tcl
- ^ Винго, Энди. «Старые записи в блоге для wingo (начиная с номера 328)» . Адвокато.
- ^ «Гиловые новости» . Проект ГНУ. Архивировано из оригинала 28 марта 2014 г.
- ^ Лорд, Томас (июль 1995 г.). «Анатомия хитрости. Интерфейс Tcl/Tk» ( PostScript ) . Третий ежегодный семинар Tcl/Tk . Торонто, Онтарио, Канада: Usenix . Проверено 23 ноября 2010 г.
- ^ «Руководство по хитрости, другие языки» . Проект ГНУ.
Guile по своей сути по-прежнему является схемой, но он пытается поддерживать широкий спектр строительных блоков языка, чтобы другие языки могли быть реализованы поверх Guile.
- ^ «Руководство по коварству, Башня компилятора» . Проект ГНУ.
Guile определяет башню языков, начиная со Scheme и постепенно упрощая до языков, напоминающих набор команд виртуальной машины.
- ^ «Выпущен GNU Guile 2.2.0» . 16 марта 2017 г. Проверено 20 января 2020 г.
- ^ «Выпущен GNU Guile 3.0.0» . 16 января 2020 г. Проверено 20 января 2020 г.
- ^ «Выпущен GNU Guile 3.0.0» . 16 января 2020 г. Проверено 20 января 2020 г.
- ^ «Реализация Re. Elisp?» . Б. Т. Темплтон.
- ^ «Будущее Emacs, Guile и Emacs Lisp» .
- ^ «12.1 Интеграция GNU Guile» . gnu.org . Проверено 16 марта 2020 г.
Дальнейшее чтение [ править ]
- «Анатомия хитрости, интерфейс для Tcl/Tk» (1995)
- Блэнди, Джим (1998). Питер Х. Салус (ред.). «Коварство: ядро интерпретатора для законченных приложений» . Справочник по языкам программирования . IV: Языки функционального и логического программирования (1-е изд.). Техническое издание Macmillan: 87–104 . ISBN 1-57870-011-6 .
Внешние ссылки [ править ]
- Официальный сайт
- Справочное руководство Guile на одной длинной веб-странице
- Исходный код на GNU Savannah программного обеспечения платформе
- Что такое подлость?
- «Краткая история лукавства» (из руководства «Коварство»)
- Интервью 2003 года с сопровождающим GNU Guile Мариусом Фоллмером.