Hoy en día, necesita un compilador de C real para ser un compilador de optimización , especialmente porque C ya no es un lenguaje cercano al hardware, porque los procesadores actuales son increíblemente complejos ( fuera de orden , canalizados , superescalares , con cachés complejos y TLB , por lo tanto, necesita programación de instrucciones , etc ...). Los procesadores x86 actuales no son como los procesadores i386 del siglo anterior, incluso si ambos pueden ejecutar el mismo código de máquina. Vea que el C no es un lenguaje de bajo nivel (Su computadora no es un PDP-11 rápido) escrito por David Chisnall.
Pocas personas están utilizando compiladores de C ingenuos no optimizadores como tinycc o nwcc , ya que producen código que es varias veces más lento de lo que pueden proporcionar los compiladores de optimización.
Codificar un compilador de optimización es difícil. Observe que tanto GCC como Clang están optimizando alguna representación de código "neutral en el lenguaje fuente" (Gimple para GCC, LLVM para Clang). ¡La complejidad de un buen compilador de C no está en la fase de análisis!
En particular, hacer un compilador de C ++ no es mucho más difícil que hacer un compilador de C: analizar C ++ y transformarlo en alguna representación de código interno es complejo (porque la especificación de C ++ es compleja), pero se entiende bien, pero las partes de optimización son aún más complejo (dentro de GCC: las optimizaciones intermedias, el lenguaje de origen y el procesador de destino neutral, forman la mayoría del compilador, con el resto equilibrado entre los front-end para varios idiomas y los back-end para varios procesadores). Por lo tanto, la mayoría de los compiladores de C optimizadores también pueden compilar algunos otros lenguajes, como C ++, Fortran, D, ... Las partes específicas de C ++ de GCC son aproximadamente el 20% del compilador ...
Además, C (o C ++) se usa tanto que las personas esperan que su código sea compilable incluso cuando no sigue exactamente los estándares oficiales, que no definen con suficiente precisión la semántica del lenguaje (por lo que cada compilador puede tener su propia interpretación de eso). Mire también el compilador comprobado CompCert C y el analizador estático Frama-C , que se preocupa por una semántica más formal de C.
Y las optimizaciones son un fenómeno de cola larga : implementar algunas optimizaciones simples es fácil, ¡pero no harán que un compilador sea competitivo! Debe implementar muchas optimizaciones diferentes, y organizarlas y combinarlas inteligentemente, para obtener un compilador del mundo real que sea competitivo. En otras palabras, un compilador de optimización del mundo real tiene que ser una pieza compleja de software. Por cierto, tanto GCC como Clang / LLVM tienen varios generadores de código C / C ++ especializados internos. Y ambos son enormes bestias (varios millones de líneas de código fuente, con una tasa de crecimiento de varios por ciento cada año) con una gran comunidad de desarrolladores (unos pocos cientos de personas, que trabajan principalmente a tiempo completo, o al menos a medio tiempo).
Tenga en cuenta que no hay ningún compilador C multiproceso (que yo sepa), incluso si algunas partes de un compilador podrían ejecutarse en paralelo (por ejemplo, optimización intraprocesal, asignación de registros, programación de instrucciones ...). Y la construcción paralela con make -j
no siempre es suficiente (especialmente con LTO ).
Además, es difícil obtener fondos para codificar un compilador de C desde cero, y ese esfuerzo debe durar varios años. Finalmente, la mayoría de los compiladores de C o C ++ son software libre hoy en día (ya no hay un mercado para nuevos compiladores propietarios vendidos por startups) o al menos son productos monopólicos (como Microsoft Visual C ++ ), y es casi obligatorio ser un software gratuito para los compiladores ( porque necesitan contribuciones de muchas organizaciones diferentes).
Me encantaría obtener fondos para trabajar en un compilador de C desde cero como software libre, ¡pero no soy tan ingenuo como para creer que hoy es posible!