GNU Ubiquitous Intelligent Language for Extensions [3] ( GNU Guile ) es el sistema de lenguaje de extensión preferido para el Proyecto GNU [4] y presenta una implementación del lenguaje de programación Scheme . Su primera versión fue lanzada en 1993. [1] Además de gran parte de los estándares de Scheme, Guile Scheme incluye extensiones modularizadas para muchas tareas de programación diferentes. [5] [6]
Familia | Ceceo |
---|---|
Diseñada por | Aubrey Jaffer, Tom Lord y Miles Bader |
Desarrollador | Proyecto GNU |
Apareció por primera vez | 1993 [1] |
Lanzamiento estable | |
Plataforma | IA-32 , x86-64 |
SO | Linux , BSD , Windows (a través de MinGW o Cygwin ) |
Licencia | GNU LGPLv3 + |
Extensiones de nombre de archivo | .scm .go (objeto de astucia) |
Sitio web | gnu |
Influenciado por | |
Lisp , esquema , SCM |
Para ampliar programas, Guile ofrece libguile, que permite que el lenguaje se incruste en otros programas y se integre estrechamente a través de la interfaz de programación de aplicaciones (API) del lenguaje C ; De manera similar, los nuevos tipos de datos y subrutinas definidos a través de la API de C pueden estar disponibles como extensiones de Guile. [7]
Guile se usa en programas como GnuCash , LilyPond , GNU Guix , GNU Debugger , GNU TeXmacs y el cisma de Google . [8]
Esquema de astucia
Guile es un esquema de uso general , de alto nivel de lenguaje de programación cuya flexibilidad permite expresar conceptos en un menor número de líneas de código que sería posible en lenguajes como C . Por ejemplo, su sistema de macros higiénico permite agregar elementos de sintaxis específicos del dominio sin modificar Guile. Guile implementa el estándar de esquema R5RS, la mayoría de R6RS y R7RS, [9] varias solicitudes de esquema para implementación (SRFI) y muchas extensiones propias.
La idea central de Guile Scheme es que "el desarrollador implementa algoritmos críticos y estructuras de datos en C o C ++ y exporta las funciones y tipos para que los utilice el código interpretado. La aplicación se convierte en una biblioteca de primitivas orquestadas por el intérprete, combinando la eficiencia código con la flexibilidad de interpretación ". [10] Por lo tanto, Guile Scheme (y otros lenguajes implementados por Guile) se pueden ampliar con nuevos tipos de datos y subrutinas implementadas a través de la API de C.
La distribución estándar ofrece módulos para llamadas al sistema de Interfaz de sistema operativo portátil ( POSIX ), programación , una interfaz de función externa , procesamiento XML basado en expresiones S a través de SXML , SXPath y SXSLT, HTTP y otras API de la World Wide Web , continuaciones delimitadas , programación de arreglos , [11] y otras funciones. [5] [6] Los programas de Guile pueden utilizar las funciones de SLIB , la biblioteca portátil de Scheme. [12]
Detalles de implementacion
Cuando se usan continuaciones con call / cc , un requisito del estándar Scheme, Guile copia la pila de ejecución en el montón y viceversa. [13]
Debido a que el código externo puede tener punteros a los objetos de Scheme, Guile usa el recolector de basura conservador Boehm-Demers-Weiser (BDW) . [ cita requerida ]
Historia
El manual de Guile brinda detalles sobre el inicio y la historia temprana del idioma. [14] A continuación se presenta un breve resumen:
Después del éxito de Emacs en la comunidad de software libre , como una aplicación altamente extensible y personalizable a través de su lenguaje de extensión (y en parte implementación) Emacs Lisp , la comunidad comenzó a considerar cómo esta estrategia de diseño podría aplicarse al resto del sistema GNU. Tom Lord inicialmente comenzó a trabajar en un tiempo de ejecución de lenguaje integrable llamado GNU Extension Language (GEL), que se basaba en la implementación de Scheme SCM de Aubrey Jaffer (que a su vez se basaba en el SIOD de George Carrette ). [15] [16] Lord convenció a Richard Stallman de hacer de GEL el lenguaje de extensión oficial del proyecto GNU, basándose en el argumento de que Scheme era un dialecto Lisp más limpio que Emacs Lisp, y que GEL podría evolucionar para implementar otros lenguajes en el mismo tiempo de ejecución. , a saber, Emacs Lisp. Después de que Lord descubrió que GEL tenía un conflicto de nombres con otro lenguaje de programación, solicitó sugerencias para un nuevo nombre. De varias contribuciones en varios grupos de noticias de Usenet , Lord eligió controvertidamente a Guile a partir de una sugerencia de Lee Thomas. [17] [18] [19] [20]
Durante el desarrollo de Guile (entonces GEL) y antes de su lanzamiento público, el lenguaje de extensión Tcl estaba ganando popularidad y se estaba promocionando como un lenguaje de extensión universal. Stallman vio a Tcl como un lenguaje de extensión insuficiente, y publicó una crítica al grupo de noticias comp.lang.tcl, que inició una guerra de llamas conocida como la "Guerra de Tcl". [21] Dado que el anuncio público del proyecto Guile coincidió con el debate de Tcl, se ha convertido en un error común pensar que Guile comenzó como una reacción a esto.
Después del lanzamiento inicial de Guile, el desarrollo languideció durante muchos años, pero 2009-2010 vio mejoras importantes, [22] y Guile 2.0 se lanzó en 2011 con una nueva infraestructura de compilación , una implementación de máquina virtual , un cambio a Boehm – Demers– Recolector de basura Weiser , muchas mejoras en el lenguaje Guile Scheme y otros cambios importantes. [23]
Uno de los objetivos de Guile es permitir que se usen otros lenguajes junto con Scheme, de modo que Guile sea efectivamente un entorno de ejecución de lenguaje neutro. Se han hecho varios intentos de esto en versiones pasadas: un dialecto de Scheme que difiere esencialmente solo en su sintaxis similar a C, una traducción de Emacs Lisp , un convertidor de Tcl motivado por tkWWW , y algo parecido al lenguaje Logo . [24] Con la versión 2.0, el proyecto pasó con éxito a un enfoque de torre de compiladores , permitiendo la definición de compiladores de un lenguaje a otro, típicamente de uno de nivel superior a una representación intermedia de nivel inferior , y eventualmente código de bytes de máquina virtual o nativo. código de máquina . [25] [26]
El 16 de marzo de 2017, se lanzó Guile 2.2.0 con un nuevo compilador de optimización y una máquina virtual de registro de alto rendimiento. Según el anuncio de lanzamiento de Andy Wingo, los programas del mundo real a menudo mostraban una aceleración del 30% o más con Guile 2.2 en comparación con la serie 2.0 anterior. Guile 2.2.0 también redujo el uso de memoria, aceleró el intérprete "eval", proporcionó un mejor soporte para la programación de múltiples núcleos y eliminó cualquier límite fijo en las llamadas a funciones recursivas. También apoyó la creación de facilidades de concurrencia en el espacio de usuario que multiplexan millones de "fibras" ligeras concurrentes y proporcionó una implementación completa de Elisp compatible con Emacs, implementando todas las características y peculiaridades de Elisp de la misma manera que Emacs. [27]
El 16 de enero de 2020, se lanzó Guile 3.0.0 con generación de código nativo justo a tiempo ( JIT ) para un rendimiento mucho mayor. En comparación con 2.2, el rendimiento del microbenchmark es aproximadamente el doble de bueno en general, mientras que algunos benchmarks individuales son hasta 32 veces más rápidos. También contó con soporte para definiciones y expresiones intercaladas en contextos léxicos, soporte nativo para excepciones estructuradas, mejor soporte para los estándares del esquema R6RS y R7RS y muchas optimizaciones. [28] [29]
Integración de Emacs
Ha habido varios intentos pasados sin terminar de reemplazar o complementar el lenguaje de extensión Emacs Lisp (Elisp) de Emacs con Guile, en paralelo a los esfuerzos de soportar otros lenguajes en Guile. [ cita requerida ]
Con la versión 2.0 de Guile, ha comenzado un nuevo intento de implementar Elisp en la torre del compilador de Guile y reemplazar la implementación de Elisp de Emacs con la de libguile y se ha logrado un progreso significativo a través de los proyectos de Google Summer of Code . [30] Un Emacs basado en Guile podría ofrecer un mejor rendimiento de ejecución para Emacs Lisp, admitir nuevas características del lenguaje Emacs Lisp más fácilmente, hacer que las bibliotecas Guile escritas en otros lenguajes de programación estén disponibles para el código Emacs Lisp y permitir escribir extensiones de Emacs en otros lenguajes de programación compatibles por Guile, todo sin dejar de ser totalmente compatible con las bases de código existentes de Emacs Lisp.
A octubre de 2014[actualizar], la implementación había llegado a una etapa en la que Guile Emacs es capaz de ejecutar de manera confiable la mayoría del código Lisp de Emacs. Los problemas restantes o posibles problemas involucran la diferente representación interna de las cadenas Emacs Lisp de las cadenas Scheme, la diferencia entre cómo Emacs Lisp y Scheme tratan los objetos booleanos de lista falsa y vacía, las macros Emacs Lisp no se integran con Scheme, Emacs Lisp no ha sido diseñado concurrencia, y la portabilidad de Guile a plataformas soportadas por Emacs. Otras preocupaciones planteadas por la comunidad de Emacs incluyen los tamaños relativos de las comunidades de Emacs y Guile, y si causaría división en la comunidad si Emacs fuera extensible en lenguajes de programación distintos a Emacs Lisp. [31]
Integración GNU Make
GNU make puede construirse con soporte para GNU Guile como un lenguaje de extensión integrado. [32]
Referencias
- ↑ a b Blandy, 1997, p. 102.
- ^ a b "GNU Guile 3.0.7 lanzado" . gnu.org.
- ^ "GNU Guile (Acerca de Guile)" . Proyecto GNU.
Guile es el lenguaje inteligente ubicuo de GNU para extensiones, el lenguaje de extensión oficial para el sistema operativo GNU.
- ^ "Estándares de codificación GNU, qué lenguajes utilizar" . Proyecto GNU.
- ^ a b "Guile Manual, API Reference" . Proyecto GNU.
- ^ a b "Manual de Guile, módulos de Guile" . Proyecto GNU.
- ^ "Para fomentar la personalización, Guile proporciona interfaces extensas, lo que permite que el código C interactúe con el mundo de Scheme. El código C puede crear, acceder y mutar objetos de Scheme libremente; las funciones de Cpueden llamar a funciones de Scheme y viceversa; el código C puede agregar nuevos tipos al mundo de Scheme y aprovechar la recolección de basura de Guile ... La mayoría de los procedimientos de Scheme estándar se implementan mediante funciones C, visibles para los clientes de Guile; por ejemplo, las aplicaciones pueden llamar a la función C
scm_cons
, que es la implementación subyacente de los procedimientos de Schemecons
". Blandy 1997, págs.94, 96. - ^ "Aplicaciones que utilizan Guile" . Proyecto GNU. Archivado desde el original el 24 de noviembre de 2017.
- ^ "Incompatibilidades R7RS (Manual de referencia de Guile)" . Proyecto GNU . Consultado el 20 de enero de 2020 .
- ^ Blandy 1997, p. 87.
- ^ "Guile Manual, matrices" . Proyecto GNU.
- ^ "Manual de astucia, SLIB" . Proyecto GNU.
SLIB no está incluido en la distribución de Guile, pero se puede instalar por separado.
- ^ "Debido a que Guile permite que las funciones externas y las funciones de Scheme se llamen entre sí libremente, una continuación de Guile puede incluir marcos de pila C y Scheme. Para simplificar, la implementación de Guile de
call/cc
copia toda la pila C en el montón; invocar una continuación copia la pila de nuevo del montón y utiliza lalongjmp
función para reactivarlo. Esta implementación tiene una serie de inconvenientes ... ", Blandy 1997, p. 99. - ^ "Manual de astucia, Historia" .
- ^ "Es difícil determinar quién diseñó Guile. Seguramente una gran parte del crédito pertenece a Aubrey Jaffer, cuyo excelente intérprete de Scheme, SCM, forma el núcleo de la implementación. El sistema de módulos fue diseñado y construido por Miles Bader ..." "Un Anatomía de la astucia, la interfaz con Tcl / Tk ", 1995
- ^ "Aquí hay una historia muy, muy breve de este intérprete. Espero que las personas involucradas en su pasado contribuyan más a este documento. SIOD: George Carrette escribió SIOD, la versión más antigua. Aunque la mayor parte de este código ha sido reescrito o reemplazado con el tiempo, el recolector de basura de SIOD sigue siendo una parte importante de Guile. SIOD todavía se desarrolla activamente y está disponible gratuitamente. Tiene una huella muy pequeña ". Guile Scheme 1995.
- ^ "El nombre Guile fue sugerido por primera vez en una discusión de Usenet por Lee Thomas". Guile Scheme 1995.
- ^ Lee Thomas (4 de noviembre de 1994). "El nombre de la rosa" . Grupo de noticias : gnu.misc.discuss .
- ^ "GUILE - dos razones más para preferirlo" .
- ^ "GEL: Cambio de nombre importante" .
- ^ Archivos de la guerra de Tcl
- ^ Wingo, Andy. "Entradas de blog más antiguas para wingo (a partir del número 328)" . Advogato.
- ^ "Guile News" . Proyecto GNU. Archivado desde el original el 28 de marzo de 2014.
- ^ Lord, Thomas (julio de 1995). "An Anatomy of Guile The Interface to Tcl / Tk" ( PostScript ) . Tercer Taller Anual de Tcl / Tk . Toronto, Ontario, Canadá: Usenix . Consultado el 23 de noviembre de 2010 .
- ^ "Manual de astucia, otros idiomas" . Proyecto GNU.
Guile sigue siendo fundamentalmente un esquema, pero intenta admitir una amplia variedad de bloques de construcción de idiomas, de modo que se puedan implementar otros lenguajes además de Guile.
- ^ "Guile Manual, Compiler Tower" . Proyecto GNU.
Guile define una torre de lenguajes, comenzando en Scheme y simplificándose progresivamente hasta lenguajes que se asemejan al conjunto de instrucciones de VM.
- ^ "GNU Guile 2.2.0 lanzado" . 2017-03-16 . Consultado el 20 de enero de 2020 .
- ^ "GNU Guile 3.0.0 lanzado" . 2020-01-16 . Consultado el 20 de enero de 2020 .
- ^ "GNU Guile 3.0.0 lanzado" . 2020-01-16 . Consultado el 20 de enero de 2020 .
- ^ "Re. ¿Implementación de Elisp?" . BT Templeton.
- ^ "El futuro de Emacs, Guile y Emacs Lisp" .
- ^ "12.1 Integración de GNU Guile" . gnu.org . Consultado el 16 de marzo de 2020 .
Otras lecturas
- "An Anatomy of Guile, The Interface to Tcl / Tk" (1995)
- Blandy, Jim (1998). Peter H. Salus (ed.). "Guile: un intérprete básico para aplicaciones completas" . Manual de lenguajes de programación (1ª ed.). Publicaciones técnicas de Macmillan. IV: Lenguajes de programación lógicos y funcionales: 87–104 . ISBN 1-57870-011-6.
enlaces externos
- Página web oficial
- Manual de referencia de Guile en una página web larga
- Código fuente en la fragua del software GNU Savannah
- ¿Qué es la astucia?
- "Una breve historia de la astucia" (del manual de la astucia)
- Una entrevista de 2003 con el mantenedor de GNU Guile, Marius Vollmer