stringtranslate.com

GNU Коварство

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

В прошлом было несколько незавершенных попыток заменить или дополнить язык расширения 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 make может быть построен с поддержкой GNU Guile как встроенного языка расширений. [34]

Рекомендации

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

дальнейшее чтение

Внешние ссылки