2009-02-26 10 views
14

Estoy diseñando un lenguaje de programación y uno de los problemas que estaba pensando era por qué los lenguajes de programación tardan en compilarse. Assumed C++ lleva mucho tiempo porque necesita analizar y compilar un encabezado cada vez que compila un archivo. Pero los encabezados precompilados de i-hear tardan tanto? Sospecho que C++ no es el único lenguaje que tiene este problema.¿Por qué las compilaciones tardan tanto?

Respuesta

14

La compilación es un proceso complicado que implica unos pasos bastante:

  • Escaneo/Lexing
  • de análisis
  • generación de código intermedio
  • optimización de código Posiblemente Intermedio
  • objetivo la generación de código máquina
  • Opcionalmente optimización del código dependiente de la máquina

(Dejando a un lado la vinculación.)

Naturalmente, esto llevará algún tiempo para que los programas más largos.

2

Toman el tiempo que toman y generalmente depende de la cantidad de material extraño que inyectas en tus unidades de compilación. Me gustaría verte compilarlos a mano más rápido :-)

La primera vez que compilas un archivo, no deberías tener ningún encabezado. Luego añádalos cuando los necesite (y verifique cuándo ha terminado si todavía los necesita).

Otras formas de reducir ese tiempo es mantener sus unidades de compilación pequeñas (incluso hasta el punto de una función por archivo, en un caso extremo) y utilizar una herramienta similar para asegurarse de que solo crea lo que necesita.

Algunos compiladores (realmente IDE) hacen una compilación incremental en el fondo para que estén (casi) siempre cerca de compilarse por completo.

+0

++ para compiladores más pequeños – Thilo

4

El diseño del lenguaje tiene tiene un efecto en el rendimiento del compilador. Los compiladores de C++ suelen ser más lentos que los compiladores de C#, lo que tiene mucho que ver con el diseño del lenguaje. (Esto también depende del implementador del compilador, Anders Hejlsberg implementado C# y es uno de los mejores).

La estructura simplista del "archivo de cabecera" de C++ contribuye a su rendimiento más lento, aunque los encabezados precompilados a menudo pueden ayudar. C++ es un lenguaje mucho más complejo que C, y los compiladores de C son por lo general más rápidos.

+0

¿Está seguro de que Anders participó en la implementación del compilador? Pensé que estaba más involucrado desde un punto de vista de alto nivel, y no en el código del compilador, pero esto es solo una especulación de mi parte. – Travis

+0

Me sorprendería que no estuviera involucrado en al menos parte de la implementación real, pero no estoy seguro. Definitivamente está involucrado en el diseño del lenguaje. –

+0

Delphi y Python vienen a la mente como compiladores excepcionalmente rápidos ... – Arafangion

16

Un problema específico de C++ que lo hace terriblemente lento es que, a diferencia de casi cualquier otro lenguaje, no se puede analizar independientemente del análisis semántico.

7

encabezados precompilados son manera más rápida, como se ha conocido al menos desde 1988.

La razón habitual para un compilador C o C++ Compiler para tomar un largo tiempo es que tiene #include, preproceso, y luego lex gazillions de tokens.

Como ejercicio, puede averiguar cuánto tiempo lleva solo ejecutar cpp en una colección típica de archivos de encabezado --- luego medir cuánto tiempo lleva leer la salida.

gcc -O utiliza una técnica de optimización muy efectiva pero algo lenta desarrollada por Chris Fraser y Jack Davidson. La mayoría de los otros optimizadores pueden ser lentos porque implican iteraciones repetidas en estructuras de datos bastante grandes.

+0

¿Sería justo decir que tratar de incluir mucha inteligencia en la optimización es una manera segura de crear largos tiempos de compilación? Este ha sido mi entendimiento casual, pero me resisto a hacer una declaración general ... – dmckee

+0

¿Por qué las optimizaciones no se pueden reutilizar de la compilación previa, cuando solo ha cambiado una fracción del código? O si se puede hacer, ¿cómo? – HopefullyHelpful

6

compilación no necesidad de tomar mucho tiempo: tcc compila ANSI C suficientemente rápido como para ser útil como un intérprete .

Algo para pensar:

  1. Complejidad en el escaneo y los pases de análisis sintáctico. Presumiblemente, requerir un look-aheads largo dañará, al igual que los lenguajes contextuales (en lugar de sin contexto).
  2. Representación interna. Construir y trabajar en un AST grande y funcional llevará algo de tiempo. Es de suponer que debería utilizar la representación interna más simple que admitirá las características que desea implementar.
  3. Optimización. La optimización es quisquillosa Necesita verificar muchas condiciones diferentes. Probablemente quieras hacer múltiples pases. Todo esto tomará tiempo.
0

creo que las otras respuestas aquí han perdido algunas partes importantes de la situación que lenta C++ compilación:

    modelo
  • Compilación que salva .obj/.o archivos en el disco, los lee espalda, y luego los une
  • La vinculación de enlazadores lentos generales y malas, en particular
  • sistema complejo macro preprocesador
  • arbitrariamente complejo sistema de plantillas-Turing completa
  • inclusión anidada y repetida de los archivos de origen, incluso con #pragma once
  • fragmentación infligido por el usuario, el código de la división en demasiados archivos (incluso hasta el punto de una función por archivo, en un caso extremo)
  • hinchado o baja -Esfuerzo estructuras de datos internas en el compilador
  • biblioteca estándar Overbloated, abuso plantilla

Por el contrario, éstos no retrasan C++ compilación:

  • Escaneo/Lexing
  • de análisis
  • generación de código intermedio
  • objetivo de generación de código de máquina

Como acotación al margen, la optimización es uno de los mayores retrasos, pero es la única desaceleración aquí que es realmente necesario por alguna medida, y también es completamente opcional.

Cuestiones relacionadas