As compilações longas são coisa do passado?

38

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

Agora, não programo há muito tempo e acabei sendo exposto principalmente a Java e Python (e Python é uma linguagem interpretada, não compilada). Percebo que é possível que eu não tenha encontrado projetos que demoram muito para serem compilados, mas mesmo para aplicativos de tamanho decente, ele foi instantâneo para mim (geralmente tratado em segundo plano por um IDE) ou demorou mais de 30 segundos ou mais para um projeto extremamente grande. Mesmo em um ambiente de negócios (onde os quadrinhos acontecem), nunca tive código demorando tanto para compilar.

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

Forja do Trovão
fonte
31
Tente compilar o cromo.
UldisK
2
Pegue uma cópia do kernel do linux. Faça uma compilação completa. Veja por si mesmo. Ou salte da fonte se você é um codificador Java. Como está, essa pergunta tem várias respostas que estão respondendo à pergunta como se fosse uma enquete (respostas do tipo "compilações de 30 minutos ..."), o que é uma indicação de que a pergunta em si não é adequada. .
Um grande projeto recente levou 40 minutos para compilar (40.000 arquivos de código-fonte compilando com o Maven). A solução alternativa é paralizar a compilação em muitos núcleos da CPU.
Niklas Rosencrantz
2
Escolha uma distribuição Linux de origem (gentoo, LFS, ...) e passe dias compilando todos os softwares que você está instalando.
Basile Starynkevitch
6
definir por muito tempo ... Para um garoto recém-saído da escola, um minuto pode parecer longo, para um veterano que está nas trincheiras há décadas há algumas horas, não levanta sobrancelhas.
Jwenting

Respostas:

48

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, é necessário fazer uma nova compilação. Fatores que podem levar a longos tempos de compilação incluem:

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

  • A #includediretiva de pré-processador de C , que efetivamente faz com que o mesmo código seja compilado centenas de vezes. O sistema macro tem problemas semelhantes, pois funciona no nível do 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 do C ++ são Turing completos, o que significa que, em teoria, você pode executar cálculos arbitrários em tempo de compilação. Ninguém realmente quer fazer isso, mas mesmo muitos casos simples resultam em algum tempo gasto especializando os modelos.

  • Scala é uma linguagem bastante jovem, e o compilador é terrivelmente sub-otimizado. Atualmente, o compilador usa um número muito grande de passes de compilação (C foi projetado para exigir apenas duas passagens de compilação). A digitação é uma dessas passagens e pode levar algum tempo devido ao complicado sistema de tipos apresentado pelo idioma.

Compilação não é a única coisa que leva tempo. Após a compilação do projeto, 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).

amon
fonte
14
Na verdade, o sistema de tipos do Scala é completo em Turing, portanto, a verificação do tipo pode levar uma quantidade infinita de tempo e é impossível para o compilador determinar isso.
Jörg W Mittag
7
Não se esqueça de otimizações. Muitas otimizações que um (por exemplo) compilador C / C ++ fará são muito caras (por exemplo, tão caras que o JIT não pode se dar ao luxo de fazê-las). Na pior das hipóteses, a maioria das cadeias de ferramentas suporta a otimização de todo o programa agora, o que é conhecido por aumentar significativamente o tempo de construção.
Brendan
Aceitei esta resposta porque você apontou várias coisas que eu não estava considerando, especificamente compilar tudo versus compilar em partes e o fato de que as suítes de teste podem ser incluídas nesse período de "compilação".
Thunderforge
11
não apenas conjuntos de testes - análise de cobertura de código, empacotamento automatizado, implantações automatizadas no sistema de teste; Atualmente, existem muitas coisas envolvidas em um sistema de compilação integrado. E se você estiver em espera até chegar ao ambiente dev ou qa, certamente terá tempo para uma pequena cadeira justa.
corsiKa
11
Ótima resposta, gostaria apenas de observar que a propagação de possíveis tempos de compilação pode ser muito maior. Eu trabalhei em projetos nos quais uma compilação completa pode levar de dois a três dias (sim, isso foi horrível!) E imagino que haja criminosos piores por aí.
Roy T.
17

Não é de modo algum uma relíquia do passado. Um dos projetos em que trabalho exige 45 minutos para uma construção limpa do zero. Além do nosso próprio código, também precisamos extrair e construir a fonte de várias grandes bibliotecas C e C ++ de repositórios externos. Compilar e vincular códigos C e C ++ é computacionalmente caro. Como você aponta, o Python normalmente é implementado como uma linguagem interpretada, e o Java geralmente usa um compilador JIT (Just in Time), para que seus projetos estejam ignorando a compilação inicial e os custos de vinculação. O preço pago é mais demorado e (pelo menos para o Python) menor velocidade de execução.

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

Charles E. Grant
fonte
11
javac não está " pulando a compilação inicial e vinculando os custos ". Ele pula muitos custos de otimização, mas ainda está transformando a fonte em bytecode e fazendo muitas verificações estáticas no processo. Faz quase tanto link quanto um compilador C. A diferença real de desempenho é que o processo de compilação do Java foi projetado em uma época em que era possível carregar o programa inteiro e suas dependências na memória de uma só vez, em vez de ter que dividi-lo em pequenos pedaços e reprocessar os mesmos arquivos milhares de vezes.
Peter Taylor #
10

Projetos grandes podem levar muito tempo. Pode levar 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 levam muito tempo - por exemplo, opencascade. O próprio kernel Linux também leva muito tempo se você precisar construí-lo do zero.

No entanto, existem outros processos de compilação que podem levar muito mais tempo. O design do circuito digital (para ASICs ou FPGAs) requer um local e uma etapa da rota. A etapa do local e da rota é onde o posicionamento de portas lógicas, flip-flops, registradores, RAMs e outros componentes individuais é determinado juntamente com o roteamento da fiação de interconexão. O software usa modelos de tempo para determinar os atrasos de gate e roteamento para possíveis posicionamentos, compara-os com os limites fornecidos pelas restrições de tempo e, em seguida, ajusta os locais de posicionamento e os caminhos dos fios para tentar atender aos requisitos de tempo. Às vezes, o software precisa redimensionar portas e adicionar buffers para atender ao tempo. Essa etapa é extremamente intensiva em termos de computação e pode levar muitas horas ou até dias para ser concluída. Também não é realmente muito paralelo. Havia um design de FPGA em que eu trabalhava há um ano ou mais que consumia cerca de metade de um FPGA Virtex 6 HXT 565 (~ 300k de 565k LUTs) e levava cerca de 7 horas para concluir o local e a rota. Não consigo imaginar quanto tempo levaria para rodar e rodar em algo como um design de CPU Core i7 - provavelmente pelo menos várias semanas.

alex.forencich
fonte
4

Outras respostas já mencionaram que sim, o código em projetos grandes, onde grandes significam 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 construção significativos . Para um projeto em que trabalhei, a construção noturna levaria 10 horas. Ai de você que quebrou!

Eu acrescentaria que você não se safaria dessa desculpa por perder tempo. Uma pessoa profissional deve estar a planear as suas tarefas de modo que eles não têm algo útil para fazer em tais períodos.

andy256
fonte
3

Um pouco dos dois. C ++ (e C em menor grau) 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 demorou cerca de 4 horas para ser construído devido a macro travessuras.

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

Telastyn
fonte
2

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

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

Trixie Wolf
fonte