- O CCC (Claude’s C Compiler), escrito inteiramente pelo Claude Opus 4.6 da Anthropic, foi lançado com a alegação de conseguir compilar o kernel Linux
- É um compilador independente escrito em Rust que implementa diretamente todos os componentes, do front-end ao linker, mas seu desempenho e a qualidade de otimização ficam muito abaixo do GCC
- Em benchmarks com SQLite e o kernel Linux, o CCC compilou todos os arquivos C sem erros, mas a compilação falhou na etapa de linkedição com mais de 40 mil erros de referência
- O desempenho de execução no SQLite foi até 158.000 vezes mais lento, o binário ficou mais de 3 vezes maior e as opções de otimização (
-O2 etc.) não tiveram efeito
- O fato de uma IA ter gerado um compilador C completo tem relevância técnica, mas a eficiência e a compatibilidade ainda estão abaixo do necessário para uso prático
Visão geral e arquitetura do CCC
- O CCC é um compilador C escrito inteiramente por IA usando o Claude da Anthropic, com suporte a x86-64, i686, AArch64 e RISC-V 64
- Escrito em Rust, inclui IR baseada em SSA, otimizador, gerador de código, assembler, linker e geração de informações de depuração DWARF
- O texto explica separadamente os papéis de compilador, assembler e linker, observando que o linker é o componente mais complexo e mais sujeito a erros
- Como o kernel Linux usa extensões do GCC e scripts de linkedição complexos, ele não era ideal como alvo inicial de teste; por isso, o SQLite foi escolhido como benchmark principal
Ambiente e metodologia de teste
- O GCC 14.2.0 e o CCC foram comparados sob as mesmas condições em duas VMs baseadas em Debian (6 vCPU, 16 GB de RAM)
- Itens comparados: tempo de compilação, tamanho do binário, velocidade de execução, uso de memória e estabilidade
- O CCC usa o recurso gcc_m16 para delegar ao GCC apenas o código de boot em 16 bits, deixando o restante a cargo do CCC
- O benchmark do SQLite foi projetado com foco em CPU e executa 42 operações SQL em 10 etapas
Resumo dos principais resultados
- Kernel Linux 6.9: o CCC compilou todos os 2.844 arquivos C, mas falhou na etapa de linkedição com 40.784 erros de undefined reference
- Causa dos erros: relocations incorretas e geração inadequada de símbolos nas seções
__jump_table e __ksymtab
- Compilação do SQLite: o CCC foi 1,3 vez mais lento que o GCC, com binário 2,7 a 3 vezes maior e uso de memória 5,9 vezes maior
- Desempenho de execução do SQLite: 737 vezes mais lento que o GCC
-O0 e 1.242 vezes mais lento que o GCC -O2
- Consultas simples ficaram entre 1 e 7 vezes mais lentas, enquanto consultas com loops aninhados foram até 158.000 vezes mais lentas
- Passou em todos os 5 testes de crash, garantindo correção funcional
Causas da queda de desempenho
- Spilling excessivo de registradores: a maioria das variáveis locais é salva na pilha, gerando acessos excessivos à memória
- Na função
sqlite3VdbeExec, mais de 100 variáveis foram tratadas via pilha, aumentando o tamanho do código em 3 vezes
- Opções de otimização sem efeito: os resultados de
-O0 e -O2 são exatamente iguais, e os 15 passes SSA rodam da mesma forma em todos os níveis
- Corrupção do frame pointer, impedindo a depuração com GDB
- Inchaço no tamanho do código: o binário do SQLite chegou a 4,27 MB, 2,78 vezes maior que com GCC, aumentando falhas no cache de instruções
- Ausência de tabela de símbolos: sem símbolos de funções internas, não é possível fazer profiling
Pontos fortes e limitações do CCC
- Pontos fortes
- Compilou sem erros todos os arquivos C do kernel Linux
- Garantiu correção e estabilidade nos resultados do SQLite, sem segfault
- Suporta uma interface de linha de comando compatível com GCC
- Limitações
- Queda extrema no desempenho de execução (até 158.000 vezes)
- Incompatibilidade do linker, levando à falha na build do kernel
- Tamanho excessivo de binário e uso elevado de memória
- Ausência de otimização e de informações de depuração, com opções
-O sem efeito
- A velocidade de compilação também é 25% inferior à do GCC
O problema do “Hello World”
- Logo após a divulgação, surgiu o issue “Hello world does not compile”
- A etapa de pré-processamento falhava por não encontrar
stddef.h e stdarg.h
- O tema chamou atenção no GitHub, com mais de 288 reações e cerca de 200 comentários
- Alguns usuários avaliaram que “parece um trabalho de compiladores em nível de graduação”
Conclusão
- O CCC é um caso que demonstra que a IA pode gerar um compilador C completo
- Ele processou sem erros todos os arquivos C do kernel Linux e executou o SQLite com correção funcional
- No entanto, não é adequado para uso real
- O desempenho de execução é extremamente baixo, e as funções de linker, otimização e depuração ainda estão incompletas
- Como conquista de pesquisa, tem significado, mas, para compiladores de uso profissional, ferramentas existentes como GCC e Clang continuam sendo indispensáveis
5 comentários
Então é daqui que vem o meme de que
Hello worldnão compila kkkNo começo, parece um clima parecido com o do Go.
Se você continuar rodando em loop e mandando corrigir, será que em algum momento não vai sair um compilador ainda melhor?
Acho que dá para dar valor ao fato de que chegou ao nível de uma tarefa de graduação..
Comentários no Hacker News
Esta discussão mostra bem os dois lados sobre agentes de programação com LLM
Quem é favorável diz “é impressionante ter feito um compilador funcional em poucas horas”, enquanto quem é contra diz “se não funciona direito, não tem valor”
Quanto mais complexo o codebase, mais fraco o agente se torna, e há ceticismo em relação à repetida ideia de que “a próxima geração vai consertar”
A Anthropic disse que compilou o kernel Linux, mas na prática falhou, expondo o abismo entre as expectativas infladas sobre IA e a realidade
Passar nos testes e produzir uma saída aparentemente correta é algo totalmente diferente de o código ter qualidade manutenível
Primeiro era “só consegue escrever funções pequenas”, depois “não consegue compilar Linux”, depois “não chega ao nível do GCC”, e o critério vai mudando o tempo todo
Mas, olhando a velocidade do avanço, parece que com apenas alguns engenheiros de compiladores isso pode alcançar o nível necessário rapidamente
Por isso, ainda resta a dúvida se um LLM conseguiria resolver problemas realmente novos por conta própria
A Anthropic disse no blog que o kernel Linux também inicializa em x86, mas parece que só o RISC-V deu certo
No post oficial, foi dito que funcionava em x86/ARM/RISC-V, mas
na documentação do repositório só há testes em RISC-V
É interessante ver o tamanho da queda de desempenho em C sem otimização
No build do SQLite3, o CCC foi 12 vezes mais lento, e a versão otimizada foi 20 vezes mais lenta
Isso mostra o quanto o GCC entrega em termos de otimização
Mas, se o compilador faz embaralhamento excessivo de registradores, essa relação se perde e tudo passa a parecer Python
Surpreendeu que o CCC tenha sido mais lento até que
-O0O fato de o CCC ter compilado todos os arquivos C do kernel sem erro não significa que tenha produzido um resultado válido
Passar nos testes do SQLite por si só não basta
/dev/nullnão gera erroconste também deixa passar redefinições de tipo ou conversões inválidasOu seja, para atingir a meta de “passar nos testes”, ele acabou usando o truque de compilar até código inválido
Em alguns textos dizem que “o compilador é a parte mais fácil”, mas, na prática, o linker é a parte mais complexa
As milhares de codificações de instruções do x86-64, o layout detalhado do ELF e afins são coisas difíceis para uma IA lidar
Além disso, a conta de “4x mais lento em 1 iteração → 158.000x mais lento em 1 bilhão de iterações” não faz sentido
Faltavam muitas instruções, mas estaria em um nível em que bastaria preencher tabelas de dados
Impressiona como a expectativa humana muda rápido
Cinco anos atrás, dizer que “uma IA criou um compilador C a partir de um prompt em inglês” teria parecido uma piada absurda
Não entendo o cinismo excessivo do HN
Fazer um compilador C voltado para três arquiteturas já é difícil até para humanos, e
mesmo que só chegue ao ponto de passar no SQLite, isso já é um resultado impressionante para um projeto de fim de semana
Na maioria das empresas, a realidade não é construir compiladores de alto desempenho, mas sim cola de código para lógica de negócio
O problema está menos na tecnologia em si e mais na atitude de quem a usa
O ponto central no SQLite é o desempenho 158.000 vezes pior
Parsing é a parte fácil; a parte realmente difícil está em alocação de registradores e otimização
Comparar com o GCC não faz muito sentido, mas o simples fato de um LLM ter feito esse compilador já é surpreendente
O próximo objetivo seria reduzir a diferença para o GCC de 158.000x para algo na casa de 100x
Se cada iteração é 12 vezes mais lenta, o total também deveria ser 12 vezes mais lento; 158.000x parece erro ou mal-entendido
Também falta validar se o teste do SQLite realmente está sendo executado corretamente
Mesmo assim, fica a dúvida de por que o desempenho ficou tão baixo
Vale consultar o texto C não é uma linguagem totalmente parseável
Como apontaram, “se 1 iteração é 8x mais lenta, então 1 bilhão de iterações também deveria ser só 8x mais lento”, então
o número de 158.000x não fecha logicamente
Talvez o register spilling tenha estourado o cache L3, ou haja algum bug fazendo código desnecessário ser executado
Fazer um compilador C já é difícil até para humanos, mas
é difícil tratar isso como prova de inteligência do LLM
Trata-se de um problema já muito conhecido, com inúmeras implementações e documentação presentes nos dados de treino
Ou seja, o LLM não criou um projeto novo; ele recombinou padrões existentes
Ainda assim, ferramentas desse tipo continuam úteis, e
o que será realmente impressionante é quando surgir um modelo que, em vez de apenas replicar OSS existente, proponha uma abordagem nova