CHICKEN 6.0.0 integra R7RS y Unicode en su núcleo

La implementación de Scheme de 26 años de Felix Winkelmann obtiene un modelo de cadenas moderno, interfaces C revisadas y una sustancial factura de migración.

By · Published

Primary source: CHICKEN Scheme

Why it matters

CHICKEN 6 modernizes a 26-year-old compiler without abandoning its compile-to-C design, but its Unicode and R7RS gains require real migration work across existing code and eggs.

Illustration of CHICKEN 6.0.0 core architecture diagram showing integration of R7RS features and a Unicode string model.

CHICKEN 6.0.0 traslada el estándar completo R7RS Small y las cadenas UTF-8 al núcleo de la implementación de Scheme que Felix L. Winkelmann inició en 2000, a la vez que cambia suficientes APIs fundamentales como para requerir trabajo de portación desde CHICKEN 5.

Las notas de la versión no establecen cuándo se publicó la versión final. La lectura más prudente es que 6.0.0 es la culminación de un ciclo de desarrollo público que comenzó mucho antes de la discusión de esta semana. Peter Bex publicó la primera versión preliminar 6.0.0 en diciembre de 2024, pidiendo a los desarrolladores que comenzaran a probar y portar sus bibliotecas de extensión, conocidas como eggs.

Para Winkelmann, el lanzamiento extiende una apuesta técnica que hizo hace 26 años: Scheme podría ganar portabilidad compilando a C simple en lugar de ligarse a un conjunto reducido de máquinas o a un gran runtime. En su anuncio del 20 de julio de 2000, describió una implementación pequeña, fácil de extender y capaz de producir ejecutables independientes. El manual actual de CHICKEN aún centra ese modelo. Su compilador emite C portátil, mientras que su intérprete soporta desarrollo interactivo y scripting.

Winkelmann desarrolló CHICKEN hasta 2007 antes de pedir a su comunidad que asumiera la responsabilidad del mantenimiento a principios de 2008. Permaneció activo, y la lista de mantenedores de CHICKEN aún lo identifica como su autor y un hacker central junto a Peter Bex, Evan Hanson, Kooda y megane. Otros colaboradores operan el sistema de paquetes, las pruebas, la documentación y los servicios de infraestructura que mantienen una implementación de lenguaje usable mucho después de que su autor original deje de cargarla solo.

Los estándares pasan al núcleo

El cambio definitorio en 6.0.0 es la decisión de poner todos los módulos especificados por R7RS Small disponibles en el sistema núcleo de CHICKEN. Antes, los desarrolladores dependían de un egg externo R7RS para esa capa de compatibilidad con estándares.

Esa consolidación afecta dónde residen procedimientos familiares. Funciones como call/cc, parameterize, open-input-string y get-output-string se han movido de (chicken base) a (scheme base). case-lambda ahora reside en (scheme case-lambda), mientras que define-record-type se ha movido a (scheme base) y produce tipos de registros generativos para coincidir con el comportamiento de R7RS.

CHICKEN también eliminó alias de módulos para varios SRFI antiguos ya cubiertos por R7RS. La opción del compilador e intérprete que antes se llamaba -r5rs-syntax ahora es -r7rs-syntax. Los módulos de compatibilidad más antiguos de R4RS y R5RS han sido renombrados bajo la convención (scheme ...).

Estos cambios facilitan con el tiempo la incorporación de código conforme a los estándares en CHICKEN. También obligan a las aplicaciones existentes a dejar de depender de ubicaciones específicas de CHICKEN para procedimientos que ahora pertenecen a módulos estándar.

UTF-8 cambia el contrato en tiempo de ejecución

El otro cambio fundamental es la conversión de la representación interna de cadenas de CHICKEN a UTF-8. Las cadenas ahora son capaces de Unicode, la entrada y salida de archivos pueden especificar codificación UTF-8 o Latin-1, y los locativos de cadenas se indexan por punto de código en lugar de por byte.

Ese trabajo va más allá de la visualización de texto. CHICKEN reemplazó (chicken blob) por (chicken bytevector), que ofrece operaciones de bytevector compatibles con R7RS. Los bytevectors ahora son equivalentes a valores u8vector de SRFI-4, y la antigua sintaxis del lector de blobs se ha eliminado en favor de las formas #u8(...) y #u8"...".

Procedimientos como file-read, file-write y random-bytes ahora requieren bytevectors en lugar de aceptar cadenas. CHICKEN añadió constructores de puertos de entrada y salida binarios junto con procedimientos para leer y escribir bytevectors. El resultado es una separación más clara entre texto codificado y bytes en bruto, una distinción que las aplicaciones podían antes difuminar.

Esa claridad conlleva costos de migración. El código que trataba cadenas como contenedores de bytes debe cambiar, mientras que el código que indexaba cadenas asumiendo que un byte representaba un carácter necesita revisión. La guía de portación de CHICKEN agrupa Unicode, blobs, bytevectors, codificaciones de puertos, procedimientos movidos y APIs eliminadas entre los asuntos centrales para los usuarios de CHICKEN 5.

Una actualización más amplia del sistema

La versión 6.0.0 también revisa las interfaces de CHICKEN con el sistema operativo y con C. Funciones de proceso como process-fork, process-run y process ahora retornan objetos de proceso en lugar de identificadores de proceso simples. Los llamadores pueden obtener información de estado y puertos a través de accesores de registro, mientras que las funciones de espera y señalización continúan aceptando ya sea un objeto o un PID.

El bloqueo de archivos en (chicken file posix) ahora usa flock(2), opera sobre archivos completos y se describe en las notas de la versión como seguro para hilos. La interfaz de funciones extranjeras puede pasar números complejos, structs y unions de C directamente como argumentos y resultados. Las cadenas y símbolos enviados al código extranjero ya no se copian, lo que significa que las mutaciones realizadas por código C son visibles desde Scheme.

El proceso de compilación también ha cambiado. Un script configure ahora prepara la fuente antes de make, acercando a CHICKEN a las prácticas convencionales de compilación Unix. La compilación mínima para Windows se ha descartado a favor de una cadena de herramientas basada en shell POSIX, y la compilación puede usar zig cc como compilador y enlazador C sustituto. Los niveles de optimización del compilador ahora pueden habilitar la reutilización y el compartido de closures para reducir asignaciones.

El interés de Winkelmann en mantener Scheme cercano a C ha continuado junto con el trabajo de CHICKEN 6. En 2024 introdujo CRUNCH, un compilador para un subconjunto tipado estáticamente de R7RS que corre sobre CHICKEN y emite C99 portátil. Lo describió como una vía para programas compactos para juegos, máquinas virtuales, sistemas embebidos, componentes de sistema operativo y bibliotecas sensibles al rendimiento.

CHICKEN 6 da a ese trabajo una base orientada a estándares mientras preserva la arquitectura original. El lanzamiento no reemplaza la identidad del proyecto de compilar a C con un nuevo runtime o destino de plataforma. Actualiza las suposiciones en torno a texto, módulos, registros, procesos y datos extranjeros para que la misma arquitectura pueda soportar código escrito contra un estándar más reciente de Scheme.

El trabajo inmediato ahora recae en los mantenedores de aplicaciones y eggs. CHICKEN 6 elimina procedimientos obsoletos, reubica ligaduras centrales y cambia representaciones de datos que están por debajo del manejo de archivos y las llamadas al código extranjero. La ventaja es una brecha menor entre código R7RS portátil y código CHICKEN. El precio es una migración de versión mayor que los desarrolladores tendrán que tratar como un puerto, en lugar de una actualización rutinaria del compilador.

Reader comments

Conversation for this story loads after sign-in.