긴 컴파일은 과거의 일입니까?


38

컴파일에 걸리는 시간에 대한 수많은 전쟁 이야기가 있습니다. xkcd 조차도 언급했습니다.

이제는 오랫동안 프로그래밍하지 않았으며 대부분 Java와 Python에 노출되었습니다 (Python은 컴파일 된 언어가 아닌 해석 된 언어입니다). 컴파일하는 데 시간이 오래 걸리는 프로젝트를 보지 못했을 수도 있지만 적절한 크기의 앱조차도 즉각적으로 (일반적으로 IDE에서 백그라운드에서 처리) 또는 30을 넘지 않는 것으로 나타났습니다. 매우 큰 프로젝트의 경우 몇 초 정도 걸립니다. 만화가 이루어지는 비즈니스 환경에서도 컴파일하는 데 오래 걸리지 않았습니다.

컴파일 시간이 긴 프로젝트에 노출되지 않았습니까? 더 이상 현대에 일어나지 않는 과거의 유물입니까? 컴파일에 왜 그렇게 오래 걸립니까?


31
크롬을 컴파일하십시오.
UldisK

2
리눅스 커널의 복사본을 잡아라. 완전한 빌드를 수행하십시오. 직접 참조하십시오. 또는 Java 코더 인 경우 소스에서 스프링하십시오. 이 질문에는 설문 조사 ( "30 분 컴파일했습니다 ..."유형 답변) 인 것처럼 질문에 답변하는 몇 가지 답변이 있습니다. 이는 질문 자체가 적합하지 않음을 나타냅니다. .

최근의 큰 프로젝트는 컴파일하는 데 40 분이 걸렸습니다 (Maven으로 컴파일하는 40 000 소스 코드 파일). 해결 방법은 많은 CPU 코어에서 컴파일을 병렬화하는 것입니다.
Niklas Rosencrantz

2
소스 Linux 배포판 (gentoo, LFS 등)을 선택한 다음 설치하는 모든 소프트웨어를 컴파일하는 데 며칠이 걸립니다.
Basile Starynkevitch

6
오래 정의하십시오 ... 학교 밖에서 새로 온 일부 어린이에게는 1 분이 길어 보일 수 있습니다. 수십 년 동안 참호를했던 옛 타이머에게는 눈썹을 올리지 않습니다.
jwenting

답변:


48

특히 C, C ++ 또는 Scala와 같은 언어로 작성된 대규모 프로젝트의 경우 컴파일에 시간이 걸릴 수 있습니다. 백그라운드에서 파트를 컴파일하면 컴파일 시간이 단축 될 수 있지만 때로는 새로운 컴파일을 수행해야합니다. 컴파일 시간이 길어질 수있는 요소는 다음과 같습니다.

  • 분명히 큰 코드 크기. 대규모 프로젝트에는 수십만 줄의 코드가 있습니다.

  • C의 #include전 처리기 지시문은 동일한 코드가 수백 번 효과적으로 컴파일되도록합니다. 매크로 시스템은 텍스트 수준에서 작동하므로 비슷한 문제가 있습니다. 전처리 기는 실제로 컴파일러에 전달되는 코드 크기를 크게 증가시킵니다. 전처리 후 파일을 보면 (예 :을 통해 gcc -E) 눈을 뜨어야합니다.

  • C ++의 템플릿은 Turing complete이므로 이론적으로 컴파일 타임에 임의의 계산을 수행 할 수 있습니다. 아무도 실제로 그렇게하고 싶지는 않지만 많은 간단한 경우조차도 템플릿을 전문화하는 데 많은 시간을 소비합니다.

  • 스칼라는 상당히 젊은 언어이며 컴파일러는 끔찍하게 최적화되지 않았습니다. 현재 컴파일러는 매우 많은 수의 컴파일 패스를 사용합니다 (C는 두 개의 컴파일 패스 만 요구하도록 설계되었습니다). 유형 검사는 이러한 단계 중 하나이며 언어에 의해 특징 지어진 복잡한 유형 시스템으로 인해 시간이 걸릴 수 있습니다.

