Из Википедии, свободной энциклопедии
Перейти к навигации Перейти к поиску

GNU Ubiquitous Intelligent Language for Extensions [3] ( GNU Guile ) - это предпочтительная языковая система расширений для проекта GNU [4], в которой реализована реализация языка программирования Scheme . Его первая версия была выпущена в 1993 году. [1] В дополнение к значительной части стандартов Scheme, Guile Scheme включает модульные расширения для множества различных задач программирования. [5] [6]

Для расширения программ Guile предлагает libguile, который позволяет встраивать язык в другие программы и тесно интегрировать его через интерфейс прикладного программирования (API) языка C ; аналогично новые типы данных и подпрограммы, определенные через C API, могут быть доступны как расширения для Guile. [7]

Коварство используется в таких программах, как GnuCash , LilyPond , GNU Guix , GNU Debugger , GNU TeXmacs и раскол Google . [8]

Схема хитрости [ править ]

Коварство схема является универсальным , язык программирования высокого уровня , чья гибкость позволяет выражать концепции в меньшем количестве строк кода , чем было бы возможно в таких языках , как C . Например, его гигиеничная макросистема позволяет добавлять элементы синтаксиса, специфичные для домена, без изменения Guile. Guile реализует стандарт схемы R5RS, большую часть R6RS и R7RS, [9] несколько запросов схемы для реализации (SRFI) и множество собственных расширений.

Основная идея Guile Scheme заключается в том, что «разработчик реализует критические алгоритмы и структуры данных на C или C ++ и экспортирует функции и типы для использования интерпретируемым кодом. Приложение становится библиотекой примитивов, управляемых интерпретатором, объединяя эффективность скомпилированного кода. код с гибкостью интерпретации ". [10] Таким образом, Guile Scheme (и другие языки, реализованные Guile) могут быть расширены новыми типами данных и подпрограммами, реализованными через C API.

Стандартный дистрибутив предлагает модули для системных вызовов 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]

Поскольку внешний код может иметь указатели на объекты Scheme, Guile использует консервативный сборщик мусора Боэма – Демерса – Вейзера (BDW) . [ необходима цитата ]

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

В руководстве «Хитрость» подробно рассказывается о зарождении и ранней истории языка. [14] Ниже приводится краткое изложение:

После успеха Emacs в сообществе свободного программного обеспечения , как хорошо расширяемого и настраиваемого приложения с помощью своего языка расширений (и частично реализации) Emacs Lisp , сообщество начало рассматривать, как эту стратегию проектирования можно применить к остальной части системы GNU. Том Лорд изначально начал работу над встраиваемой языковой средой исполнения под названием GNU Extension Language (GEL), которая была основана на реализации схемы Обри Джаффера SCM (которая, в свою очередь, была основана на SIOD Джорджа Карретта ). [15] [16] Господь убедил Ричарда Столлманачтобы ГЕЛЬ официального языка расширения проекта GNU, основанный на том , что схема была чище Lisp диалектом , чем Emacs Lisp, и Лари может эволюционировать для реализации других языков на то же время выполнения, а именно Emacs Lisp. После того, как Лорд обнаружил, что GEL имеет конфликт имен с другим языком программирования, он запросил предложения по новому имени. Из нескольких статей в нескольких группах новостей Usenet Лорд выбрал Guile по предложению Ли Томаса. [17] [18] [19] [20]

Во время разработки Guile (затем GEL) и до его публичного выпуска язык расширений Tcl набирал популярность и продвигался как универсальный язык расширений. Столлман считал, что Tcl недостаточно мощный язык расширения, и отправил критику в группу новостей comp.lang.tcl, которая инициировала войну, известную как «Война за Tcl». [21] Поскольку публичное объявление о проекте Guile совпало с дебатами о Tcl, распространенным заблуждением стало то, что Guile возник как реакция на это.

После первоначального выпуска Guile разработка приостановилась на многие годы, но в 2009–2010 годах произошли серьезные улучшения [22], а в 2011 году был выпущен Guile 2.0 с новой инфраструктурой компилятора , реализацией виртуальной машины и переходом на версию Boehm – Demers– Сборщик мусора Weiser , множество улучшений языка Guile Scheme и другие важные изменения. [23]

Одна из целей Guile - разрешить использование других языков вместе со Scheme, так что Guile будет фактически независимой от языка средой выполнения. В прошлых версиях предпринимались различные попытки: диалект Scheme, существенно отличающийся только синтаксисом, подобным C, перевод Emacs Lisp , преобразователь Tcl, мотивированный tkWWW , и что-то примерно напоминающее язык Logo . [24] В версии 2.0 проект успешно перешел на подход башни компилятора , позволяющий определять компиляторы с одного языка на другой, обычно с более высокого уровня на промежуточное представление более низкого уровня , и в конечном итоге байт-код виртуальной машины или собственный машинный код . [25] [26]

