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?
fuente
Respuestas:
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
#include
directiva 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 degcc -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).
fuente
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.
fuente
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.
fuente
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.
fuente
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.
fuente
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).
fuente