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]
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 ), планирования , интерфейса внешних функций , обработки 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 использует консервативный сборщик мусора Бема-Демерса-Вайзера (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] , а в 2011 году был выпущен Guile 2.0 с новой инфраструктурой компилятора , реализацией виртуальной машины и переходом на схему Бема-Демерса- Сборщик мусора Weiser , множество улучшений языка 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]
В прошлом было несколько незавершенных попыток заменить или дополнить язык расширения 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 обрабатывают логические объекты ложного и пустого списка, макросы Emacs Lisp, не интегрируемые со Scheme, Emacs Lisp не предназначен для параллелизм и переносимость Guile на платформы, поддерживаемые Emacs. Другие опасения, поднятые сообществом Emacs, включают относительные размеры сообществ Emacs и Guile, а также то, приведет ли это к расколу сообщества, если Emacs будет расширяться на других языках программирования, кроме Emacs Lisp. [33]
GNU make может быть построен с поддержкой GNU Guile как встроенного языка расширений. [34]
Guile — это вездесущий интеллектуальный язык расширений GNU, официальный язык расширений для операционной системы GNU.
scm_cons
, которая является базовой реализацией процедур Scheme cons
». Блэнди 1997, стр. 94, 96.SLIB не входит в дистрибутив Guile, но может быть установлен отдельно.
call/cc
весь стек C в кучу; вызов продолжения копирует стек обратно из кучи и использует longjmp
функцию для ее повторной активации. Эта реализация имеет ряд недостатков...", Blandy 1997, с. 99.Guile по своей сути по-прежнему является схемой, но он пытается поддерживать широкий спектр языковых строительных блоков, чтобы другие языки могли быть реализованы поверх Guile.
Guile определяет башню языков, начиная со Scheme и постепенно упрощая до языков, напоминающих набор команд виртуальной машины.