Английская Википедия:GNU Guile

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Шаблон:Short description Шаблон:Infobox programming language

GNU Ubiquitous Intelligent Language for Extensions[1] (GNU Guile) is the preferred extension language system for the GNU Project[2] and features an implementation of the programming language Scheme. Its first version was released in 1993.[3] In addition to large parts of Scheme standards, Guile Scheme includes modularized extensions for many different programming tasks.[4][5]

For extending programs, Guile offers libguile which allows the language to be embedded in other programs, and integrated closely through the C language application programming interface (API); similarly, new data types and subroutines defined through the C API can be made available as extensions to Guile.[6]

Guile is used in many programs under the GNU project umbrella (GDB, Make, Guix, GNU TeXmacs, GnuCash, LilyPond Lepton-EDA...)[7] but it also sees use outside of that, for example in Google's schism.

Guile Scheme

Guile Scheme is a general-purpose, high-level programming language whose flexibility allows expressing concepts in fewer lines of code than would be possible in languages such as C. For example, its hygienic macro system allows adding domain specific syntax-elements without modifying Guile. Guile implements the Scheme standard R5RS, most of R6RS and R7RS,[8] several Scheme Requests for Implementation (SRFI), and many extensions of its own.

The core idea of Guile Scheme is that "the developer implements critical algorithms and data structures in C or C++ and exports the functions and types for use by interpreted code. The application becomes a library of primitives orchestrated by the interpreter, combining the efficiency of compiled code with the flexibility of interpretation."[9] Thus Guile Scheme (and other languages implemented by Guile) can be extended with new data types and subroutines implemented through the C API.

The standard distribution offers modules for Portable Operating System Interface (POSIX) system calls, scheduling, a foreign function interface, S-expression based XML processing through SXML, SXPath, and SXSLT, HTTP and other World Wide Web APIs, delimited continuations, array programming,[10] and other functionality.[4][5] Guile programs can use facilities from SLIB, the portable Scheme library.[11]

Implementation details

When using continuations with call/cc, a requirement of the Scheme standard, Guile copies the execution stack into the heap and back.[12] Its manual suggests using delimited continuations instead, because they have a more efficient implementation.[13]

Because foreign code may have pointers to Scheme objects, Guile uses the conservative Boehm–Demers–Weiser (BDW) garbage collector.[14]

History

The Guile manual gives details of the inception and early history of the language.[15] A brief summary follows:

After the success of Emacs in the free software community, as a highly extensible and customizable application via its extension (and partly implementation) language Emacs Lisp, the community began to consider how this design strategy could apply to the rest of the GNU system. Tom Lord initially began work on an embeddable language runtime named the GNU Extension Language (GEL), which was based on Aubrey Jaffer's Scheme implementation SCM (which in turn was based on George Carrette's SIOD).[16][17] Lord convinced Richard Stallman to make GEL the official extension language of the GNU project, based on the argument that Scheme was a cleaner Lisp dialect than Emacs Lisp, and that GEL could evolve to implement other languages on the same runtime, namely Emacs Lisp. After Lord discovered GEL had a naming conflict with another programming language, he solicited suggestions for a new name. From several contributions in several Usenet newsgroups, Lord controversially chose Guile from a suggestion by Lee Thomas.[18][19][20][21]

During the development of Guile (then GEL) and before its public release, the extension language Tcl was gaining popularity and being pushed as a universal extension language. Stallman saw Tcl as being underpowered as an extension language, and posted a criticism to the comp.lang.tcl newsgroup, which initiated a flamewar known as the "Tcl War".[22] Since the public announcement of the Guile project coincided with the Tcl debate, it has become a common misconception that Guile began as a reaction to this.

After the initial release of Guile, development languished for many years, but 2009–2010 saw major improvements,[23] and Guile 2.0 was released in 2011 with a new compiler infrastructure, a virtual machine implementation, a switch to the Boehm–Demers–Weiser garbage collector, many improvements to the Guile Scheme language, and other major changes.[24]

One of the goals of Guile is to allow other languages to be used alongside Scheme, such that Guile would effectively be a language-neutral runtime environment. Various attempts at this have been made in past versions: a dialect of Scheme essentially differing only in its C-like syntax, a translation of Emacs Lisp, a Tcl converter motivated by tkWWW, and something roughly resembling the language Logo.[25] With version 2.0, the project successfully transitioned to a compiler tower approach, allowing the definition of compilers from one language to another, typically from a higher-level one to a lower-level intermediate representation, and eventually virtual machine bytecode or native machine code.[26][27]

On 16 Mar 2017, Guile 2.2.0 was released with a new optimizing compiler and high-performance register virtual machine. According to the release announcement by Andy Wingo, real-world programs often showed a speedup of 30% or more with Guile 2.2 when compared to the previous 2.0 series. Guile 2.2.0 also lowered memory usage, sped up the "eval" interpreter, provided better support for multi-core programming, and removed any fixed limit on recursive function calls. It also supported the creation of user-space concurrency facilities that multiplex millions of concurrent lightweight "fibers" and provided a complete Emacs-compatible Elisp implementation, implementing all of Elisp's features and quirks in the same way as Emacs.[28]

