¿Las compilaciones largas son cosa del pasado?

38

Hay innumerables historias de guerra sobre cuánto tiempo puede tomar una compilación. Incluso xkcd lo mencionó.

Ahora, no he estado programando durante mucho tiempo y en su mayoría solo he estado expuesto a Java y Python (y Python es un lenguaje interpretado, no compilado). Me doy cuenta de que es posible que no haya encontrado proyectos que tarden mucho en compilarse, pero incluso para aplicaciones de tamaño decente, ha sido instantáneo para mí (generalmente manejado en segundo plano por un IDE) o no ha tomado más de 30 segundos más o menos para un proyecto extremadamente grande. Incluso en un entorno empresarial (donde tiene lugar el cómic), nunca me ha tomado tanto tiempo compilar el código.

¿No he estado expuesto a proyectos con largos tiempos de compilación? ¿Es esta una reliquia del pasado que ya no es algo que sucede en la actualidad? ¿Por qué una compilación llevaría tanto tiempo?

Forja del Trueno
fuente
31
Intenta compilar cromo.
UldisK
2
Tome una copia del kernel de Linux. Haz una construcción completa. Ver por ti mismo. O Spring de la fuente si eres un codificador de Java. Tal como está, esta pregunta tiene varias respuestas que responden la pregunta como si fuera una encuesta ("He hecho 30 minutos compilando ..." respuestas tipo) lo que es una indicación de que la pregunta en sí misma no encaja bien .
Un gran proyecto reciente me tomó 40 minutos para compilar (40 000 archivos de código fuente compilando con Maven). La solución alternativa es paralizar la compilación en muchos núcleos de CPU.
Niklas Rosencrantz
2
Elija una fuente de distribución de Linux (gentoo, LFS, ...) y luego pase días compilando cada software que esté instalando.
Basile Starynkevitch
66
definir mucho ... Para algún niño recién salido de la escuela, 1 minuto puede parecer largo, para un veterano que ha estado en las trincheras durante décadas unas pocas horas no levanta las cejas.
Jwenting

Respuestas:

48

La compilación puede llevar un tiempo, especialmente para grandes proyectos escritos en lenguajes como C, C ++ o Scala. Compilar partes en segundo plano puede reducir el tiempo de compilación, pero ocasionalmente tiene que hacer una nueva compilación. Los factores que pueden conducir a largos tiempos de compilación incluyen:

  • Código de gran tamaño, obviamente. Los grandes proyectos tendrán cientos de miles de líneas de código.

  • La #includedirectiva de preprocesador de C , que efectivamente hace que el mismo código se compile cientos de veces. El sistema macro tiene problemas similares, ya que funciona a nivel de texto. El preprocesador realmente aumenta el tamaño del código que realmente se pasa al compilador. Mirar un archivo después del preprocesamiento (por ejemplo, a través de gcc -E) debería abrir los ojos.

  • Las plantillas de C ++ son Turing completas, lo que significa que, en teoría, puede realizar cálculos arbitrarios en tiempo de compilación. Nadie realmente quiere hacer eso, pero incluso muchos casos simples suman bastante tiempo dedicado a especializar las plantillas.

  • Scala es un lenguaje bastante joven, y el compilador está terriblemente sub-optimizado. Actualmente, el compilador utiliza una gran cantidad de pases de compilación (C está diseñado para requerir solo dos pases de compilación). La verificación de tipos es uno de estos pases, y puede llevar algo de tiempo debido al complicado sistema de tipos que presenta el idioma.

La compilación no es lo único que lleva tiempo. Después de compilar el proyecto, se debe ejecutar un conjunto de pruebas. El tiempo dedicado a esto puede variar desde unos pocos segundos hasta un par de horas (si las pruebas están mal escritas).

amon
fuente
14
En realidad, el sistema de tipos de Scala es Turing completo, por lo que la verificación de tipos puede tomar una cantidad infinita de tiempo, y es imposible que el compilador determine eso.
Jörg W Mittag
77
No olvides las optimizaciones. Muchas optimizaciones que un (por ejemplo) compilador C / C ++ hará son muy caras (por ejemplo, tan caras que JIT no puede permitirse el lujo de hacerlo). Para el peor de los casos, la mayoría de las cadenas de herramientas admiten la optimización de todo el programa ahora, que se sabe que aumenta significativamente los tiempos de construcción.
Brendan
Acepté esta respuesta porque usted señaló una serie de cosas que no estaba considerando, específicamente compilar todo en lugar de compilar en partes y el hecho de que las suites de prueba podrían incluirse en este momento de "compilación".
Thunderforge
1
no solo conjuntos de pruebas: análisis de cobertura de código, empaquetado automatizado, implementaciones automatizadas en el sistema de prueba; Hay muchas cosas envueltas en un sistema de construcción integrado en estos días. Y si está en espera hasta que llegue al entorno de desarrollo o qa, ciertamente tiene tiempo para una pequeña pelea de sillas.
corsiKa
1
Gran respuesta, solo señalaría que la propagación de los posibles tiempos de compilación puede ser mucho mayor. He trabajado en proyectos donde una compilación completa podría tomar de dos a tres días (¡sí, fue horrible!) E imagino que hay peores delincuentes por ahí.
Roy T.
17

