Solicitud de divorcio de LLVM
(github.com/ziglang)- El proyecto Zig busca eliminar por completo las dependencias de las bibliotecas LLVM, Clang y LLD del ejecutable principal de zig
- El trabajo pendiente se divide en eliminar LLD, quitar las llamadas a la API de LLVM, avanzar los backends de C/x86/wasm/aarch64, eliminar subcomandos y usos del preprocesador que dependen de Clang, e implementar un reemplazo para
zig ar - El backend de LLVM ya genera archivos
.bc, pero el compilador de Zig dejará de tener la capacidad de compilar.bca archivos objeto, por lo que en ese caso será necesaria una instalación separada de Clang - Entre los efectos esperados se mencionan la simplificación de la compilación desde código fuente y del bootstrap, evitar problemas relacionados con LLVM/Clang/LLD en distribuciones Linux y Homebrew, y una reducción del tamaño del binario de aproximadamente 150 MiB → 5 MiB
- La propuesta apunta a que Zig implemente sus propios passes de optimización y pueda atraer contribuciones directas de proyectos de investigación como alive2 y de fabricantes de chips como Intel, ARM y RISC-V
Dependencias que se buscan eliminar del ejecutable de Zig
- El objetivo de este issue es eliminar por completo las bibliotecas LLVM, Clang y LLD del proyecto Zig
- Los puntos de integración que aún quedan se resumen en las áreas de LLD, LLVM, Clang y
zig ar
Trabajo pendiente relacionado con LLD
- completely eliminate dependency on LLD #8726: aún queda por hacer la eliminación completa de la dependencia de LLD
Trabajo pendiente relacionado con LLVM
- El área de LLVM incluye la salida de LLVM bitcode, la tasa de pruebas aprobadas de los backends y la eliminación del uso de la API de LLVM
- directly output LLVM bitcode rather than using LLVM's IRBuilder API #13265: generar directamente LLVM bitcode en lugar de usar la API IRBuilder de LLVM
- El backend de C tiene 1742/1792 pruebas aprobadas, con una tasa de aprobación del 97%
- enable the x86 backend by default for debug builds on x86_64-linux #22257: activar por defecto el backend x86 en builds de depuración para x86_64-linux
- El backend wasm tiene 1611/1765 pruebas aprobadas, con una tasa de aprobación del 91%
- 100% behavior tests passing for the aarch64 backend #21172: lograr que el backend aarch64 apruebe el 100% de las behavior tests
- ability to create import libs from def files without LLVM #17807: capacidad de crear import libs a partir de archivos def sin LLVM
- Avoid LLVM API for setting a module's code model and PIC/PIE levels #21238: evitar el uso de la API de LLVM al configurar el code model de un módulo y los niveles PIC/PIE
- completely eliminate dependency on LLVM library API calls #25492: eliminar por completo la dependencia de las llamadas a la API de la biblioteca LLVM
Trabajo pendiente relacionado con Clang
- Los archivos fuente en C++ del repositorio de Zig se compilan con clang durante el bootstrap
- src/windows_sdk.cpp: port to Zig #15657: portar
src/windows_sdk.cppa Zig
- src/windows_sdk.cpp: port to Zig #15657: portar
zig cc,zig c++,zig translate-cand other subcommands without a clang/llvm dependency in the compiler binary #20875: ofrecerzig cc,zig c++,zig translate-cy otros subcomandos sin dependencia de clang/llvm dentro del binario del compilador- make resinator use aro's preprocessor instead of clang #17752: hacer que resinator use el preprocesador de aro en lugar de clang
- make mingw .def.in file parsing use aro's preprocessor instead of clang #17753: hacer que el parseo de archivos mingw
.def.inuse el preprocesador de aro en lugar de clang - move
@cImportto the build system #20630: mover@cImportal sistema de build
zig ar y limitaciones al procesar archivos .bc
- zig ar: a drop-in llvm-ar replacement #9828: aún queda trabajo para convertir
zig aren un reemplazo directo de llvm-ar - El backend de LLVM ya genera archivos
.bc, pero el compilador de Zig dejará de tener la capacidad de compilar archivos.bca archivos objeto - Para manejar este caso de uso, habrá que instalar Clang por separado
Cambios esperados al eliminar dependencias
- Todos los bugs del lado de Zig pasarán a estar dentro del ámbito de responsabilidad del propio proyecto Zig
- El proceso de compilar el compilador desde código fuente y hacer bootstrap se simplificará, y en el sistema host solo hará falta un compilador de C
- Las distribuciones Linux y gestores de paquetes como Homebrew dejarán de lidiar con los problemas que generaban LLVM, Clang y LLD
- El tamaño del binario del compilador Zig se reducirá de aproximadamente 150 MiB a 5 MiB
- La velocidad de compilación podría aumentar por varios órdenes de magnitud
- Zig podrá implementar sus propios passes de optimización para empujar el estado del arte en computación
- Podrá atraer proyectos de investigación como alive2
- Podrá incentivar contribuciones directas de actores interesados, como fabricantes de chips Intel, ARM y RISC-V, que quieren mejor código máquina para sus propios CPU
2 comentarios
¿Será posible lograr tanta optimización o soporte de plataformas como con LLVM..
Comentarios de Hacker News
Andrew es una persona muy aguda, así que una vez que algo se declara como objetivo, parece que el equipo al final sí lo logrará.
Aun así, desde la perspectiva de alguien que no conoce bien las dificultades de Zig relacionadas con LLVM, esta decisión se ve como si estuvieran desviando la capacidad del equipo hacia herramientas periféricas como binutils en vez de hacia Zig mismo.
Cuando vi solo el título, pensé que estaban abandonando el compilador, y en un proyecto como Zig parece que también hay mucho que ganar manteniendo LLVM.
De todos modos, la idea de reescribir mucho del código dentro de LLVM en Zig en lugar de C++ es bastante genial y ambiciosa. Incluso podría verse como algo tan ambicioso como el intento de Lattner al crear LLVM.
Aun así, el código que termina accidentalmente con complejidad temporal cuadrática será igual de difícil de evitar si Zig llega a ser tan popular y útil como LLVM.
La idea era: “Si una misión espacial no reutiliza un lanzador existente, entonces ese proyecto se convierte en un proyecto de desarrollo de lanzadores, y todo lo demás que se pensaba que era el núcleo de la misión pasa a ser secundario”.
Otra parte que recuerdo añadía la premisa de que “en vez de hacer concesiones para ajustarse a un lanzador existente, uno podría pensar que hacer un lanzador adaptado a una misión específica sería más barato y eficiente”.
Parte del éxito de Rust también se apoya en una compatibilidad similar con C/C++.
Me cuesta imaginar que Zig tenga éxito sin una capacidad parecida, así que espero que no sigan empujando este hito tal cual.
GCC no estaba dispuesto a permitir ni a implementar lo que Apple quería o necesitaba.
Si se enfocan más, como TCC, la mayor parte probablemente sería generación de código para múltiples arquitecturas.
Aquí hay dos problemas. Uno es la generación de código y el otro es el bootstrapping.
Por experiencia, las pasadas de optimización de un compilador son fáciles de escribir y divertidas. Hay que leer papers para entender la asignación de registros y la forma SSA, pero el código que va pasando el IR por distintas optimizaciones y lo va puliendo poco a poco puede escribirse de forma bastante entretenida.
Se pueden hacer pasadas de optimización de alta calidad incluso sin LLVM. Pero la etapa de linearizar el IR a código máquina es un trabajo aburrido y rutinario, a menos que te encanten todas las formas en que x86-32/64 codifica instrucciones como “mov [eax+8*ebx], 123”.
Si quisieras optimizar el tamaño del binario, ¿de verdad querrías medir en qué plataformas “push eax; push eax; push eax” es más corto que “add rsp,12”? Y eso es solo x86; si lo multiplicas por las arquitecturas no x86, que para la mayoría de los desarrolladores no importan mucho, se vuelve mucho más grande.
También es muy probable que errores graves en generadores de código para arquitecturas poco usadas pasen años sin descubrirse.
Lo segundo es el bootstrapping. ¿Con qué compilas un compilador de Zig escrito en Zig? Por ejemplo, podrías compilar el compilador de Zig con un compilador mínimo de Zig sin optimizaciones escrito en C.
Pero si no está optimizado, entonces habría que recompilar el compilador de Zig con un compilador de Zig optimizado. No es un problema insoluble, pero un proceso de build largo y complejo corre el riesgo de ahuyentar a posibles contribuidores.
Después de promocionar tanto que Zig puede compilar C, y quizá hasta C++, ahora decir que van a sacar completamente LLVM se ve bastante radical.
A menos que mucha más gente empiece a colaborar con el soporte, también parece muy poco probable que se acerquen al nivel de soporte de plataformas de LLVM.
Entiendo el plan de agregar su propio backend para quien lo quiera, pero simplemente eliminar LLVM se ve apresurado.
En este momento el equipo está recolectando feedback, aprendiendo sobre los casos de uso afectados y midiendo la viabilidad, así que yo lo veo más bien como lo opuesto a algo apresurado.
Tener que incluir una copia de LLVM de más de 100 MB cuando ni siquiera hace falta en el caso general sí suena algo raro, así que tiene sentido. Además, si eres desarrollador, probablemente ya lo tienes instalado de todos modos.
Aunque podría ser difícil garantizar que la instalación de Zig funcione correctamente con la versión de LLVM del sistema. Habrá que verlo.
https://github.com/ziglang/zig/issues/13265
Últimamente había estado leyendo un poco más sobre Zig y hasta lo usé como una forma sencilla de compilar C++ con LLVM sin pelearme con paquetes del sistema. La posibilidad de pasar de C/C++ a Zig era un gran punto de venta.
Se siente muy repentino e inesperado. No sé si sea correcto o no para el proyecto, pero desde mi punto de vista sí se siente realmente de la nada.
Por un lado, respeto la intención meticulosa de reducir dependencias, pero el costo parece bastante serio.
La pérdida de compatibilidad con C++ prácticamente elimina la ventaja que los fans de Zig a mi alrededor mencionaban más a menudo.
La pérdida de rendimiento, aunque sea temporal, también toca otro punto clave que ellos solían destacar.
Para quienes lo lean por encima: esto no es una decisión tomada, sino una propuesta.
Durante unos 4 años escribí todo un proyecto embebido y sus bibliotecas en Zig, ¿y ahora simplemente van a desaparecer varias arquitecturas con soporte tier 1?
El lenguaje es suyo y pueden hacer con él lo que quieran, pero si es así, ojalá ajusten también el branding en consecuencia.
Supongo que el soporte tier 1 se dividirá en dos categorías: soporte tier 1 integrado y soporte tier 1 mediante un backend de LLVM opcional.
Si una arquitectura ya tiene soporte tier 1, no veo por qué tendría que perderlo solo porque el backend de LLVM pase a ser una dependencia opcional.
Como escribió Andrew en la propuesta, este enfoque incluso podría ser una vía para dar mejor soporte a arquitecturas más raras. Yo con gusto trabajaría en un backend de Zig para una arquitectura de procesador interesante, pero jamás contribuiría a LLVM. Trabajar con C++ no es algo que haría por gusto.
¿Cuál sería la ventaja? ¿No es eso un desperdicio de recursos?
DLang tiene 3 compiladores.
gdc está basado en el backend de GNU Compiler Collection, ldc en el backend de LLVM, y dmd en un generador de código x86 que escribí para Zortech/Symantec/Digital Mars.
Cada uno tiene ventajas, desventajas y objetivos distintos, pero el lenguaje D que soportan es el mismo.
En general, a los usuarios les gustan las opciones, y algunos incluso usan más de uno.
Si eso es correcto, me gusta el enfoque de Zig.
Eso es muy útil porque durante el desarrollo puedes usar el compilador más rápido y, para la versión final, el compilador con el runtime más veloz o el menor uso de memoria.
Además, si existe una especificación del lenguaje que todos los compiladores siguen, eso da la garantía de que el lenguaje es estable y no se va a romper de pronto por abajo.
Claro, también hay ventajas en un lenguaje como Zig, donde todavía puedes cambiar lo que quieras para hacerlo más consistente, más limpio y más potente. Pero últimamente valoro mucho más esa estabilidad, porque te permite concentrarte en crear valor real para los usuarios en vez de estar persiguiendo constantemente a las herramientas de desarrollo.
Una de las principales razones por las que Zig me parecía interesante era que se podía insertar directamente como alternativa a un compilador de C/C++.
Amigos míos me dijeron que, en Windows, Zig es más fácil de instalar como compilador de C/C++ que cualquier otra alternativa.
Si esta propuesta se acepta, personalmente creo que la popularidad de Zig caerá al nivel de Hare u otros lenguajes extremadamente de nicho.
Para lograr que mis colegas siquiera probaran Zig una vez, tuve que mandarles hasta artículos sobre cómo Uber lo usa en producción. Si no hubiera tenido un valor inmediato para proyectos existentes, ni lo habrían considerado dos veces.
Aun así, entiendo el trasfondo de la propuesta. Los tiempos de compilación de LLVM pueden sentirse terribles, y tener un bytecode propio permitiría implementar técnicas de optimización muy interesantes. Lidiar con bugs de LLVM es, en la práctica, algo bastante ingrato, y también he visto eso en el ecosistema de Julia.
Si mi recomendación sirve de algo, creo que Zig debería 1) usar bytecode personalizado en builds de debug para compilaciones rápidas y depuración rápida, y 2) usar LLVM en builds de release para obtener un rendimiento de runtime alto.
Si se pudiera lograr el punto 1) manteniendo el soporte de compilación cruzada para C/C++, por ejemplo delegando solo esa parte a LLVM, entonces, aunque implicaría el trade-off de mantener código adicional de backend, podría ser el mejor punto medio.
Requiere un conjunto de habilidades aparte, distinto del trabajo de más alto nivel en el compilador de Julia, y a veces tarda bastante en que una corrección de bug se integre upstream.
Pero en la práctica tenemos una relación bastante buena y productiva con upstream, y si hubiéramos decidido eliminar LLVM, el proyecto habría logrado mucho menos.
En particular, el soporte de GPU y el soporte para HPC, por ejemplo en PPC, dependen de LLVM.
Por eso mantenemos la postura de que Julia debe compilarse de acuerdo con nuestro patchset/fork, y no invertimos tiempo en bugs que ocurren en builds de Julia que no usan esos parches. Eso pasa especialmente seguido en builds de distribuciones.
Viendo el trabajo en backends no basados en LLVM de otros lenguajes, en la propuesta enlazada se siente demasiado fuerte la arrogancia.
Si no la hubiera escrito esa persona, la habría tomado por un issue cualquiera de GitHub escrito al tanteo por algún principiante de Zig.
Subestima la cantidad de trabajo necesaria, menosprecia de forma implícita todo el trabajo que ha entrado en LLVM, y en cada frase se siente esa confianza y esa actitud de macho de “obviamente nosotros podemos hacerlo más barato, más rápido y mejor”. Es decepcionante.
Hasta ahora siempre he respetado mucho el trabajo de Andrew, así que quiero darle el beneficio de la duda y pensar que quizá lo escribió con prisa o por impulso, sin darse cuenta de que sonaba así.
Pero este texto no inspira confianza ni hace que me resulte más fácil ver la propuesta con una mente abierta.
Webpack y esbuild son un ejemplo de eso.
El momento adecuado para construir algo sin LLVM fue hace años. Pero ahora, si se elimina la funcionalidad de C++, eso podría significar el fin de Zig.
Me sorprende que, en lugar de retirarla gradualmente, no hayan anunciado un plan para escribir su propio compilador de C++ en Zig.
Ni siquiera estoy seguro de que una persona que lo empiece a los 18 años pueda llegar a escribir un compilador de C++. Puede que ni siquiera le alcance el resto de su vida para terminar uno que funcione.
Zig quiere convertirse en el nuevo C del mundo, no tanto en el nuevo C++ del mundo
Incluso en esta propuesta se puede ver que se seguirá dando soporte a la compilación cruzada de C
Esta decisión podría ser la correcta. C se usa mucho hoy en el mundo embebido, y en ese ámbito LLVM no es bueno
Si yo fuera Zig, querría apuntar a todos los microcontroladores, y este es el único camino realista para lograrlo