On 16 January 2020, Guile 3.0.0 was released with just-in-time (JIT) native code generation for much greater performance. Compared to 2.2, microbenchmark performance is around twice as good on the whole, while some individual benchmarks are up to 32 times as fast. It also featured support for interleaved definitions and expressions in lexical contexts, native support for structured exceptions, better support for the R6RS and R7RS Scheme standards and many optimizations.[29][30]

Шаблон:Lisp

Emacs integration

There have been several past unfinished attempts to replace or supplement the Emacs Lisp extension language with Guile, parallel to the efforts of supporting other languages in Guile.Шаблон:Citation needed

With version 2.0 of Guile, a new attempt at implementing Elisp on the Guile compiler tower and replacing Emacs's Elisp implementation with that of libguile has begun and made significant progress through Google Summer of Code projects.[31] A Guile-based Emacs could offer better execution performance for Emacs Lisp, support new Emacs Lisp language features more easily, make Guile libraries written in other programming languages available to Emacs Lisp code, and allow writing Emacs extensions in other programming languages supported by Guile, all while remaining fully backward compatible with existing Emacs Lisp code bases.

Шаблон:As of, the implementation had reached a stage where Guile Emacs is able to reliably run most Emacs Lisp code. Remaining problems or possible problems involve the different internal representation of Emacs Lisp strings from Scheme strings, the difference between how Emacs Lisp and Scheme treat the Boolean false and empty list objects, Emacs Lisp macros not integrating with Scheme, Emacs Lisp not having been designed for concurrency, and the portability of Guile to platforms supported by Emacs. Other concerns raised by the Emacs community include the relative sizes of the Emacs and Guile communities, and whether it would cause splitting in the community if Emacs were extensible in programming languages other than Emacs Lisp.[32]

GNU Make integration

GNU make can be built with support for GNU Guile as an embedded extension language.[33]

References

Шаблон:Reflist

Further reading

External links

Шаблон:Portal

Шаблон:GNU Шаблон:Lisp programming language

  1. Ошибка цитирования Неверный тег <ref>; для сносок About Guile не указан текст
  2. Ошибка цитирования Неверный тег <ref>; для сносок GNU coding standards не указан текст
  3. Ошибка цитирования Неверный тег <ref>; для сносок blandy1997 не указан текст
  4. 4,0 4,1 Ошибка цитирования Неверный тег <ref>; для сносок Manual, API Reference не указан текст
  5. 5,0 5,1 Ошибка цитирования Неверный тег <ref>; для сносок Manual, Guile Modules не указан текст
  6. Ошибка цитирования Неверный тег <ref>; для сносок Blandy quote C integration не указан текст
  7. Ошибка цитирования Неверный тег <ref>; для сносок Applications using Guile не указан текст
  8. Ошибка цитирования Неверный тег <ref>; для сносок R7RS не указан текст
  9. Blandy 1997, p. 87.
  10. Ошибка цитирования Неверный тег <ref>; для сносок Manual, Arrays не указан текст
  11. Ошибка цитирования Неверный тег <ref>; для сносок Manual, SLIB не указан текст
  12. Ошибка цитирования Неверный тег <ref>; для сносок Blandy quote call/cc не указан текст
  13. Ошибка цитирования Неверный тег <ref>; для сносок Guile Reference Manual Continuations Section не указан текст
  14. Ошибка цитирования Неверный тег <ref>; для сносок Guile Reference Manual Conservative GC Section не указан текст
  15. Ошибка цитирования Неверный тег <ref>; для сносок Manual, History не указан текст
  16. Ошибка цитирования Неверный тег <ref>; для сносок Bader quote SCM не указан текст
  17. Ошибка цитирования Неверный тег <ref>; для сносок Guile Scheme 1995 quote SIOD не указан текст
  18. Ошибка цитирования Неверный тег <ref>; для сносок Thomas coin name не указан текст
  19. Ошибка цитирования Неверный тег <ref>; для сносок Thomas coins name gnu group не указан текст
  20. Ошибка цитирования Неверный тег <ref>; для сносок Thomas promotes GUILE name не указан текст
  21. Ошибка цитирования Неверный тег <ref>; для сносок GEL:Important Name Change не указан текст
  22. Archives of the Tcl War
  23. Ошибка цитирования Неверный тег <ref>; для сносок 2010 improvements не указан текст
  24. Ошибка цитирования Неверный тег <ref>; для сносок Guile NEWS не указан текст
  25. Ошибка цитирования Неверный тег <ref>; для сносок An Anatomy of Guile не указан текст
  26. Ошибка цитирования Неверный тег <ref>; для сносок Manual, Other Languages не указан текст
  27. Ошибка цитирования Неверный тег <ref>; для сносок Manual, Compiler Tower не указан текст
  28. Ошибка цитирования Неверный тег <ref>; для сносок guile_2.2 не указан текст
  29. Ошибка цитирования Неверный тег <ref>; для сносок guile_3.0_news не указан текст
  30. Ошибка цитирования Неверный тег <ref>; для сносок guile_3.0_announce не указан текст
  31. Ошибка цитирования Неверный тег <ref>; для сносок BT Templeton Elisp implementation не указан текст
  32. Шаблон:Cite web
  33. Шаблон:Cite web