Articulo de referencia

Pollo (Implementación del esquema)

{{cite web |url=https://groups.google.com/group/comp.lang.scheme/msg/edfb2da16fd89fae |title=Announcing the Chicken Scheme-to-C compiler |last=Winkelmann |first=Felix |website=G...

Chicken (estilizado como CHICKEN ) es un lenguaje de programación , específicamente un compilador e intérprete que implementa un dialecto del lenguaje de programación Scheme y que compila el código fuente de Scheme al estándar C. Es mayormente compatible con R5RS y ofrece muchas extensiones al estándar. El estándar más reciente R7RS es compatible a través de una biblioteca de extensión . [ 2 ] Chicken es software libre y de código abierto disponible bajo una licencia BSD . Está implementado principalmente en Scheme, con algunas partes en C para mejorar el rendimiento o para facilitar su integración en programas C.

Enfocar

El enfoque de Chicken queda rápidamente claro desde su eslogan: " Un sistema de esquemas práctico y portátil ".

El enfoque principal de Chicken es la aplicación práctica de Scheme para escribir software del mundo real. Scheme es bien conocido por su uso en planes de estudio de ciencias de la computación y experimentación con lenguajes de programación, pero ha tenido poco uso en el ámbito empresarial e industrial. [ 3 ] La comunidad de Chicken ha producido un amplio conjunto de bibliotecas para realizar diversas tareas. La wiki de Chicken (el software que la ejecuta también es un programa de Chicken) también contiene una lista de software escrito en Chicken. [ 4 ]

Otro objetivo de Chicken es la portabilidad . Al compilar a una representación intermedia , en este caso C portátil (como hacen Gambit y Bigloo ), los programas escritos en Chicken pueden compilarse para sistemas operativos populares como Linux , macOS , otros sistemas tipo Unix , Windows , Haiku y plataformas móviles iOS y Android . [ 5 ] También cuenta con soporte integrado para la compilación cruzada de programas y extensiones, [ 6 ] lo que permite su uso en diversas plataformas de sistemas embebidos .

Diseño

Al igual que muchos compiladores de Scheme, Chicken utiliza C estándar como representación intermedia . El compilador Chicken traduce un programa Scheme a C, y luego un compilador de C traduce dicho programa a código máquina para la arquitectura de destino , generando así un programa ejecutable. La disponibilidad universal de C lo hace útil para este propósito.

El diseño de Chicken se inspiró en un artículo de 1994 [ 7 ] de Henry Baker que describía una estrategia innovadora para compilar Scheme a C. Un programa Scheme se compila en funciones C. Estas funciones C nunca llegan a la instrucción return ; en su lugar, llaman a una nueva continuación cuando terminan. Estas continuaciones son funciones C y se pasan como argumentos adicionales a otras funciones C. El compilador las calcula.

Hasta ahora, esta es la esencia del estilo de paso de continuaciones . La novedosa idea de Baker es usar la pila de llamadas de C para el montón de Scheme. Por lo tanto, se pueden usar operaciones normales de pila de C, como la creación automática de variables, la asignación de matrices de tamaño variable, etc. Cuando la pila se llena (es decir, el puntero de pila llega a la parte superior de la pila), se puede iniciar una recolección de basura . El diseño utilizado es un recolector de basura de copia ideado originalmente por CJ Cheney, que copia todas las continuaciones activas y otros objetos activos al montón. [ 8 ] A pesar de esto, el código C no copia marcos de pila de C, solo objetos de Scheme, por lo que no requiere conocimiento de la implementación de C.

En resumen, el montón de Scheme consta de la pila de C como núcleo de memoria junto con los dos montones necesarios para el recolector de basura generacional. Este enfoque proporciona la velocidad de la pila de C para muchas operaciones y permite el uso de continuaciones como simples llamadas a funciones de C. Además, la solución de Baker garantiza un comportamiento recursivo de cola asintótico , tal como lo exige el estándar del lenguaje Scheme. La implementación en el compilador Chicken Scheme es incluso asintóticamente segura en cuanto al espacio .

Limitaciones y desviaciones de la norma

Chicken Scheme cumple mayormente con R5RS, con algunas limitaciones y desviaciones notables. [ 9 ] La compatibilidad con R7RS se proporciona como una biblioteca de extensión. [ 2 ]

El sistema principal ofrece soporte básico para caracteres UTF-8 ; sin embargo, los procedimientos de indexación y manipulación de cadenas no son compatibles con UTF-8. Existe una biblioteca de extensión que añade soporte completo para UTF-8. [ 10 ]

Software complementario

Chicken tiene un gran repositorio de software de bibliotecas y programas añadidos, denominados huevos . [ 11 ] Este sistema es muy similar a RubyGems . [ 12 ]

Inicialmente, estos paquetes se desarrollaron en un repositorio SVN central, [ 13 ] donde la creación de una etiqueta generaba automáticamente una nueva versión de la extensión disponible para su descarga. Actualmente, los paquetes se pueden desarrollar en cualquier lugar y bajo cualquier sistema de control de versiones , manteniendo una gestión de lanzamientos semiautomática al usar la mayoría de los sitios de alojamiento de código más populares. [ 14 ] Este método de lanzamiento es independiente del sistema de control de versiones, ya que el usuario no necesita tenerlos instalados. El desarrollador puede alojarlos donde prefiera e incluso optar por evitar el control de versiones público y distribuir solo archivos tar.

Para todos los paquetes distribuidos, la última versión se prueba automáticamente como parte de un proceso de integración continua . Existe un servidor de pruebas canónico [ 15 ] donde el sistema central y todos los paquetes se prueban diariamente con la versión de desarrollo más reciente (para detectar errores regresivos) y la versión estable más reciente (para garantizar que todo funcione correctamente para los usuarios del sistema estable). Además, cualquier persona puede ofrecerse como voluntaria para proporcionar capacidad de prueba adicional en diferentes hardware, sistemas operativos o versiones del núcleo.

Características

Chicken es compatible con la mayor parte del esquema estándar R5RS , pero también añade algunas características no estándar que no están disponibles en todas las implementaciones de Scheme.

Interfaz de funciones externas

La compilación de Chicken a C permite inyectar código C personalizado en el resultado compilado, lo que facilita la integración con bibliotecas de C. Su interfaz de funciones externas admite la conversión bidireccional entre la mayoría de los tipos C integrados y los objetos Scheme correspondientes.

Además, existen bibliotecas de extensión para la interfaz con Python , [ 16 ] Lua , [ 17 ] y Java , a través de Java Native Interface (JNI) [ 18 ] o un puente. [ 19 ]

Compilación cruzada

Es relativamente fácil compilar código Scheme para otra plataforma (por ejemplo, para su uso integrado en un dispositivo).

Para posibilitar la compilación cruzada del código Scheme, Chicken impone un modelo de compilación separada: un módulo compilado consta de dos bibliotecas compartidas . Una biblioteca contiene el código real que se utilizará en tiempo de ejecución (compilado para la plataforma de destino), y la otra es un módulo de importación , que se utilizará para cargar el código que se ejecuta en tiempo de compilación (en la plataforma anfitriona), como el código de macros procedimentales.

El compilador Chicken también se puede compilar fácilmente de forma cruzada. Una vez realizada la traducción a C, basta con usar un compilador de C configurado para compilar para otra plataforma.

Módulos y macros

Desde la versión 4, Chicken cuenta con un sistema de módulos integrado y soporte para macros higiénicas de bajo nivel mediante macros de cambio de nombre explícito [ 20 ] (antes de la versión 4, esto estaba disponible a través de una biblioteca complementaria). También se admiten macros de reglas de sintaxis estándar y macros de cambio de nombre implícito [ 21 ] , que es básicamente una versión inversa del cambio de nombre explícito.

Este mecanismo prioriza la comodidad sobre el rendimiento. Cada identificador que no se inyecte explícitamente como no higiénico se renombrará automáticamente para evitar la captura de nombres. El coste de rendimiento se debe a que el cambio de nombre implícito requiere que el expansor de macros recorra las expresiones dos veces más. Este coste se incurre en el momento de la expansión, por lo que el autor de la macro debe considerar si acepta tiempos de compilación más largos.

Depurador remoto

Desde la versión 4.11, Chicken incluye un depurador llamado Feathers . [ 22 ] Cuando el código Scheme se compila con la opción de depuración necesaria, se inyectan eventos de depuración en puntos específicos del código. Estos se implementan como llamadas a una función C, lo que genera una sobrecarga relativamente baja cuando no se está depurando el código. Al depurar, intentará establecer una conexión TCP con un proceso de servidor Feathers, posiblemente en una máquina diferente. El proceso se detiene, el usuario puede establecer puntos de interrupción e iniciar el programa. Luego, cuando se alcanza el punto de interrupción, el cliente (el proceso que se está depurando) entra en un bucle de comandos, que permite interrogar al cliente, leer variables o modificarlas.

Análisis de tipos estático limitado

Chicken admite el análisis de flujo local. Esto permite al compilador detectar errores de tipo de variables en tiempo de compilación y realizar la especialización de tipos. Esta especialización posibilita la eliminación de varias comprobaciones de seguridad para la detección de tipos en tiempo de ejecución cuando el tipo se puede deducir en tiempo de compilación. Esto se traduce en un mejor rendimiento en tiempo de ejecución.

Este analizador no permite el análisis de flujo entre módulos, por lo que solo se puede utilizar para optimizar el código que forma parte de una única unidad de compilación (o módulo).

Historia

El esquema CHICKEN fue desarrollado originalmente por Felix Winkelmann en Cygwin /gcc y posteriormente en Visual C++ 5.0 en Windows 98. [ 1 ] Se le ocurrió el nombre "CHICKEN" arbitrariamente como "lo primero que se me ocurrió ese día" al pensar en un juguete de plástico de Feathers McGraw que tenía en su escritorio. A medida que el proyecto maduró, decidió no cambiar el nombre por superstición. [ 23 ]

Véase también

Referencias

  1. 1 2 Winkelmann, Felix. "Anuncio del compilador Chicken Scheme-to-C" . Grupos de Google (comp.lang.scheme) .
  2. 1 2 evhan (2018-11-09). "r7rs (Manual de pollos)" . Esquema de pollos . Recuperado el 28-02-2019 .
  3. "Preguntas frecuentes sobre el programa" ., sección "¿Para qué se utiliza Scheme?"
  4. ^ Bex, Peter (sjamaan) (16 de agosto de 2018). "Software escrito en Chicken Scheme" . Esquema de pollo . Consultado el 26 de febrero de 2019 .
  5. "Portabilidad" . Wiki del Plan Chicken .
  6. ^ Bex, Peter (sjamaan) (28 de mayo de 2016). "Desarrollo cruzado" . Esquema de Pollo (Manual) . Consultado el 26 de febrero de 2019 .
  7. Baker, Henry (1994). "CONS Should Not CONS Its Arguments, Part II: Cheney on the MTA" Archivado del original el 3 de marzo de 2006.
  8. Cheney, CJ "Un algoritmo de compactación de listas no recursivo". CACM 13,11 (noviembre de 1970), 677-678.
  9. ^ Bex, Peter (sjamaan); Winkelmann, Félix (28 de mayo de 2016). «Desviaciones confirmadas (Manual de Pollo)» . Esquema de pollo . Consultado el 28 de febrero de 2019 .
  10. ^ Bex, Peter (sjamaan); kooda; mario; svnwiki; wasamasa; kon; mario (11 de agosto de 2018). «utf8 (manual de pollo)» . Esquema de pollo . Consultado el 28 de febrero de 2019 .
  11. "Huevos de gallina" . Plan de gallinas .
  12. "RubyGems" . RubyGems.org . Consultado el 26 de febrero de 2019 .
  13. Bex, Peter (sjamaan). "Distribución de extensiones de lenguaje independiente del VCS" ., entrada de blog en Más magia
  14. "Instrucciones para métodos populares de alojamiento de código y VCS" . Wiki de Chicken .
  15. "Pruebas automatizadas de pollo" . Esquema de pollo . Consultado el 28 de febrero de 2019 .
  16. iraikov (11-06-2016). "pyffi" . Chicken Scheme Wiki . Consultado el 03-03-2019 .
  17. ^ Bex, Peter (sjamaan); iraikov (11 de marzo de 2012). "Lúa" . Wiki del esquema de pollo . Consultado el 3 de marzo de 2019 .
  18. mario; svnwiki (2013-06-04). "JNI" . Chicken Scheme Wiki . Recuperado el 2019-03-03 .
  19. ^ Winkelmann, Félix; mario (4 de junio de 2013). "Javahack" . Wiki del esquema de pollo . Consultado el 3 de marzo de 2019 .
  20. ^ Bex, Peter (sjamaan); Winkelmann, Félix; mario (23 de septiembre de 2018). "Módulo (sintaxis de Chicken)" . Esquema de pollo . Consultado el 28 de febrero de 2019 .
  21. ^ Bex, Peter (sjamaan); Winkelmann, Félix; mario (23 de septiembre de 2018). "Módulo (sintaxis de Chicken)" . Esquema de pollo . Consultado el 28 de febrero de 2019 .
  22. ^ Bex, Peter (sjamaan) (25 de noviembre de 2018). "Depuración" . Esquema de pollo .
  23. Croisant, John (19 de junio de 2013). "Detrás de escena con CHICKEN Scheme y SPOCK (Parte 2)" . Atomic Spin . Recuperado el 17 de febrero de 2023 .
  • Sitio web oficialEdita esto en Wikidata
Obtenido de " https://en.wikipedia.org/w/index.php?title=Chicken_(Scheme_implementation)&oldid=1261999942 "