[c++] C ++ 컴파일이 왜 그렇게 오래 걸릴까요?



Answers

속도 저하는 모든 컴파일러에서 반드시 동일하지는 않습니다.

나는 델파이 나 Kylix를 사용하지 않았지만 MS-DOS 시대에 Turbo Pascal 프로그램은 거의 즉각적으로 컴파일 될 것이지만 동등한 Turbo C ++ 프로그램은 그냥 크롤링 할 것입니다.

가장 큰 차이점은 단일 모듈 컴파일을 허용하는 매우 강력한 모듈 시스템과 구문이었습니다.

컴파일 속도가 C ++ 컴파일러 개발자에게는 우선 순위가 아니었을 수도 있지만 C / C ++ 구문에는 처리가 더 어려워지는 몇 가지 고유 한 문제가 있습니다. (저는 C에 대한 전문가는 아니지만 Walter Bright는 다양한 상용 C / C ++ 컴파일러를 작성한 후 D 언어를 만들었습니다. 그의 변화 중 하나 는 언어를 구문 분석하기 쉽도록 문맥 자유 문법을 시행하는 것이 었습니다 .)

또한 일반적으로 Makefile이 설정되어 모든 파일이 C로 별도로 컴파일되므로 10 개의 소스 파일이 모두 동일한 포함 파일을 사용하면 포함 파일은 10 번 처리됩니다.

Question

C ++ 파일을 컴파일하는 것은 C # 및 Java와 비교할 때 매우 오랜 시간이 걸립니다. 일반적인 크기의 Python 스크립트를 실행하는 것보다 C ++ 파일을 컴파일하는 데 훨씬 오래 걸립니다. 현재 VC ++를 사용하고 있지만 모든 컴파일러와 동일합니다. 왜 이런거야?

내가 생각할 수있는 두 가지 이유는 헤더 파일을로드하고 전 처리기를 실행하는 것이었지만 그렇게 오래 걸리는 이유를 설명하는 것처럼 보이지는 않습니다.




이미 주석을 달았으므로, 컴파일러는 템플릿을 다시 인스턴스화하고 인스턴스화하는 데 많은 시간을 소비합니다. 그러한 특정 항목에 초점을 맞춘 프로젝트가 있으며, 실제로 매우 유리한 경우에는 관찰 가능한 30 배의 속도 향상을 주장합니다. http://www.zapcc.com을 참조 하십시오 .




당신이 얻고있는 트레이드 오프는 프로그램이 조금 더 빠르게 실행된다는 것입니다. 이는 개발 과정에서 차가운 안락함이 될 수 있지만 일단 개발이 완료되면 큰 문제가 될 수 있으며 프로그램은 사용자에 의해 실행되고 있습니다.




C ++는 기계어 코드로 컴파일됩니다. 따라서 전처리 기, 컴파일러, 최적화 기 및 마침내 어셈블러가 있으며 모두 실행해야합니다.

Java 및 C #은 바이트 코드 / IL로 컴파일되고 Java 가상 시스템 / .NET Framework는 실행 전에 실행되거나 컴퓨터 코드로 컴파일됩니다.

파이썬은 해석 된 언어로 바이트 코드로 컴파일됩니다.

이것에 대한 다른 이유가있을 것이라고 확신하지만, 일반적으로 원시 기계 언어로 컴파일 할 필요가 없으므로 시간이 절약됩니다.




대부분의 대답은 C #이 컴파일 타임에 한 번만 수행되는 작업 수행 비용으로 인해 C #이 항상 느리게 실행된다는 언급이 약간 명확하지 않지만이 성능 비용은 런타임 종속성으로 인해 영향을받습니다. ) C # 프로그램은 항상 더 높은 메모리 사용 공간을 가지며 성능이 사용 가능한 하드웨어의 기능과 더 밀접한 관련이 있음을 알 수 있습니다. VM에서 해석되거나 의존하는 다른 언어에서도 마찬가지입니다.




컴파일 된 언어는 항상 해석 된 언어보다 더 큰 초기 오버 헤드를 요구합니다. 또한 C ++ 코드를 구조화하지 않았을 수도 있습니다. 예 :

#include "BigClass.h"

class SmallClass
{
   BigClass m_bigClass;
}

다음보다 훨씬 느리게 컴파일합니다.

class BigClass;

class SmallClass
{
   BigClass* m_bigClass;
}



가장 큰 문제는 다음과 같습니다.

1) 무한 헤더 재분석. 이미 언급했다. 보통 (# pragma once와 같은) 완화 방법은 일반적으로 빌드 단위가 아닌 컴파일 단위에서만 작동합니다.

2) toolchain은 종종 각 호출마다 모든 상태를 다시 초기화하고 다시로드해야하는 여러 바이너리 (극단적 인 경우 make, 전처리 기, 컴파일러, 어셈블러, 아카이버, impdef, 링커 및 dlltool)로 분리된다는 사실 컴파일러, 어셈블러) 또는 모든 파일 (아카이버, 링커 및 dlltool)의 모든 커플.

comp.compilers에 대한이 토론을 참조하십시오 : http://compilers.iecc.com/comparch/article/03-11-078 특별히이 하나 :

http://compilers.iecc.com/comparch/article/02-07-128

comp.compilers의 중재자 인 John이 동의하는 것으로 보이며, 이는 toolchain을 완전히 통합하고 미리 컴파일 된 헤더를 구현하는 경우에도 C와 비슷한 속도를 얻을 수 있어야한다는 것을 의미합니다. 많은 상용 C 컴파일러가 어느 정도 이것을 수행합니다.

별도의 바이너리로 모든 것을 분해하는 Unix 모델은 느린 프로세스 생성과 함께 Windows에 대한 최악의 모델의 일종입니다. Windows와 * nix 사이의 GCC 빌드 시간을 비교할 때, 특히 make / configure 시스템이 단지 정보를 얻기 위해 일부 프로그램을 호출하는 경우에 특히 눈에.니다.




Related