A compilação longa é uma coisa do passado?

37

Existem inúmeras histórias de guerra sobre quanto tempo uma compilação pode levar. Até mesmo xkcd fez menção a isso.

Agora, eu não tenho programado há muito tempo e, na maioria das vezes, fui exposto a Java e Python (e Python é uma linguagem interpretada, não compilada). Percebo que é possível que eu não tenha encontrado projetos que demorem muito tempo para serem compilados, mas mesmo para aplicativos de tamanho decente, ele foi instantâneo para mim (geralmente manipulado em segundo plano por um IDE) ou não leva mais que 30 segundos ou mais para um projeto extremamente grande. Mesmo em um ambiente de negócios (onde os quadrinhos acontecem), nunca tive código demorado para compilar.

Acabei de não ter sido exposto a projetos com longos tempos de compilação? Isso é uma relíquia do passado que não é mais algo que acontece nos dias modernos? Por que uma compilação demoraria tanto tempo?

    
por Thunderforge 27.09.2014 / 00:11
fonte

6 respostas

46

A compilação pode demorar um pouco, especialmente para projetos grandes escritos em linguagens como C, C ++ ou Scala. A compilação de partes em segundo plano pode reduzir o tempo de compilação, mas ocasionalmente você precisa fazer uma nova compilação. Fatores que podem levar a longos períodos de compilação incluem:

  • Tamanho de código grande, obviamente. Grandes projetos terão centenas de milhares de linhas de código.

  • A diretiva de pré-processamento #include do C, que efetivamente faz com que o mesmo código seja compilado centenas de vezes. O sistema de macro tem problemas semelhantes, pois funciona em um nível de texto. O pré-processador realmente aumenta o tamanho do código que é realmente passado para o compilador. Observar um arquivo após o pré-processamento (por exemplo, via gcc -E ) deve abrir seus olhos.

  • Os modelos de C ++ são Turing completos, o que significa que, em teoria, você pode realizar cálculos arbitrários em tempo de compilação. Ninguém realmente quer fazer isso, mas até mesmo muitos casos simples acabam se dedicando à especialização dos modelos.

  • O Scala é uma linguagem relativamente nova, e o compilador é terrivelmente pouco otimizado. Atualmente, o compilador usa um número muito grande de passagens de compilação (C é projetado para exigir apenas dois passos de compilação). A verificação de tipos é um desses passos e pode levar algum tempo devido ao complicado sistema de tipos apresentado pela linguagem.

A compilação não é a única coisa que leva tempo. Depois que o projeto foi compilado, um conjunto de testes deve ser executado. O tempo gasto com isso pode variar de alguns segundos a algumas horas (se os testes forem mal escritos).

    
por 27.09.2014 / 00:38
fonte
16

Não é de forma alguma uma relíquia do passado. Um dos projetos em que trabalho requer 45 minutos para uma compilação limpa do zero. Além do nosso próprio código, também temos que extrair e construir a fonte de várias bibliotecas grandes de C e C ++ a partir de repositórios externos. Compilar e vincular códigos C e C ++ é computacionalmente caro. Como você aponta, o Python é tipicamente implementado como uma linguagem interpretada, e o Java geralmente usa um compilador JIT (just in time), então seus projetos estão pulando completamente os custos de compilação e linkagem iniciais. O preço que você paga é em tempos de inicialização mais longos e (pelo menos para Python) velocidade de execução mais lenta.

Quando os tempos de compilação aumentam, torna-se mais importante aproveitar os sistemas de integração contínua, como Jenkins ou TeamCity . Isso permite que desenvolvedores individuais (principalmente) evitem a dificuldade de construir do zero, enquanto ainda testam que as alterações não estão quebrando a compilação.

    
por 27.09.2014 / 02:20
fonte
9

Grandes projetos podem levar muito tempo. Pode ser uma hora ou mais para um projeto grande o suficiente. Existem algumas bibliotecas que eu tenho que compilar a partir da fonte no meu computador que demoram muito tempo - por exemplo, opencascade. O próprio kernel do Linux também leva muito tempo se você tiver que construí-lo do zero.

No entanto, existem outros processos semelhantes à compilação que podem levar muito mais tempo. O design do circuito digital (para ASICs ou FPGAs) requer uma etapa de local e rota. O local e a etapa da rota é onde o posicionamento de portas lógicas individuais, flip-flops, registros, RAMs e outros componentes é determinado juntamente com o roteamento para a fiação de interconexão. O software usa modelos de temporização para determinar os atrasos de gate e roteamento para possíveis veiculações, compara-os aos limites fornecidos pelas restrições de tempo e, em seguida, ajusta os locais de posicionamento e os caminhos dos cabos para tentar atender aos requisitos de tempo. Às vezes, o software terá até que redimensionar portões e adicionar buffers para atender o tempo. Este passo é extremamente intensivo em termos computacionais e pode levar muitas horas ou até dias para ser concluído. Ele também não paraleliza muito bem. Havia um projeto de FPGA que eu estava trabalhando há um ano atrás, que consumiu cerca de metade de um FPGA Virtex 6 HXT 565 (~ 300k de 565k LUTs) e levou cerca de 7 horas para completar o local e a rota. Eu não posso imaginar quanto tempo levaria para rodar o lugar e traçar algo como um design de CPU Core i7 - provavelmente pelo menos várias semanas.

    
por 27.09.2014 / 07:36
fonte
3

Outras respostas já mencionaram que sim, código em grandes projetos, em que grande significa 500k linhas ou mais, pode levar um tempo significativo, especialmente ao construir do zero.

O ponto adicional é que alguns projetos precisam ser criados para vários ambientes de destino. Quando as máquinas que hospedam esses ambientes não estão disponíveis, a compilação deve ser feita por compilação cruzada, em série nas máquinas que você possui. Isso pode levar a tempos de criação significativos . Para um projeto em que trabalhei, a construção noturna levaria 10 horas. Ai que você foi o único que quebrou!

Gostaria de acrescentar que você não iria se safar com tal desculpa para perder tempo. Um profissional deve estar planejando suas tarefas para que eles façam algo útil para fazer em tais períodos.

    
por 27.09.2014 / 05:23
fonte
2

Um pouco dos dois. C ++ (e C, em menor escala) eram notórios por seus tempos de compilação lentos, especialmente em hardware de período. Por volta da virada do milênio, trabalhei em um projeto que levou cerca de 4 horas para ser construído devido a travessuras macro.

Hoje em dia as coisas são melhores, mas 30 segundos são bastante baixos em minha experiência - especialmente em compilações formais onde as coisas precisam ser verificadas no controle de origem, testes de unidade executados, instaladores construídos e tudo enviado para alguma SAN em algum lugar.

    
por 27.09.2014 / 00:38
fonte
1

Depende do projeto e do ambiente no qual ele é compilado. Eu trabalhei em projetos C ++ que levaram vários minutos para compilar (configurados como múltiplos projetos no MSVS), o que provavelmente é tempo suficiente para uma luta de espadas.

Se você trabalha para uma grande empresa com um enorme código e banco de dados (Proctor and Gamble, Google etc.) ou para uma pequena empresa ou startup focada em um ou dois produtos primários que são muito complexos (por exemplo, simulação científica e renderização), em seguida, esperar por um grande projeto para compilar é uma coisa realista para esperar, mesmo em máquinas poderosas. Isso pode afetar o modo como você desenvolve e depura código (bem como a frequência com que você escolhe atualizar e mesclar alterações por meio de controle de versão).

    
por 27.09.2014 / 01:51
fonte