컴파일 만이 시간이 걸리는 것은 아닙니다. 프로젝트가 컴파일 된 후 테스트 스위트를 실행해야합니다. 이 작업에 소요되는 시간은 몇 초에서 몇 시간까지입니다 (테스트가 잘못 작성된 경우).


14
실제로 Scala의 타입 시스템은 Turing-complete이므로 타입 확인에 시간이 오래 걸릴 수 있으며 컴파일러가이를 확인할 수 없습니다.
Jörg W Mittag

7
최적화를 잊지 마십시오. (예를 들어) C / C ++ 컴파일러가 수행 할 많은 최적화는 매우 비싸다 (예를 들어 JIT가 전혀 할 수 없을 정도로 비싸다). 최악의 경우 대부분의 툴 체인은 현재 전체 프로그램 최적화를 지원하며, 이는 빌드 시간을 크게 늘리는 것으로 알려져 있습니다.
Brendan

내가 생각하지 않았던 많은 것들, 특히 전체를 컴파일하는 것과 조각을 컴파일하는 것, 그리고 테스트 스위트가이 "컴파일"시간에 포함될 수 있다는 사실을 지적했기 때문에이 대답을 받아 들였다.
Thunderforge

1
테스트 스위트뿐만 아니라 코드 커버리지 분석, 자동 패키징, 테스트 시스템에 자동 배포; 요즘에는 통합 빌드 시스템에 많은 것들이 포함되어 있습니다. 그리고 개발자 또는 QA 환경에 도달 할 때까지 보류 상태가되면 약간의 의자 마상을 할 시간이 있습니다.
corsiKa

1
훌륭한 답변은 가능한 컴파일 시간의 확산이 훨씬 클 수 있다는 것입니다. 나는 완전한 컴파일이 2 ~ 3 일이 걸릴 수있는 프로젝트를 진행했다.
Roy T.

17

결코 과거의 유물이 아닙니다. 내가 작업하는 프로젝트 중 하나는 처음부터 새로 빌드하려면 45 분이 걸립니다. 자체 코드 외에도 외부 리포지토리의 여러 대형 C 및 C ++ 라이브러리에서 소스를 가져와 빌드해야합니다. C 및 C ++ 코드를 컴파일하고 연결하는 것은 계산 비용이 많이 듭니다. 알다시피, 파이썬은 일반적으로 해석 언어로 구현되며 Java는 일반적으로 JIT (Just in Time) 컴파일러를 사용하므로 프로젝트에서 선행 컴파일을 건너 뛰고 비용을 모두 연결합니다. 지불하는 가격은 시작 시간이 길고 (파이썬의 경우) 실행 속도가 느립니다.

빌드 시간이 길어지면 Jenkins 또는 TeamCity 와 같은 지속적인 통합 시스템을 활용하는 것이 더 중요합니다 . 이를 통해 개별 개발자는 변경 사항이 빌드를 손상시키지 않는지 테스트하면서 동시에 처음부터 건물의 고통을 피할 수 있습니다.


1
javac는 " 선불 컴파일을 건너 뛰고 비용을 전혀 연결 하지 않습니다 ". 많은 최적화 비용을 건너 뛰지 만 소스를 바이트 코드로 변환하고 프로세스에서 많은 정적 검사를 수행하고 있습니다. C 컴파일러만큼 많은 링크를 수행합니다. 실제 성능 차이는 Java의 컴파일 프로세스가 작은 청크로 분할하고 동일한 파일을 수천 번 다시 처리하지 않고 전체 프로그램과 해당 종속성을 한 번에 메모리에로드 할 수 있다고 가정했던 시대에 설계되었다는 것입니다.
Peter Taylor

10

대규모 프로젝트에는 시간이 오래 걸릴 수 있습니다. 충분히 큰 프로젝트의 경우 한 시간 이상이 될 수 있습니다. 컴퓨터에있는 소스에서 컴파일해야하는 라이브러리가 몇 가지 있는데, 예를 들어 opencascade와 같습니다. 처음부터 다시 빌드해야하는 경우 Linux 커널 자체도 꽤 오랜 시간이 걸립니다.

