Rui Ueyama, autor del compositor LLVM lld y del compilador chibicc, dio a conocer hace poco los frutos de su nuevo trabajo y presentó la primera versión estable del nuevo «high-linker the Mold», el cual se destaca por estar muy por delante de la tasa de vinculación de los vinculadores de archivos objeto GNU gold y LLVM lld.
Actualmente, el proyecto se considera listo para implementaciones de producción y se puede utilizar como un reemplazo transparente más rápido para el enlazador GNU en sistemas Linux.
Sobre Mold
Mold admite todas las características del enlazador GNU y tiene un rendimiento muy alto, ya que los enlaces que realiza tienen una velocidad solo dos veces más lenta que simplemente copiar archivos con la utilidad cp.
Por ejemplo, al compilar Chrome 96 (tamaño de código 1,89 GB), al vincular archivos ejecutables con debuginfo en una computadora de 8 núcleos lleva 53 segundos con GNU Gold, LLVM lld tarda 11,7 segundos y Mold solo 2,2 segundos (26 veces más rápido que GNU gold).
Ademas, al vincular Clang 13 (3,18 GB), GNU gold tarda 64 segundos, LLVM lld tarda 5,8 segundos y Mold tarda 2,9 segundos y al vincular Firefox 89 (1,64 GB), GNU gold tarda 32,9 segundos, LLVM lld tarda 6,8 segundos y Mold tarda 1,4 segundos.
mold 1.0 es la primera versión estable y lista para producción del enlazador de alta velocidad. En los sistemas basados en Linux, debería «simplemente funcionar» como un reemplazo directo más rápido del enlazador GNU predeterminado para la mayoría de los programas de usuario. Si está creando un archivo ejecutable grande que tarda mucho en vincularse, vale la pena probar el molde para ver si puede acortar el tiempo de compilación. El molde es fácil de construir y usar.
De esta forma el reducir el tiempo de compilación permite mejorar significativamente la conveniencia de desarrollar grandes proyectos al reducir el tiempo de espera en el proceso de generación de archivos ejecutables al depurar y probar cambios.
La motivación para crear Mold fue la molestia de tener que esperar a que se completara el enlace después de cada cambio en el código, así como la baja eficiencia de los enlazadores existentes en sistemas multinúcleo y el deseo de probar una arquitectura de enlace fundamentalmente diferente sin recurriendo a modelos innecesariamente complicados como el enlace incremental.
El alto rendimiento de vincular un archivo ejecutable de una gran cantidad de archivos de objeto preparados por el compilador en Mold se logra mediante el uso de algoritmos más rápidos, la paralelización activa de operaciones entre los núcleos de CPU disponibles y el uso de estructuras de datos más eficientes.
Por ejemplo, Mold implementa una técnica para realizar cálculos intensivos simultáneamente con la copia de archivos, cargando archivos de objetos de manera proactiva en la memoria, usando tablas hash rápidas al resolver caracteres, escaneando tablas de reubicación en una secuencia separada y deduplicando secciones que se repiten en diferentes archivos.
Finalmente, cabe destacar que Mold está escrito en C++ 20 y se distribuye bajo la licencia AGPLv3, que es compatible con GPLv3, pero no compatible con GPLv2, ya que requiere cambios de apertura al desarrollar servicios de red. Esta elección se explica por el deseo de recibir fondos para el desarrollo: el autor está listo para vender los derechos del código para volver a obtener la licencia bajo una licencia permisiva como MIT, o para proporcionar una licencia comercial separada para aquellos que no están satisfechos con el AGPL.
En cuanto a los planes futuros que se tienen se menciona que actualmente se está trabajando en el Mold para macOS (aunque esta versión 1.0 ya se encuentra añadido el soporte pero está considerado aun como alfa) y una vez que esté completo, el soporte será lanzado en la versión 2.0 de Mold y posterior a ello se menciona que se trabajara en Mold para Windows y será implementado en la versión 3.0.
Si quieres conocer más al respecto sobre este proyecto o quieres realizar la compilación para poder utilizarlo en tu sistema, puedes consultar los detalles y/o las instrucciones de compilación en el siguiente enlace.