16 марта 2017 года была выпущена Guile 2.2.0 с новым оптимизирующим компилятором и высокопроизводительной виртуальной машиной регистров. Согласно объявлению о выпуске Энди Винго, реальные программы часто показывали ускорение на 30% или более с Guile 2.2 по сравнению с предыдущей серией 2.0. Guile 2.2.0 также снизил использование памяти, ускорил интерпретатор eval, обеспечил лучшую поддержку многоядерного программирования и удалил все фиксированные ограничения на рекурсивные вызовы функций. Он также поддерживал создание средств параллелизма в пользовательском пространстве, которые мультиплексируют миллионы одновременных легких «волокон», и предоставлял полную Emacs-совместимую реализацию Elisp, реализующую все функции и особенности Elisp таким же образом, как и Emacs. [27]

16 января 2020 года была выпущена Guile 3.0.0 с генерацией собственного кода точно в срок ( JIT ) для гораздо большей производительности. По сравнению с 2.2 производительность микробенчмарков в целом примерно вдвое выше, а некоторые отдельные тесты до 32 раз быстрее. Он также имел поддержку чередующихся определений и выражений в лексических контекстах, встроенную поддержку структурированных исключений, лучшую поддержку стандартов схем R6RS и R7RS и множество оптимизаций. [28] [29]

Интеграция с Emacs [ править ]

В прошлом было несколько незаконченных попыток заменить или дополнить язык расширений Emacs Lisp (Elisp) Emacs с помощью Guile, параллельно с усилиями по поддержке других языков в Guile. [ необходима цитата ]

В версии 2.0 Guile началась новая попытка реализовать Elisp в башне компилятора Guile и заменить реализацию Emacs Elisp на реализацию libguile, которая добилась значительного прогресса в проектах Google Summer of Code . [30] Emacs на основе Guile может предложить лучшую производительность для Emacs Lisp, легче поддерживать новые языковые функции Emacs Lisp, сделать библиотеки Guile, написанные на других языках программирования, доступными для кода Emacs Lisp и позволить писать расширения Emacs на других поддерживаемых языках программирования. by Guile, при этом оставаясь полностью обратно совместимой с существующими базами кода Emacs Lisp.

По состоянию на октябрь 2014 года реализация достигла стадии, когда Guile Emacs может надежно запускать большую часть кода Emacs Lisp. Остающиеся проблемы или возможные проблемы включают в себя различное внутреннее представление строк Emacs Lisp от строк схемы, разницу между тем, как Emacs Lisp и Scheme обрабатывают логические объекты false и пустой список, макросы Emacs Lisp, не интегрирующиеся со Scheme, Emacs Lisp, не предназначенный для параллелизм и переносимость Guile на платформы, поддерживаемые Emacs. Другие проблемы, поднятые сообществом Emacs, включают относительные размеры сообществ Emacs и Guile, а также то, вызовет ли это разделение в сообществе, если Emacs будет расширяемым в языках программирования, отличных от Emacs Lisp. [31]

GNU Сделайте интеграцию [ править ]

