stringtranslate.com

GNU Guile

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.

Esquema de engaño

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]

Detalles de implementación

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]

Historia

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]

Integración con Emacs

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 , 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]

Integración con GNU Make

GNU make se puede crear con soporte para GNU Guile como lenguaje de extensión incorporado. [34]

Referencias

  1. ^ desde Blandy 1997, pág. 102.
  2. ^ ab "Lanzamiento de GNU Guile 3.0.10". gnu.org.
  3. ^ "GNU Guile (Acerca de Guile)". Proyecto GNU. Guile es el lenguaje ubicuo e inteligente de GNU para extensiones, el lenguaje de extensión oficial para el sistema operativo GNU.
  4. ^ "Estándares de codificación GNU: qué lenguajes utilizar". Proyecto GNU.
  5. ^ ab "Manual de Guile, Referencia de API". Proyecto GNU.
  6. ^ ab "Manual de Guile, Módulos de Guile". Proyecto GNU.
  7. ^ "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 modificar libremente objetos de Scheme; las funciones de C pueden 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 estándar de Scheme son implementados por funciones de C, visibles para los clientes de Guile; por ejemplo, las aplicaciones pueden llamar a la función de C scm_cons, que es la implementación subyacente de los procedimientos de Scheme cons". Blandy 1997, págs. 94, 96.
  8. ^ "Aplicaciones que utilizan Guile". Proyecto GNU. Archivado desde el original el 24 de noviembre de 2017.
  9. ^ "Incompatibilidades de R7RS (Manual de referencia de Guile)". Proyecto GNU . Consultado el 20 de enero de 2020 .
  10. ^ Blandy 1997, pág. 87.
  11. ^ "Manual de Guile, Matrices". Proyecto GNU.
  12. ^ "Manual de Guile, SLIB". Proyecto GNU. SLIB no está incluido en la distribución de Guile, pero puede instalarse por separado.
  13. ^ "Como 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 de C y de Scheme. Para simplificar, la implementación de Guile call/cccopia 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 longjmpfunción para reactivarla. Esta implementación tiene una serie de desventajas...", Blandy 1997, pág. 99.
  14. ^ "Manual de Guile, Continuaciones". Proyecto GNU.
  15. ^ "Manual de Guile, GC conservador". Proyecto GNU.
  16. ^ "Manual de Guile, Historia".
  17. ^ "Es difícil determinar quién diseñó Guile. Gran parte del mérito seguramente 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..." "An Anatomy of Guile, The Interface to Tcl/Tk", 1995
  18. ^ "A continuación se presenta una breve historia de este intérprete. Espero que las personas involucradas en su pasado contribuyan más a este documento. SIOD: George Carrette escribió SIOD, la primera versión. 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 de forma gratuita. Ocupa muy poco espacio". Esquema Guile 1995.
  19. ^ "El nombre Guile fue sugerido por primera vez en una discusión de Usenet por Lee Thomas". Esquema Guile 1995.
  20. ^ Lee Thomas (4 de noviembre de 1994). "El nombre de la rosa". Grupo de noticias : gnu.misc.discuss.
  21. ^ "GUILE - dos razones más para preferirlo".
  22. ^ "GEL: Cambio de nombre importante".
  23. ^ Archivos de la Guerra del Tcl
  24. ^ Wingo, Andy. "Entradas de blog anteriores de wingo (a partir del número 328)". Advogato.
  25. ^ "Guile News". Proyecto GNU. Archivado desde el original el 28 de marzo de 2014.
  26. ^ Lord, Thomas (julio de 1995). "An Anatomy of Guile The Interface to Tcl/Tk" ( PostScript ) . Tercer taller anual sobre Tcl/Tk . Toronto, Ontario, Canadá: Usenix . Consultado el 23 de noviembre de 2010 .
  27. ^ "Manual de Guile, otros lenguajes". Proyecto GNU. 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.
  28. ^ "Manual de Guile, Compiler Tower". Proyecto GNU. 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.
  29. ^ "Lanzamiento de GNU Guile 2.2.0". 2017-03-16 . Consultado el 2020-01-20 .
  30. ^ "Lanzamiento de GNU Guile 3.0.0". 2020-01-16 . Consultado el 2020-01-20 .
  31. ^ "Lanzamiento de GNU Guile 3.0.0". 2020-01-16 . Consultado el 2020-01-20 .
  32. ^ "Respecto a la implementación de Elisp?". BT Templeton.
  33. ^ "El futuro de Emacs, Guile y Emacs Lisp".
  34. ^ "12.1 Integración de GNU Guile". gnu.org . Consultado el 16 de marzo de 2020 .

Lectura adicional

Enlaces externos