오늘, 당신이 될 겠다는 C 컴파일러를 필요로 최적화 컴파일러 , 특히 C 하드웨어에 가까운 언어가 더 이상이기 때문에 현재 때문에 프로세서 (믿을 수 없을만큼 복잡 밖으로의 순서 , 파이프 라인 , 슈퍼 스칼라 , 복합와 캐시 및 TLB , 따라서 명령 스케줄링 등 이 필요 합니다 ...). 오늘날의 x86 프로세서는 동일한 머신 코드를 실행할 수 있더라도 이전 세기의 i386 프로세서와 다릅니다. 참고 항목 C는 낮은 수준의 언어가 아닙니다 (컴퓨터가 빠른 PDP-11 아님) 데이비드 키스 넬에 의해 종이.
tinycc 또는 nwcc 와 같은 순진한 비 최적화 C 컴파일러를 사용하는 사람은 거의 없습니다 . 최적화 컴파일러가 제공 할 수있는 것보다 몇 배 느린 코드를 생성하기 때문입니다.
최적화 컴파일러를 코딩하는 것은 어렵습니다. GCC와 Clang은 모두 "원본 언어 중립적"코드 표현 (GCC의 경우 단순, Clang의 경우 LLVM)을 최적화하고 있습니다. 좋은 C 컴파일러의 복잡성은 파싱 단계에 있지 않습니다!
특히 C ++ 컴파일러를 만드는 것은 C 컴파일러를 만드는 것보다 훨씬 어렵지 않습니다 .C ++를 구문 분석하고이를 내부 코드 표현으로 변환하는 것은 복잡하지만 (C ++ 사양이 복잡하기 때문에) 이해하기 쉽지만 최적화 부분은 훨씬 더 많습니다. 복잡함 (GCC 내부 : 미들 엔드 최적화, 소스 언어 및 타겟 프로세서 중립적)은 대부분의 컴파일러를 구성하며 나머지는 여러 언어의 프런트 엔드와 여러 프로세서의 백 엔드간에 균형을 유지 합니다. 따라서 가장 최적화 된 C 컴파일러는 C ++, Fortran, D 등과 같은 다른 언어도 컴파일 할 수 있습니다. GCC의 C ++ 특정 부분은 컴파일러의 약 20 %입니다.
또한 C (또는 C ++)는 너무 널리 사용되어 사람들이 언어의 의미를 정확하게 정의하지 않는 공식 표준을 정확하게 따르지 않아도 코드를 컴파일 할 수 있기를 기대합니다 (따라서 각 컴파일러는 자체 해석을 할 수 있음) 그것의). CompCert에서 입증 한 C 컴파일러와 C의 보다 공식적인 의미론 을 다루는 Frama-C 정적 분석기 도 살펴보십시오 .
그리고 최적화는 긴 꼬리 현상입니다. 몇 가지 간단한 최적화를 구현하는 것은 쉽지만 컴파일러의 경쟁력을 높이지는 못합니다! 경쟁이 치열한 실제 컴파일러를 얻으려면 여러 가지 다양한 최적화를 구현하고이를 현명하게 구성하고 결합해야합니다. 즉, 실제 최적화 컴파일러는 복잡한 소프트웨어 여야합니다. BTW, GCC 및 Clang / LLVM에는 내부에 특수화 된 C / C ++ 코드 생성기가 여러 개 있습니다. 그리고 두 개발자 모두 대규모 개발자 커뮤니티 (수백 명, 주로 정규직 또는 최소 절반 이상)를 운영하는 거대한 짐승 (매년 수백만 개의 소스 코드, 매년 몇 퍼센트 씩 성장률)입니다.
이 없음을 알 수 없는 경우에도, 멀티 스레드 C 컴파일러 (내 지식의 최선을) 일부 (..., 명령 스케줄링 할당을 등록, 예를 들어 내부 절차 최적화) 컴파일러의 일부를 병렬로 실행할 수 있습니다. 그리고 병렬 빌드 make -j
는 항상 충분하지는 않습니다 (특히 LTO 사용 ).
또한 C 컴파일러를 처음부터 코딩하는 데 어려움을 겪기 어렵고 이러한 노력은 몇 년 동안 지속되어야합니다. 마지막으로, 대부분의 C 또는 C ++ 컴파일러는 오늘날 무료 소프트웨어 (더 이상 스타트 업이 판매하는 새로운 독점 컴파일러 시장이 아님)이거나 최소한 독점적 인 상품 ( Microsoft Visual C ++ 과 같은 )이며, 자유 소프트웨어가되는 것은 컴파일러에 거의 필요합니다 ( 그들은 많은 다른 조직의 기여가 필요하기 때문에).
C 컴파일러에서 자유 소프트웨어로 처음부터 작업 할 수있는 자금을 얻게되어 기쁩니다. 그러나 오늘날 이것이 가능하다고 믿을만큼 순진하지 않습니다!