GNU make может быть собран с поддержкой GNU Guile в качестве встроенного языка расширения. [32]

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

  1. ^ а б Бленди 1997, стр. 102.
  2. ^ a b «Выпущен GNU Guile 3.0.5» . gnu.org.
  3. ^ "GNU Guile (О Хитрости)" . Проект GNU. Guile - это универсальный интеллектуальный язык расширений GNU, официальный язык расширений для операционной системы GNU.
  4. ^ «Стандарты кодирования GNU, какие языки использовать» . Проект GNU.
  5. ^ a b «Руководство по хитрости, справочник по API» . Проект GNU.
  6. ^ a b "Руководство Хитрости, Модули Хитрости" . Проект GNU.
  7. ^ "Чтобы стимулировать настройку, Guile предоставляет расширенные интерфейсы, позволяющие коду C взаимодействовать с миром Scheme. Код C может свободно создавать, получать доступ и изменять объекты Scheme; функции Cмогут вызывать функции Scheme и наоборот; код C может добавлять новые типы в мир Scheme и воспользоваться преимуществами сборки мусора Guile ... Большинство стандартных процедур Scheme реализованы функциями C, видимыми для клиентов Guile; например, приложения могут вызывать функцию Cscm_cons, которая является базовой реализацией процедур Schemecons». Бланди 1997, с. 94, 96.
  8. ^ «Приложения, использующие хитрость» . Проект GNU. Архивировано 24 ноября 2017 года.
  9. ^ «Несовместимость с R7RS (Справочное руководство Guile)» . Проект GNU . Проверено 20 января 2020 .
  10. ^ Блэнди 1997, стр. 87.
  11. ^ "Руководство хитрости, массивы" . Проект GNU.
  12. ^ "Руководство хитрости, SLIB" . Проект GNU. SLIB не входит в дистрибутив Guile, но может быть установлен отдельно.
  13. ^ "Поскольку Guile позволяет сторонним функциям и функциям Scheme свободно вызывать друг друга, продолжение Guile может включать фреймы стека C и Scheme. Для простоты реализация Guilecall/ccкопирует весь стек C в кучу; вызов продолжения копирует стек обратно из кучи и использует этуlongjmpфункцию для его повторной активации. Эта реализация имеет ряд недостатков ... ", Blandy 1997, p. 99.
  14. ^ "Руководство Хитрости, История" .
  15. ^ «Трудно определить, кто разработал Guile. Большая доля заслуг, несомненно, принадлежит Обри Джафферу, чей превосходный интерпретатор схем, SCM, составляет ядро ​​реализации. Модульная система была разработана и построена Майлзом Бадером…» Анатомия хитрости. Интерфейс Tcl / Tk », 1995 г.
  16. ^ "Вот очень, очень краткая история этого интерпретатора. Я надеюсь, что люди, участвовавшие в его прошлом, внесут больший вклад в этот документ. SIOD: Джордж Карретт написал SIOD, самую раннюю версию. Хотя большая часть этого кода была переписана или замененаСовременем сборщик мусора от SIOD по-прежнему является важной частью Guile. SIOD все еще активно развивается и находится в свободном доступе. Он занимает очень мало места ». Схема хитрости 1995.
  17. ^ «Имя Guile было впервые предложено в обсуждении Usenet Ли Томасом». Схема хитрости 1995.
  18. ^ Ли Томас (1994-11-04). «Имя розы» . Группа новостейgnu.misc.discuss .
  19. ^ «GUILE - еще две причины предпочесть его» .
  20. ^ «GEL: Важное изменение имени» .
  21. ^ Архивы Tcl войны
  22. ^ Wingo, Энди. «Старые записи в блоге wingo (начиная с номера 328)» . Advogato.
  23. ^ "Новости хитрости" . Проект GNU. Архивировано из оригинала на 2014-03-28.
  24. Лорд, Томас (июль 1995 г.). «Анатомия хитрости. Интерфейс к Tcl / Tk» ( PostScript ) . Третий ежегодный семинар по Tcl / Tk . Торонто, Онтарио, Канада: Usenix . Проверено 23 ноября 2010 года .
  25. ^ "Руководство хитрости, другие языки" . Проект GNU. По сути, Guile по-прежнему является схемой, но она пытается поддерживать широкий спектр языковых строительных блоков, так что другие языки могут быть реализованы поверх Guile.
  26. ^ "Руководство хитрости, компиляторная башня" . Проект GNU. Guile определяет башню языков, начиная со схемы и постепенно упрощая до языков, которые напоминают набор инструкций виртуальной машины.
  27. ^ "Выпущен GNU Guile 2.2.0" . 2017-03-16 . Проверено 20 января 2020 .
  28. ^ "Выпущен GNU Guile 3.0.0" . 2020-01-16 . Проверено 20 января 2020 .
  29. ^ "Выпущен GNU Guile 3.0.0" . 2020-01-16 . Проверено 20 января 2020 .
  30. ^ "Re. Реализация Elisp?" . Б.Т. Темплтон.
  31. ^ «Будущее Emacs, Guile и Emacs Lisp» .
  32. ^ «12.1 GNU Guile Integration» . gnu.org . Дата обращения 16 марта 2020 .

Дальнейшее чтение [ править ]

  • "Анатомия хитрости, интерфейс Tcl / Tk" (1995)
  • Бленди, Джим (1998). Питер Х. Салус (ред.). «Коварство: ядро ​​интерпретатора для законченных приложений» . Справочник по языкам программирования (1-е изд.). Macmillan Technical Publishing. IV: Функциональные и логические языки программирования: 87–104 . ISBN 1-57870-011-6.

Внешние ссылки [ править ]

  • Официальный сайт
  • Справочное руководство Guile на одной длинной веб-странице
  • Исходный код на кузнице программного обеспечения GNU Savannah
  • Что такое коварство?
  • "Краткая история хитрости" (из руководства Хитрость)
  • Интервью 2003 года с сопровождающим GNU Guile Мариусом Фоллмером