Hoy 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 ( off-of-order , pipelined , superscalar , con complejos cachés & TLB , por lo que necesito la programación de instrucciones de , etc ...). Los procesadores x86 de hoy no son como los procesadores i386 del siglo anterior, incluso si ambos son capaces de ejecutar el mismo código de máquina.
Pocas personas utilizan compiladores de C no optimizados como tinycc o nwcc , ya que producen un código que es varias veces más lento de lo que los compiladores de optimización pueden ofrecer.
Codificar un compilador de optimización es difícil. Tenga en cuenta que tanto GCC como Clang están optimizando alguna representación de código "independiente del idioma de origen" (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 complejos (dentro de GCC: las optimizaciones de gama media, el idioma de origen y el procesador de destino son neutros, forman la mayoría del compilador, y el resto se equilibra entre las aplicaciones para varios idiomas y back-ends para varios procesadores). Por lo tanto, la mayoría de los compiladores de C que optimizan 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 idioma (por lo que cada compilador puede tener Su propia interpretación de ello). Busque también en el CompCert y el compilador de C probado, y el Frama -C analizador estático, que se preocupa por una semántica de C.
más formal.
Y las optimizaciones son un fenómeno long-tail : implementar algunas optimizaciones simples es fácil, pero no se lograrán. Un compilador competitivo! Debe implementar muchas optimizaciones diferentes, y organizarlas y combinarlas de manera inteligente para obtener un compilador real que sea competitivo. En otras palabras, un compilador optimizador del mundo real debe ser una pieza compleja de software. Por cierto, tanto GCC como Clang / LLVM tienen varios generadores internos de código C / C ++ especializados. Y ambas son grandes 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 en su mayoría a tiempo completo, o al menos a medio tiempo). / p>
Observe que hay no (a mi entender) el compilador C de múltiples subprocesos, incluso si algunas partes de un compilador podrían ejecutarse en paralelo (por ejemplo, optimización intra-procedimiento, asignación de registros, programación de instrucciones ...). Y la creación paralela con make -j
no siempre es suficiente (especialmente con LTO ).
Además, es difícil obtener financiación para codificar un compilador de C desde cero, y tal esfuerzo debe durar varios años. Finalmente, la mayoría de los compiladores C o C ++ son software libre hoy en día (ya no existe un mercado para los compiladores propietarios nuevos vendidos por startups) o al menos son productos monopólicos (como Microsoft Visual C ++ ), y ser un software gratuito es casi obligatorio 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!