GNU Ubiquitous Intelligent Language for Extensions [3] ( GNU Guile ) es el sistema de lenguaje de extensión preferido por 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 grandes partes de los estándares de Scheme, Guile Scheme incluye extensiones modularizadas para muchas tareas de programación diferentes. [5] [6]
Para ampliar los programas, Guile ofrece libguile , que permite que el lenguaje se incorpore 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, nuevos tipos de datos y subrutinas definidas a través de la API de C pueden estar disponibles como extensiones de Guile. [7]
Guile se utiliza en muchos programas bajo el paraguas del proyecto GNU ( GDB , Make , Guix , GNU TeXmacs , GnuCash , LilyPond , Lepton-EDA...) [8] pero también se utiliza fuera de él, por ejemplo en el cisma de Google.
Guile Scheme es un lenguaje de programación de alto nivel y propósito general cuya flexibilidad permite expresar conceptos en menos líneas de código de lo 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 Scheme R5RS, la mayoría de R6RS y R7RS, [9] varias solicitudes de implementación de Scheme (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 use el código interpretado. La aplicación se convierte en una biblioteca de primitivas orquestadas por el intérprete, que combina la eficiencia del código compilado con la flexibilidad de la interpretación". [10] De este modo, 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 POSIX (Portable Operating System Interface ), programación , una interfaz de funciones externas , procesamiento XML basado en S-expresiones a través de SXML , SXPath y SXSLT, HTTP y otras API de la World Wide Web , continuaciones delimitadas , programación de matrices , [11] y otras funcionalidades. [5] [6] Los programas Guile pueden utilizar las facilidades de SLIB , la biblioteca portátil de Scheme. [12]
Al utilizar continuaciones con call/cc , un requisito del estándar Scheme, Guile copia la pila de ejecución en el montón y viceversa. [13] Su manual sugiere utilizar continuaciones delimitadas en su lugar, porque tienen una implementación más eficiente. [14]
Dado que el código externo puede tener punteros a objetos Scheme, Guile utiliza el recolector de basura conservador Boehm–Demers–Weiser (BDW) . [15]
El manual de Guile ofrece detalles sobre el origen y la historia temprana del idioma. [16] A continuación se ofrece 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 de 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 entorno 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 SIOD de George Carrette ). [17] [18] Lord convenció a Richard Stallman para que hiciera de GEL el lenguaje de extensión oficial del proyecto GNU, basándose en el argumento de que Scheme era un dialecto de Lisp más limpio que Emacs Lisp, y que GEL podía evolucionar para implementar otros lenguajes en el mismo entorno de ejecución, a saber, Emacs Lisp. Después de que Lord descubriera 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ó polémicamente Guile a partir de una sugerencia de Lee Thomas. [19] [20] [21] [22]
Durante el desarrollo de Guile (en aquel entonces GEL) y antes de su lanzamiento público, el lenguaje de extensión Tcl estaba ganando popularidad y se lo promocionaba como lenguaje de extensión universal. Stallman consideró que Tcl no era lo suficientemente potente como lenguaje de extensión y publicó una crítica en el grupo de noticias comp.lang.tcl, lo que inició una guerra de ideas conocida como la "Guerra Tcl". [23] Dado que el anuncio público del proyecto Guile coincidió con el debate sobre 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 entre 2009 y 2010 se vieron mejoras importantes, [24] y Guile 2.0 se lanzó en 2011 con una nueva infraestructura de compilador , una implementación de máquina virtual , un cambio al recolector de basura Boehm-Demers-Weiser , muchas mejoras en el lenguaje Guile Scheme y otros cambios importantes. [25]
Uno de los objetivos de Guile es permitir que se utilicen otros lenguajes junto con Scheme, de modo que Guile sea efectivamente un entorno de ejecución neutral en cuanto al lenguaje. Se han hecho varios intentos en versiones anteriores: un dialecto de Scheme que difiere esencialmente solo en su sintaxis similar a C, una traducción de Emacs Lisp , un convertidor Tcl motivado por tkWWW y algo que se parece más o menos al lenguaje Logo . [26] Con la versión 2.0, el proyecto realizó una transición exitosa a un enfoque de torre de compiladores , lo que permite la definición de compiladores de un lenguaje a otro, típicamente de uno de nivel superior a uno de nivel inferior , y eventualmente código de bytes de máquina virtual o código de máquina nativo . [27] [28]
El 16 de marzo de 2017, se lanzó Guile 2.2.0 con un nuevo compilador optimizador 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 multinúcleo y eliminó cualquier límite fijo en las llamadas de función recursivas. También admitió la creación de instalaciones de concurrencia en el espacio de usuario que multiplexan millones de "fibras" livianas concurrentes y proporcionó una implementación de Elisp completamente compatible con Emacs, implementando todas las características y peculiaridades de Elisp de la misma manera que Emacs. [29]
El 16 de enero de 2020, se lanzó Guile 3.0.0 con generación de código nativo Just-in-Time ( JIT ) para un rendimiento mucho mayor. En comparación con 2.2, el rendimiento de microbenchmark es aproximadamente el doble de bueno en general, mientras que algunos benchmarks individuales son hasta 32 veces más rápidos. También presentó soporte para definiciones y expresiones intercaladas en contextos léxicos, soporte nativo para excepciones estructuradas, mejor soporte para los estándares R6RS y R7RS Scheme y muchas optimizaciones. [30] [31]
Hubo varios intentos inconclusos en el pasado de reemplazar o complementar el lenguaje de extensión Emacs Lisp con Guile, en paralelo a los esfuerzos por dar soporte a otros lenguajes en Guile. [ cita requerida ]
Con la versión 2.0 de Guile, se ha iniciado un nuevo intento de implementar Elisp en la torre del compilador 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 . [32] Un Emacs basado en Guile podría ofrecer un mejor rendimiento de ejecución para Emacs Lisp, soportar 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 soportados por Guile, todo ello mientras se mantiene totalmente compatible con las bases de código Emacs Lisp existentes.
En octubre de 2014 [actualizar], la implementación había alcanzado una etapa en la que Guile Emacs puede ejecutar de manera confiable la mayoría del código Emacs Lisp. Los problemas restantes o posibles problemas involucran la diferente representación interna de las cadenas de Emacs Lisp de las cadenas de Scheme, la diferencia entre cómo Emacs Lisp y Scheme tratan los objetos de lista vacía y falsa booleana, las macros de Emacs Lisp que no se integran con Scheme, Emacs Lisp no ha sido diseñado para la concurrencia y la portabilidad de Guile a plataformas compatibles con 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 de Emacs Lisp. [33]
GNU make se puede crear con soporte para GNU Guile como lenguaje de extensión incorporado. [34]
Guile es el lenguaje ubicuo e inteligente de GNU para extensiones, el lenguaje de extensión oficial para el sistema operativo GNU.
scm_cons
, que es la implementación subyacente de los procedimientos de Scheme cons
". Blandy 1997, págs. 94, 96.SLIB no está incluido en la distribución de Guile, pero puede instalarse por separado.
call/cc
copia toda la pila de C en el montón; al invocar una continuación, se copia la pila desde el montón y se utiliza la longjmp
función para reactivarla. Esta implementación tiene una serie de desventajas...", Blandy 1997, pág. 99.Guile sigue siendo fundamentalmente un Scheme, pero intenta dar soporte a una amplia variedad de bloques de construcción de lenguajes, de modo que se puedan implementar otros lenguajes sobre Guile.
Guile define una torre de lenguajes, comenzando por Scheme y simplificándose progresivamente hasta llegar a lenguajes que se asemejan al conjunto de instrucciones de VM.