Pollo (estilizado como POLLO ) es un lenguaje de programación , específicamente un compilador y el intérprete que implementan un dialecto del lenguaje de programación Scheme , y que compila Esquema código fuente con la norma C . En su mayoría, cumple con R5RS y ofrece muchas extensiones al estándar. El estándar R7RS más nuevo es compatible a través de una biblioteca de extensión . [2] Chicken es un software gratuito y de código abierto disponible bajo una licencia BSD.. Se implementa principalmente en Scheme, con algunas partes en C para el rendimiento o para facilitar la incrustación en programas C.
Paradigmas | Multi-paradigma : funcional , imperativo , meta |
---|---|
Familia | Ceceo |
Diseñada por | Felix Winkelmann |
Desarrollador | El equipo de pollo |
Apareció por primera vez | 20 de julio de 2000 [1] |
Lanzamiento estable | 5.2.0 / 29 de febrero de 2020 |
Disciplina de mecanografía | Dinámico , latente , fuerte |
Alcance | Léxico |
Lenguaje de implementación | Esquema , C |
Plataforma | IA-32 , x86-64 , ARM , MIPS , SPARC 64, PowerPC |
SO | Multiplataforma : Windows , Linux , macOS , FreeBSD , NetBSD , OpenBSD , Solaris , AIX , Haiku , Android , iOS |
Licencia | BSD |
Extensiones de nombre de archivo | .scm |
Sitio web | www |
Influenciado por | |
Lisp , esquema |
Enfocar
El enfoque de Chicken se aclara rápidamente en su lema: " Un sistema Scheme 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 los planes de estudio de ciencias de la computación y la experimentación de lenguajes de programación, pero ha tenido poco uso en los negocios y la industria. [3] La comunidad de Chicken ha producido un gran conjunto de bibliotecas para realizar una variedad de tareas. El wiki de Chicken (el software que lo ejecuta también es un programa de Chicken) también contiene una lista de software que se ha escrito en Chicken. [4]
El otro objetivo de Chicken es ser portátil . Al compilar en una representación intermedia , en este caso portátil C (al igual que Gambit y Bigloo ), los programas escritos en Chicken se pueden compilar para sistemas operativos populares comunes como Linux , macOS , otros sistemas similares a Unix, Windows , Haiku y dispositivos móviles. plataformas iOS y Android . [5] También tiene soporte incorporado para programas y extensiones de compilación cruzada , [6] lo que permite su uso en varias plataformas de sistemas integrados .
Diseño
Como muchos compiladores de Scheme, Chicken usa C estándar como representación intermedia . El compilador Chicken traduce un programa Scheme a C, y luego un compilador C traduce el programa C en código de máquina para la arquitectura de la computadora de destino , produciendo un programa ejecutable. La disponibilidad universal de C lo hace útil para este propósito.
El diseño del pollo fue inspirado por un papel 1994 [7] por Henry Baker que describe una estrategia innovadora para compilar Esquema en el programa C. Un esquema se compila en C funciones . Estas funciones de C nunca llegan a la declaración de retorno ; en su lugar, llaman a una nueva continuación cuando se completa. Estas continuaciones son funciones de C y se pasan como argumentos adicionales a otras funciones de C. Son calculados por el compilador.
Hasta ahora, esta es la esencia del estilo de continuación de pases . La idea novedosa de Baker es usar la pila de llamadas C para el montón de Scheme. Por lo tanto, se pueden utilizar las 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 la 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 en vivo y otros objetos en vivo en el montón. [8] A pesar de esto, el código C no copia los marcos de pila de C, solo los objetos de Scheme, por lo que no requiere conocimiento de la implementación de C.
En su totalidad, la pila Scheme consta de la pila C como guardería junto con las dos pilas requeridas por el recolector de basura generacional. Este enfoque proporciona la velocidad de la pila C para muchas operaciones y permite el uso de continuaciones como simples llamadas a funciones C. Además, la solución de Baker garantiza un comportamiento recursivo de cola asintótica , como lo requiere el estándar de lenguaje Scheme. La implementación en el compilador Chicken Scheme es incluso asintóticamente segura para el espacio .
Limitaciones y desviaciones del estándar
Chicken Scheme es en su mayoría compatible con R5RS, con algunas limitaciones y desviaciones notables. [9] La compatibilidad con R7RS se proporciona como una biblioteca de extensión. [2]
El sistema central tiene 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 agrega soporte para el conocimiento completo de UTF-8. [10]
Software complementario
Chicken tiene un gran repositorio de software de bibliotecas y programas adicionales, denominados huevos . [11] Este sistema es muy similar a RubyGems . [12]
Inicialmente, estos huevos se desarrollaron en un repositorio svn central, [13] en el que la creación de una etiqueta provocaría automáticamente que una nueva versión de la extensión estuviera disponible para su descarga. Actualmente, los huevos se pueden desarrollar en cualquier lugar y bajo cualquier sistema de control de versiones , mientras se mantiene la administración de versiones semiautomáticas cuando se utiliza la mayoría de los sitios de alojamiento de código populares. [14] Este método de publicación es independiente de VCS en el sentido de que el usuario no necesita tener estos VCS instalados. El desarrollador es libre de alojar en cualquier lugar que elija, e incluso puede optar por evitar el control de versiones públicas y distribuir solo archivos comprimidos simples.
Para todos los huevos liberados, la última versión se prueba automáticamente como parte de un proceso de integración continuo . Existe un servidor de prueba canónico , [15] donde el sistema central y todos los huevos se prueban diariamente contra 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 para los usuarios del sistema estable ). Además, cualquiera puede ofrecerse como voluntario para proporcionar más capacidad de prueba, en diferentes: hardware, sistemas operativos o versiones principales.
Características
Soportes de pollo más de R5RS estándar Esquema , sino que también añade algunas características no estándar que no están disponibles en todas las implementaciones de sistema.
Interfaz de función externa
La compilación de Chicken en C hace posible inyectar código C personalizado en el resultado compilado, lo que facilita la integración con las bibliotecas de C. Su interfaz de función ajena admite la conversión entre la mayoría de los tipos C integrados y los objetos Scheme correspondientes.
Además, existen bibliotecas de extensión para interactuar 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 en otra plataforma (por ejemplo, para uso integrado en un dispositivo).
Para hacer posible la compilación cruzada para el código de Scheme, Chicken impone un modelo de compilación independiente: 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 host), como como código de macro de procedimiento.
El compilador Chicken también se puede compilar fácilmente. Una vez que se ha logrado la traducción a C, simplemente se puede usar un compilador de C que está configurado para compilarse para otra plataforma.
Módulos y macros
Desde la versión 4, Chicken tiene un sistema de módulos incorporado y soporte para macros higiénicas de bajo nivel a través de macros de cambio de nombre explícito [20] (antes de la versión 4, esto estaba disponible a través de una biblioteca adicional). 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 intercambia rendimiento por conveniencia. Cada identificador que no se inyecte explícitamente como antihigiénico será automáticamente renombrado para evitar la captura de nombres. El costo de rendimiento se debe a que el cambio de nombre implícito requiere que el macroexpansor revierta las expresiones dos veces más. Este costo se paga en el momento de la expansión, por lo que un autor de macros debe considerar si son aceptables tiempos de compilación más largos.
Depurador remoto
Desde la versión 4.11, Chicken viene con un depurador llamado Feathers . [22] Cuando el código de Scheme se compila con la opción de depuración necesaria, los eventos de depuración se inyectan en puntos específicos del código. Estos se implementan como llamadas a una función de C, que es una sobrecarga relativamente baja cuando en realidad no se depura el código. Al depurar, intentará hacer una conexión TCP a un proceso del 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 (proceso que se está depurando) ingresa a un ciclo de comando, que permite interrogar al cliente, leer variables o mutarlas.
Análisis de tipo estático limitado
El pollo admite el análisis de flujo local. Esto permite al compilador detectar errores de tipo de variable en tiempo de compilación y realizar la especialización de tipo. Esta especialización hace posible eliminar 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 da como resultado un mejor rendimiento en tiempo de ejecución.
Este escrutador 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 unidad (o módulo) de compilación.
Ver también
- Recursión de cola
- Algoritmo de Cheney
- " MTA (canción) ", una referencia a la canción en el artículo de Baker de 1994
- Gambito (implementación del esquema)
- Stalin (implementación del esquema)
Referencias
- ^ Winkelmann, Felix. "Anuncio del compilador Chicken Scheme-to-C" . Grupos de Google (comp.lang.scheme) .
- ^ a b evhan (9 de noviembre de 2018). "r7rs (manual de pollo)" . Esquema de pollo . Consultado el 28 de febrero de 2019 .
- ^ "Preguntas frecuentes sobre el esquema" ., sección "¿para qué se utiliza Scheme?"
- ^ Bex, Peter (sjamaan) (16 de agosto de 2018). "Software escrito en Chicken Scheme" . Esquema de pollo . Consultado el 26 de febrero de 2019 .
- ^ "Portabilidad" . Wiki de Esquema de pollo .
- ^ Bex, Peter (sjamaan) (28 de mayo de 2016). "Desarrollo cruzado" . Esquema de pollo (manual) . Consultado el 26 de febrero de 2019 .
- ^ Baker, Henry (1994). "Los contras no deben contrarrestar sus argumentos, parte II: Cheney sobre la MTA". Archivado desde el original el 3 de marzo de 2006.
- ^ Cheney, CJ "Un algoritmo de compactación de lista no recursiva". CACM 13, 11 (noviembre de 1970), 677-678.
- ^ Bex, Peter (sjamaan); Winkelmann, Felix; mario; svnwiki; iraikov; 1126; Mario (28 de mayo de 2016). "Desviaciones confirmadas (manual de pollo)" . Esquema de pollo . Consultado el 28 de febrero de 2019 .CS1 maint: nombres numéricos: lista de autores ( enlace )
- ^ 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 .
- ^ "Huevos de gallina" . Esquema de pollo .
- ^ "RubyGems" . RubyGems.org . Consultado el 26 de febrero de 2019 .
- ^ Bex, Peter (sjamaan). "Distribución de extensiones de idioma independiente de VCS" ., entrada de blog sobre Más magia
- ^ "Instrucciones para los métodos populares de alojamiento de código y VCSes" . Wiki de pollo .
- ^ "Pruebas automatizadas de pollo" . Esquema de pollo . Consultado el 28 de febrero de 2019 .
- ^ iraikov (11 de junio de 2016). "pyffi" . Wiki de Esquema de pollo . Consultado el 3 de marzo de 2019 .
- ^ Bex, Peter (sjamaan); iraikov (11 de marzo de 2012). "Lua" . Wiki de Esquema de pollo . Consultado el 3 de marzo de 2019 .
- ^ mario; svnwiki (4 de junio de 2013). "JNI" . Wiki de Esquema de pollo . Consultado el 3 de marzo de 2019 .
- ^ Winkelmann, Felix; Mario (4 de junio de 2013). "Javahack" . Wiki de Esquema de pollo . Consultado el 3 de marzo de 2019 .
- ^ Bex, Peter (sjamaan); Winkelmann, Felix; Mario (23 de septiembre de 2018). "Módulo (sintaxis Chicken)" . Esquema de pollo . Consultado el 28 de febrero de 2019 .
- ^ Bex, Peter (sjamaan); Winkelmann, Felix; Mario (23 de septiembre de 2018). "Módulo (sintaxis Chicken)" . Esquema de pollo . Consultado el 28 de febrero de 2019 .
- ^ Bex, Peter (sjamaan) (25 de noviembre de 2018). "Depuración" . Esquema de pollo .
enlaces externos
- Página web oficial
- Pollo en GitHub