Pedido de divórcio do LLVM
(github.com/ziglang)- O projeto Zig tem como meta remover completamente as dependências das bibliotecas LLVM, Clang e LLD do executável principal do Zig
- O trabalho restante se divide em remover o LLD, eliminar chamadas à API do LLVM, avançar os backends C/x86/wasm/aarch64, remover subcomandos e usos de pré-processador dependentes do Clang, além de implementar um substituto para
zig ar - O backend LLVM já produz arquivos
.bc, mas o compilador Zig deixará de ter a capacidade de compilar.bcem arquivos-objeto, e nesse caso será necessária uma instalação separada do Clang - Entre os efeitos esperados estão a simplificação do build a partir do código-fonte e do bootstrap, evitar problemas relacionados a LLVM/Clang/LLD em distribuições Linux e no Homebrew, e reduzir o tamanho do binário de cerca de 150 MiB → 5 MiB
- A proposta também aponta que o Zig poderá implementar seus próprios passes de otimização e atrair contribuições diretas de projetos de pesquisa como alive2 e de fabricantes de chips como Intel, ARM e RISC-V
Dependências que se quer remover do executável do Zig
- O objetivo desta issue é remover completamente do projeto Zig as bibliotecas LLVM, Clang e LLD
- Os pontos de ligação restantes estão organizados nas áreas de LLD, LLVM, Clang e
zig ar
Trabalho restante relacionado ao LLD
- completely eliminate dependency on LLD #8726: ainda resta o trabalho de eliminar completamente a dependência de LLD
Trabalho restante relacionado ao LLVM
- A área de LLVM inclui saída de LLVM bitcode, taxa de aprovação de testes dos backends e remoção da API do LLVM
- directly output LLVM bitcode rather than using LLVM's IRBuilder API #13265: gerar LLVM bitcode diretamente em vez de usar a API IRBuilder do LLVM
- O backend C está com 1742/1792 testes aprovados, uma taxa de 97%
- enable the x86 backend by default for debug builds on x86_64-linux #22257: ativar por padrão o backend x86 em builds de debug no x86_64-linux
- O backend wasm está com 1611/1765 testes aprovados, uma taxa de 91%
- 100% behavior tests passing for the aarch64 backend #21172: fazer o backend aarch64 passar em 100% dos behavior tests
- ability to create import libs from def files without LLVM #17807: capacidade de criar import libs a partir de arquivos def sem LLVM
- Avoid LLVM API for setting a module's code model and PIC/PIE levels #21238: evitar o uso da API do LLVM ao configurar o code model e os níveis de PIC/PIE de um módulo
- completely eliminate dependency on LLVM library API calls #25492: eliminar completamente a dependência de chamadas à API da biblioteca LLVM
Trabalho restante relacionado ao Clang
- Os arquivos-fonte C++ do repositório Zig estão sendo compilados com clang durante o bootstrap
- src/windows_sdk.cpp: port to Zig #15657: portar
src/windows_sdk.cpppara 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: oferecerzig cc,zig c++,zig translate-ce outros subcomandos sem dependência de clang/llvm dentro do binário do compilador- make resinator use aro's preprocessor instead of clang #17752: fazer o resinator usar o pré-processador do aro em vez do clang
- make mingw .def.in file parsing use aro's preprocessor instead of clang #17753: fazer o parsing de arquivos mingw
.def.inusar o pré-processador do aro em vez do clang - move
@cImportto the build system #20630: mover@cImportpara o sistema de build
Restrições de zig ar e do tratamento de arquivos .bc
- zig ar: a drop-in llvm-ar replacement #9828: ainda resta transformar
zig arem um substituto compatível do llvm-ar - O backend LLVM já produz arquivos
.bc, mas o compilador Zig deixará de ter a capacidade de compilar arquivos.bcem arquivos-objeto - Para lidar com esse caso de uso, será preciso instalar o Clang separadamente
Mudanças esperadas com a remoção das dependências
- Todos os bugs do lado do Zig passarão a estar dentro do escopo de responsabilidade do próprio projeto Zig
- O processo de compilar o compilador a partir do código-fonte e fazer o bootstrap ficará mais simples, e o sistema hospedeiro precisará ter apenas um compilador C
- Distribuições Linux e gerenciadores de pacotes como o Homebrew deixarão de lidar com os problemas que criavam em relação a LLVM, Clang e LLD
- O tamanho do binário do compilador Zig cairá de cerca de 150 MiB para 5 MiB
- A velocidade de compilação poderá aumentar em várias ordens de grandeza
- O Zig poderá implementar seus próprios passes de otimização e elevar o estado da arte da computação
- Poderá atrair projetos de pesquisa como alive2
- Poderá incentivar contribuições diretas de partes interessadas, como fabricantes de chips Intel, ARM e RISC-V, que querem código de máquina melhor para suas CPUs
2 comentários
Será que vai conseguir oferecer otimização e suporte a plataformas no nível do LLVM...
Opiniões do Hacker News
Andrew é uma pessoa extremamente perspicaz, então, agora que isso foi declarado como objetivo, acho que a equipe vai acabar conseguindo
Mas, do ponto de vista de alguém que não conhece bem as dificuldades do Zig relacionadas ao LLVM, essa decisão parece desviar a capacidade da equipe do próprio Zig para ferramentas periféricas como binutils
Só pelo título, achei que eles estavam abandonando o compilador, e para um projeto como o Zig parece haver muito a ganhar mantendo o LLVM
Ainda assim, a ideia de reescrever em Zig boa parte do código dentro do LLVM, em vez de C++, é bem interessante e ambiciosa. Pode até ser vista como tão ambiciosa quanto a tentativa de Lattner, que criou o LLVM
Mas códigos que por acaso acabam tendo complexidade quadrática serão difíceis de evitar se o Zig se tornar tão popular e útil quanto o LLVM
A ideia era algo como: “se uma missão espacial não reutiliza um veículo lançador existente, então esse projeto se torna um projeto de desenvolvimento de veículo lançador, e todo o resto que se achava ser o núcleo da missão vira algo secundário”
Outra parte de que me lembro acrescentava uma premissa como: “embora se possa pensar que criar um veículo lançador adequado a uma missão específica seria mais barato e eficiente do que fazer concessões para se adaptar a um veículo existente”
Parte do sucesso do Rust também se apoia em uma compatibilidade semelhante com C/C++
É difícil imaginar o Zig tendo sucesso sem uma capacidade parecida, então espero que eles não sigam em frente com esse marco do jeito que está
Isso porque o GCC não queria permitir nem implementar o que a Apple queria ou precisava
Com um foco maior, como no TCC, a maior parte seria geração de código para várias arquiteturas
Há dois problemas aqui. Um é a geração de código e o outro é o bootstrapping
Pela minha experiência, passes de otimização de compiladores são fáceis e divertidos de escrever. Para entender alocação de registradores e a forma SSA é preciso ler artigos, mas dá para escrever de forma divertida o código que faz a IR passar por vários passes de otimização e ir sendo refinada
É possível criar passes de otimização de alta qualidade sem o LLVM. Mas a etapa de linearizar a IR em código de máquina é um trabalho tedioso e comum, a menos que você goste de todas as formas pelas quais x86-32/64 codifica uma instrução como “mov [eax+8*ebx], 123”
Se estiver otimizando o tamanho do binário, você vai querer medir em qual plataforma “push eax; push eax; push eax” é mais curto que “add rsp,12”? E isso é só x86; quando multiplicado por arquiteturas não x86 que não importam para a maioria dos desenvolvedores, fica muito maior
Também é muito provável que bugs grandes em geradores de código para arquiteturas pouco usadas passem anos sem ser descobertos
O segundo ponto é bootstrapping. Com o que compilar um compilador Zig escrito em Zig? Por exemplo, é possível compilar o compilador Zig com um compilador Zig mínimo, sem otimização, escrito em C
Mas, se ele não otimiza, será preciso recompilar o compilador Zig novamente com o compilador Zig otimizado. Não é um problema insolúvel, mas um processo de build longo e complexo corre o risco de afastar potenciais contribuidores
Depois de promoverem tanto que o Zig consegue compilar C e talvez até C++, parece bem radical agora dizer que vão remover completamente o LLVM
A menos que muito mais gente participe do suporte, também parece muito improvável que eles cheguem perto do nível de suporte a plataformas do LLVM
Eu entenderia um plano para adicionar um backend próprio para quem quiser, mas simplesmente remover o LLVM parece precipitado
Neste momento, a equipe está coletando feedback, aprendendo quais casos de uso serão afetados e avaliando a viabilidade, então eu diria que é quase o oposto de precipitação
Faz sentido, porque é meio estranho ter que empacotar uma cópia de 100MB+ do LLVM que nem é necessária no caso comum. Desenvolvedores provavelmente já o terão instalado de qualquer forma em muitos casos
Porém, pode ser difícil garantir que o Zig instalado funcione corretamente com a versão do LLVM do sistema. Vamos ver
https://github.com/ziglang/zig/issues/13265
Recentemente li um pouco mais sobre Zig e também o usei como uma forma fácil de compilar C++ com LLVM sem brigar com pacotes do sistema. A possibilidade de migrar de C/C++ para Zig era um grande argumento de venda
É algo muito repentino e inesperado. Não sei se é certo ou errado para o projeto, mas, do meu ponto de vista, pareceu realmente surgir do nada
Por um lado, respeito a disposição cuidadosa de reduzir dependências, mas o custo parece bem sério
A perda de compatibilidade com C++ basicamente elimina a vantagem que os fãs de Zig ao meu redor mais mencionavam
A perda de desempenho, ainda que temporária, também é outro ponto central que eles costumavam mencionar junto
Para quem está lendo por alto: isso não é uma decisão tomada, é uma proposta
Por cerca de 4 anos, escrevi todos os projetos embarcados e bibliotecas em Zig, e agora várias arquiteturas com suporte tier 1 simplesmente vão sair?
A linguagem é de vocês, então podem fazer como quiserem, mas, nesse caso, gostaria que ajustassem também o branding de acordo
Acho provável que o suporte tier 1 seja dividido em duas categorias: suporte tier 1 embutido e suporte tier 1 por meio do backend LLVM opcional
Se uma arquitetura já tem suporte tier 1, não vejo motivo para perder esse suporte só porque o backend LLVM virou uma dependência opcional
Como Andrew escreveu na proposta, essa abordagem pode ser um caminho para dar suporte melhor a arquiteturas mais raras. Eu trabalharia de bom grado em um backend Zig para uma arquitetura de processador interessante, mas jamais contribuiria com o LLVM. Trabalhar com C++ não é algo para fazer por hobby
Qual é a vantagem disso? Não é desperdício de recursos?
DLang tem 3 compiladores
gdc é baseado no backend da coleção de compiladores GNU, ldc é baseado no backend LLVM, e dmd é baseado no gerador de código x86 que escrevi para Zortech/Symantec/Digital Mars
Cada um tem prós, contras e alvos diferentes, mas a linguagem D que eles suportam é a mesma
No geral, usuários gostam de ter opções, e alguns usam mais de um em conjunto
Se for isso mesmo, gosto da abordagem do Zig
Isso é muito útil porque permite usar o compilador mais rápido durante o desenvolvimento e, na versão final, usar o compilador com o runtime mais rápido ou o menor uso de memória
Além disso, quando há uma especificação da linguagem seguida por todos os compiladores, você tem a garantia de que a linguagem é estável e não vai quebrar de repente por baixo
Claro que também há vantagens em linguagens como Zig, nas quais ainda é possível mudar o que se quiser para tornar a linguagem mais coerente, limpa e poderosa. Hoje em dia passei a valorizar muito mais essa estabilidade, porque ela permite focar em criar valor real para os usuários em vez de ficar correndo atrás das ferramentas de desenvolvimento
Um dos principais motivos pelos quais Zig era interessante é que ele podia ser encaixado diretamente como alternativa a um compilador C/C++
No Windows, amigos me disseram que era mais fácil instalar Zig como compilador C/C++ do que qualquer outra alternativa
Se esta proposta for aceita, pessoalmente acho que a popularidade do Zig cairá para o nível de Hare ou de outras linguagens extremamente de nicho
Para fazer meus colegas ao menos experimentarem Zig, tive que enviar até um texto dizendo que a Uber o usa em produção. Se ele não tivesse valor imediato em projetos existentes, meus colegas nem pensariam duas vezes
Ainda assim, entendo o contexto da proposta. O tempo de compilação do LLVM pode parecer horrível, e ter um bytecode próprio permitiria implementar técnicas de otimização legais. Lidar com bugs do LLVM é algo praticamente intocável, e já vi isso acontecer também no ecossistema Julia
Se minha recomendação tiver algum valor, acho que Zig deveria 1) usar bytecode customizado em builds de debug, para builds rápidos e depuração rápida, e 2) usar LLVM em builds de release, para desempenho rápido em runtime
Se for possível fazer 1) mantendo o suporte a compilação cruzada de C/C++, por exemplo delegando só essa parte ao LLVM, pode ser o melhor meio-termo, embora haja o trade-off de manter código adicional de backend
Isso exige um conjunto de habilidades separado do trabalho no compilador Julia de alto nível, e às vezes demora para que correções de bugs sejam integradas upstream
Mas, na prática, temos uma relação bastante boa e produtiva com o upstream, e, se tivéssemos decidido eliminar o LLVM, o projeto teria realizado muito menos
Em especial, o suporte a GPU e o suporte a HPC, por exemplo PPC, dependem do LLVM
Por isso mantemos a posição de que Julia deve ser compilada contra nosso patchset/fork, e não investimos tempo em bugs surgidos em builds de Julia que não usam esses patches. Isso acontece com frequência especialmente em builds de distribuições
Tendo acompanhado o trabalho de backends não LLVM em outras linguagens, a proposta linkada passa uma sensação muito forte de arrogância
Se o autor não fosse quem é, eu teria descartado como uma issue no GitHub escrita de qualquer jeito por um iniciante em Zig
Ela subestima a quantidade de trabalho necessária, diminui sutilmente todo o trabalho colocado no LLVM, e em cada frase transparece uma confiança e um machismo de “obviamente nós conseguimos fazer mais barato, mais rápido e melhor”. É decepcionante
Até aqui, eu realmente respeitava o trabalho do Andrew, então tento interpretar com boa-fé que talvez tenha sido escrito às pressas ou de improviso, sem perceber como soaria
Mas o texto não transmite confiança nem me faz olhar a proposta em si com mais abertura
Webpack e esbuild são um exemplo disso
O momento adequado para criar algo sem LLVM teria sido alguns anos atrás. Mas, se removerem agora as funcionalidades de C++, há uma boa chance de isso ser o fim do Zig
É surpreendente que, em vez de uma remoção gradual, não tenham anunciado um plano para escrever um compilador C++ próprio em Zig
Nem tenho certeza de que uma pessoa que começasse no 18º aniversário conseguiria escrever um compilador C++. Talvez não sobrasse tempo de vida suficiente para criar um compilador funcional
O Zig quer ser o novo C do mundo, não tanto o novo C++ do mundo
Mesmo nesta proposta, dá para ver que a compilação cruzada de C continuará sendo suportada
Essa escolha pode estar certa. C é muito usado hoje no mundo de embarcados, e nessa área o LLVM não é bom
Se eu fosse o Zig, gostaria de mirar todos os microcontroladores, e este é o único caminho realista para conseguir isso