그러나 훨씬 더 오래 걸릴 수있는 다른 컴파일과 유사한 프로세스가 있습니다. 디지털 회로 설계 (ASIC 또는 FPGA 용)에는 장소 및 경로 단계가 필요합니다. 위치 및 경로 단계는 개별 논리 게이트, 플립 플롭, 레지스터, RAM 및 기타 구성 요소의 배치가 상호 연결 배선을위한 라우팅과 함께 결정되는 위치입니다. 이 소프트웨어는 타이밍 모델을 사용하여 가능한 배치에 대한 게이트 및 라우팅 지연을 결정하고이를 타이밍 제약 조건이 제공하는 한계와 비교 한 다음 배치 위치 및 와이어 경로를 조정하여 타이밍 요구 사항을 충족시킵니다. 때로는 소프트웨어가 타이밍을 맞추기 위해 게이트 크기를 조정하고 버퍼를 추가해야 할 수도 있습니다. 이 단계는 매우 계산 집약적이며 완료하는 데 몇 시간 또는 며칠이 걸릴 수 있습니다. 또한 실제로 병렬화가 잘되지 않습니다. 1 년 전쯤에 작업하고 있던 FPGA 설계가 있었는데 Virtex 6 HXT 565 FPGA의 약 절반 (565k LUT 중 ~ 300k)을 소비하고 장소와 경로를 완료하는 데 약 7 시간이 걸렸습니다. 코어 i7 CPU 디자인과 같은 제품을 실행하고 라우팅하는 데 시간이 얼마나 걸릴지 상상할 수 없습니다.


4

다른 답변은 이미 그렇습니다. 큰 프로젝트의 코드는 500k 이상을 의미하며 특히 처음부터 빌드 할 때 상당한 시간이 걸릴 수 있다고 언급했습니다.

추가적인 목표는 여러 프로젝트가 여러 대상 환경에 맞게 구축되어야한다는 것입니다. 해당 환경을 호스팅하는 머신을 사용할 수없는 경우 빌드 한 머신에서 직렬로 교차 컴파일하여 빌드를 수행해야합니다. 이는 상당한 빌드 시간으로 이어질 수 있습니다 . 내가 작업 한 한 프로젝트의 야간 빌드에는 10 시간이 걸렸습니다. 당신이 그것을 부러 뜨린 사람이라고 화가 생각합니다!

나는 당신이 시간 낭비에 대한 그런 변명으로 도망 치지 않을 것이라고 덧붙입니다. 전문가 는 그러한시기에 유용한 을 할 있도록 업무를 계획해야합니다 .


3

둘 다 조금 C ++ (및 C는 덜)은 느린 컴파일 시간, 특히 기간 하드웨어에서 악명 높았습니다. 밀레니엄 시대가되었을 무렵, 나는 매크로 셰 나니 건으로 인해 약 4 시간이 걸리는 프로젝트를 진행했습니다.

요즘에는 상황이 더 좋지만 30 초는 경험상 상당히 낮습니다. 특히 소스 제어, 단위 테스트 실행, 설치 프로그램 빌드 및 모든 곳에서 SAN으로 전송 된 모든 항목을 체크 아웃해야하는 공식 빌드에서 특히 그렇습니다.


2

프로젝트와 컴파일 환경에 따라 다릅니다. 나는 컴파일하는 데 몇 분이 걸리는 C ++ 프로젝트 (MSVS에서 여러 프로젝트로 설정)를 연구했습니다.

거대한 코드 및 데이터베이스 (Proctor 및 Gamble, Google 등)가있는 대기업 또는 매우 복잡한 하나 또는 두 개의 기본 제품 (예 : 과학적 시뮬레이션 및 렌더링)에 중점을 둔 소규모 회사 또는 신생 회사에서 근무하는 경우, 그런 다음 큰 프로젝트가 컴파일되기를 기다리는 것은 강력한 기계에서도 기대할 수있는 현실적인 일입니다. 이는 코드 개발 및 디버그 방법과 버전 관리를 통해 변경 사항을 업데이트하고 병합하는 빈도에 영향을 줄 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.