De ninguna manera es una reliquia del pasado. Uno de los proyectos en los que trabajo requiere 45 minutos para una construcción limpia desde cero. Aparte de nuestro propio código, también tenemos que extraer y construir la fuente de varias bibliotecas C y C ++ grandes desde repositorios externos. Compilar y vincular códigos C y C ++ es computacionalmente costoso. Como usted señala, Python generalmente se implementa como un lenguaje interpretado, y Java generalmente usa un compilador JIT (Just in Time), por lo que sus proyectos se saltan la compilación inicial y los costos de vinculación por completo. El precio que paga es en tiempos de inicio más largos y (al menos para Python) una velocidad de ejecución más lenta.

Cuando los tiempos de construcción se alargan tanto, se vuelve más importante aprovechar los sistemas de integración continua como Jenkins o TeamCity . Esto permite que los desarrolladores individuales eviten (en su mayoría) el dolor de construir desde cero, mientras siguen probando que los cambios no están rompiendo la construcción.

Charles E. Grant
fuente
1
javac no está " omitiendo la compilación inicial y los costos de vinculación por completo ". Se saltea muchos costos de optimización, pero sigue transformando la fuente en bytecode y haciendo muchas comprobaciones estáticas en el proceso. Hace casi tanto enlace como un compilador de C. La verdadera diferencia de rendimiento es que el proceso de compilación de Java se diseñó en una era en la que se suponía que era posible cargar todo el programa y sus dependencias en la memoria de una vez en lugar de tener que dividirlo en pequeños fragmentos y reprocesar los mismos archivos miles de veces.
Peter Taylor
10

Los grandes proyectos pueden llevar mucho tiempo. Puede ser una hora o más para un proyecto lo suficientemente grande. Hay un par de bibliotecas que tengo que compilar desde la fuente en mi computadora que requieren mucho tiempo, por ejemplo, opencascade. El kernel de Linux también toma bastante tiempo si tiene que construirlo desde cero.

Sin embargo, hay otros procesos de compilación que pueden llevar mucho más tiempo. El diseño del circuito digital (ya sea para ASIC o FPGA) requiere un lugar y un paso de ruta. El paso de ubicación y ruta es donde se determina la ubicación de puertas lógicas individuales, flip-flops, registros, RAM y otros componentes junto con el enrutamiento para el cableado de interconexión. El software utiliza modelos de tiempo para determinar los retrasos de la puerta y el enrutamiento para posibles ubicaciones, los compara con los límites proporcionados por las restricciones de tiempo y luego ajusta las ubicaciones de ubicación y las rutas de los cables para tratar de cumplir con los requisitos de tiempo. A veces, el software incluso tendrá que cambiar el tamaño de las puertas y agregar buffers para cumplir con el tiempo. Este paso es extremadamente computacionalmente intenso y puede llevar muchas horas o incluso días completarlo. Tampoco realmente paraleliza muy bien. Había un diseño de FPGA en el que estaba trabajando hace aproximadamente un año que consumía aproximadamente la mitad de un FPGA Virtex 6 HXT 565 (~ 300k de 565k LUT) y tardó aproximadamente 7 horas en completar el lugar y la ruta. No puedo imaginar cuánto tiempo tomaría ejecutar el lugar y enrutar algo como un diseño de CPU Core i7, probablemente al menos varias semanas.

alex.forencich
fuente
4

Otras respuestas ya han mencionado que sí, el código en proyectos grandes, donde grande significa 500k líneas y más, puede llevar un tiempo significativo, especialmente cuando se construye desde cero.

El punto adicional es que algunos proyectos tienen que ser construidos para múltiples entornos de destino. Cuando las máquinas que alojan esos entornos no están disponibles, la compilación debe realizarse mediante compilación cruzada, en serie en las máquinas que tiene. Esto puede conducir a tiempos de construcción significativos . Para un proyecto en el que trabajé, la construcción nocturna tomaría 10 horas. ¡Ay de que fuiste tú quien lo rompió!

Añadiría que no te saldrías con ninguna excusa para perder el tiempo. Una persona profesional debe ser la planificación de sus tareas de modo que no tienen algo útil que hacer en tales períodos.

andy256
fuente
3

Un poco de ambos. C ++ (y C en menor medida) fueron conocidos por sus lentos tiempos de compilación, especialmente en hardware de época. Alrededor del cambio de milenio, trabajé en un proyecto que tardó aproximadamente 4 horas en construirse debido a las macro travesuras.

En la actualidad, las cosas están mejor, pero mi experiencia en 30 segundos es bastante baja, especialmente en las compilaciones formales donde las cosas deben verificarse desde el control de origen, las pruebas de unidad ejecutadas, los instaladores construidos y todo lo que se envía a alguna SAN en algún lugar.

Telastyn
fuente
2

Depende del proyecto y del entorno en el que se compila. He trabajado en proyectos de C ++ que tardó varios minutos en compilarse (configurado como proyectos múltiples en MSVS), que probablemente sea tiempo suficiente para una pelea de espadas.

Si trabaja para una gran empresa con un gran código y base de datos (Proctor and Gamble, Google, etc.) o para una pequeña empresa o startup centrada en uno o dos productos primarios que son muy complejos (por ejemplo, simulación y renderización científica), entonces esperar un gran proyecto para compilar es algo realista incluso en máquinas potentes. Esto puede afectar la forma en que desarrolla y depura el código (así como la frecuencia con la que elige actualizar y combinar los cambios a través del control de versiones).

Trixie Wolf
fuente