Hoje, você precisa de um compilador C real para ser um otimizador , principalmente porque C não é mais uma linguagem próxima ao hardware, porque os processadores atuais são incrivelmente complexos ( fora de ordem , em pipeline , superescalar , com caches complexos e TLB , portanto, necessitando de agendamento de instruções , etc ...). Os processadores x86 de hoje não são como os processadores i386 do século anterior, mesmo que ambos possam executar o mesmo código de máquina. Veja que o documento C não é um idioma de baixo nível (Seu computador não é um PDP-11 rápido) de David Chisnall.
Poucas pessoas estão usando compiladores C ingênuos e não otimizadores, como tinycc ou nwcc , pois eles produzem código que é várias vezes mais lento do que o que os compiladores otimizadores podem oferecer.
Codificar um compilador otimizador é difícil. Observe que o GCC e o Clang estão otimizando alguma representação de código "neutra no idioma de origem" (Gimple for GCC, LLVM for Clang). A complexidade de um bom compilador C não está na fase de análise!
Em particular, criar um compilador C ++ não é muito mais difícil do que criar um compilador C: analisar o C ++ e transformá-lo em alguma representação de código interno é complexo (porque a especificação do C ++ é complexa), mas é bem compreendido, mas as partes de otimização são ainda mais complexo (dentro do GCC: as otimizações de ponto intermediário, idioma de origem e processador de destino neutros, formam a maioria do compilador, com o restante sendo equilibrado entre front-ends para vários idiomas e back-ends para vários processadores). Portanto, a maioria dos compiladores C otimizadores também é capaz de compilar algumas outras linguagens, como C ++, Fortran, D, ... As partes específicas de C ++ do GCC são cerca de 20% do compilador ...
Além disso, C (ou C ++) é tão amplamente usado que as pessoas esperam que seu código seja compilável, mesmo quando ele não segue exatamente os padrões oficiais, que não definem com precisão a semântica da linguagem (para que cada compilador possa ter sua própria interpretação). ). Veja também o compilador C comprovado pelo CompCert e o analisador estático Frama-C , que se preocupam com a semântica mais formal de C.
E as otimizações são um fenômeno de cauda longa : implementar algumas otimizações simples é fácil, mas elas não tornarão um compilador competitivo! Você precisa implementar muitas otimizações diferentes, organizar e combiná-las de maneira inteligente, para obter um compilador do mundo real que seja competitivo. Em outras palavras, um compilador de otimização do mundo real precisa ser um software complexo. BTW, o GCC e o Clang / LLVM têm vários geradores de código C / C ++ especializados internos. E ambos são grandes animais (vários milhões de linhas de código-fonte, com uma taxa de crescimento de vários por cento ao ano) com uma grande comunidade de desenvolvedores (algumas centenas de pessoas, trabalhando principalmente em período integral ou pelo menos meio período).
Observe que não existe (até onde sei) compilador C multithread, mesmo que algumas partes de um compilador possam ser executadas em paralelo (por exemplo, otimização intra-processual, alocação de registro, programação de instruções ...). E a construção paralela com make -j
nem sempre é suficiente (especialmente com LTO ).
Além disso, é difícil obter recursos para codificar um compilador C do zero, e esse esforço precisa durar vários anos. Finalmente, a maioria dos compiladores C ou C ++ é software livre hoje (não há mais mercado para novos compiladores proprietários vendidos por startups) ou pelo menos são mercadorias monopolistas (como o Microsoft Visual C ++ ), e ser um software livre é quase necessário para compiladores ( porque precisam de contribuições de muitas organizações diferentes).
Eu ficaria muito satisfeito em conseguir financiamento para trabalhar em um compilador C do zero como software livre, mas não sou ingênuo o suficiente para acreditar que isso é possível hoje!