Cosmopolitan, una biblioteca C estándar con un ejecutable multiplataforma
Se acaba de presentar la primera versión del proyecto Cosmopolitan el cual se destaca por desarrollar una biblioteca C estándar y un formato de archivo ejecutable universal que puede ser utilizado para distribuir programas para diferentes sistemas operativos.
El contenedor para la formación de archivos ejecutables universales se basa en la combinación de segmentos y encabezados específicos para diferentes sistemas operativos (PE, ELF, MACHO, OPENBSD) en un solo archivo.
Para garantizar el lanzamiento de un único archivo ejecutable en los sistemas Windows y Unix, se utiliza un truco cuya esencia es la codificación de archivos de Windows PE en forma de un script de shell, aprovechando el hecho de que Thompson Shell no utiliza el marcador de script «#!».
Cosmopolitan hace de C un lenguaje que se puede construir una vez y que se puede ejecutar en cualquier lugar, similar a Java, excepto que no requiere la instalación previa de intérpretes o máquinas virtuales. Cosmo ofrece los mismos beneficios de portabilidad que los lenguajes de alto nivel como Go y Rust, pero no inventa un nuevo lenguaje y no necesitará configurar un sistema CI para crear binarios separados para cada sistema operativo.
En lo que Cosmopolitan se enfoca es en arreglar C al desacoplarlo de las plataformas, por lo que puede ser agradable de usar para escribir pequeños programas Unix que se distribuyen fácilmente a una audiencia mucho más amplia.
Como resultado, se crea un archivo ejecutable en el que se combinan varios formatos diferentes utilizados en Unix, Windows y macOS. y un esquema del formato propuesto.
El archivo comienza con la etiqueta «MZqFpD», que se interpreta como un encabezado en formato Windows PE.
Por ejemplo, en los sistemas Unix, el código de shell se ejecuta mediante el comando exec, pasando el código ejecutable a través de una tubería sin nombre.
Aun que se menciona que existe una limitación del método propuesto es la capacidad de ejecutarse en un sistema operativo similar a Unix utilizando únicamente shells que admitan el modo de compatibilidad Thompson Shell, ya que de otra forma no comenzara directamente con la llamada al sistema.
La llamada qemu-x86_64 está destinada a proporcionar portabilidad adicional y le permite ejecutar código compilado x86_64 en plataformas que no son x86, como placas Raspberry Pi y dispositivos Apple con procesadores ARM.
El proyecto también se puede utilizar para crear aplicaciones autónomas que funcionen sin un sistema operativo (bare metal). En tales aplicaciones, se adjunta un cargador al archivo ejecutable y el programa actúa como un sistema operativo de arranque.
En la biblioteca estándar C libc, desarrollada por el proyecto, se han propuesto unas 1400 funciones para crear aplicaciones de consola.
En términos de rendimiento, Cosmopolitan funciona tan rápido como glibc y está notablemente por delante de Musl y Newlib, mientras que Cosmopolitan es un orden de magnitud más pequeño en tamaño de código que glibc y coincide aproximadamente con Musl y Newlib.
Para optimizar funciones frecuentemente llamadas como memcpy y strlen, se utiliza adicionalmente la técnica en la que se usa un enlace de macro para llamar a la función, en la que se informa al compilador sobre los registros de CPU involucrados en la ejecución del código, lo que ahorra recursos al guardar el estado de la CPU al almacenar solo registros mutables.
Para crear programas que incluyan varios archivos (vinculando todos los recursos en un solo archivo), se admite la formación de un archivo ejecutable universal en forma de un archivo ZIP especialmente diseñado (el contenido se puede ver con el comando «unzip -v», pero el archivo permanece disponible para el lanzamiento directo).
El archivo obtenido mediante la vinculación estática con la libc y el runtime propuestos es adecuado para su ejecución en cualquier distribución de Linux, macOS, Windows, FreeBSD y OpenBSD. El código del proyecto se distribuye bajo la licencia ISC (versión simplificada de MIT / BSD).
Finalmente si estás interesado en conocer más al respecto sobre esta biblioteca, puedes consultar los detalles, asi como la documentación en el siguiente enlace.