답변:
gcc는 매우 성숙하고 설치하기 쉬우 며 (적어도 대부분의 시스템에서) 많은 시스템의 기본 컴파일러이므로 많은 경우 사람들은 거의 인식하지 못하고 설치합니다. 이 제품은 열악한 아키텍처로 포팅되었으므로, 모호한 하드웨어를 대상으로해야하는 경우 즉시 사용할 수 있습니다.
clang은 훨씬 더 최신입니다. 특히 C ++ 템플릿의 경우 훨씬 더 나은 오류 메시지를 생성합니다. 많은 경우에 훨씬 빨리 실행됩니다. 기본적으로 라이브러리 세트로 빌드되므로 동일한 프론트 엔드를 사용하고 동일한 입력을 이해하는 등의 다른 프로젝트 (예 : 코드 분석기)가 많이 있습니다. 백엔드로 llvm을 사용하면 유연성이 향상됩니다. 코드를 생성하는 방법.
Clang은 훨씬 더 나은 오류보고 기능을 제공합니다. 예를 들어, 호출 한 함수 이름으로 오타를하면 Clang은 오타 일 가능성이 있다고보고하고 (올바른 이름을 제안) GCC는 알 수없는 함수 이름에 대해 불평합니다.
x86 / x86-64를 대상으로하는 경우 GCC는 일반적으로 더 빠른 코드를 생성합니다. ARM의 경우 상황이 모호하므로 종종 Clang이 더 잘 최적화됩니다. 또한 AFAIK Clang은 코드 크기 최적화를 지원하지 않습니다.
GCC는 많은 휴리스틱을 사용합니다. 이는 일반적인 경우에는 성능에는 좋지만 일부 소스 수준 최적화 (예 : 루프 언 롤링)를 수행하려는 경우에는 끔찍합니다. 작은 소스 코드 변경만으로도 GCC가 완전히 다른 출력을 생성 할 수 있습니다. Clang은 더 예측 가능하며 일반적으로 원하는 코드를 생성합니다.
Jerry Coffin과 달리 Clang보다 훨씬 어려운 소스에서 GCC를 빌드하는 것을 발견했습니다. Clang의 시작하기 페이지 의 절차는 항상 저에게 효과적 이었습니다. GCC에 대한 비슷한 매뉴얼 은 첫 시도에서 결코 작동하지 않았습니다. GCC는 특정 버전의 GMP, MPFR, MPC, Parma Polyhedra Library 및 CLooG에 종속되어 있으며 특정 GCC 릴리스에 적합한 버전을 찾기 위해 여러 번 반복해야했습니다 (예, 해당 라이브러리의 최신 버전을 사용하면 작동하지 않습니다) ).
Clang이 GCC보다 더 나은 테스트를 받고 있다는 느낌이 듭니다. GCC의 공식 릴리스 만 사용하지만 때로는 잘못된 코드가 생성되었습니다. Clang의 경우 일반적으로 트렁크 버전을 사용하지만 (빌드하기 쉽기 때문에) 잘못된 출력을 생성하는 것을 보지 못했습니다.
GCC는 Linux 세계에서 거의 표준이며 Linux 소프트웨어에서 널리 사용되는 많은 비표준 기능을 추가합니다. Clang은 GCC와 호환을 시도하지만 때로는 조용히 무시합니다. 가장 중요한 것은 Clang은 OpenMP를 지원하지 않는 것입니다. 그러나 GCC에서 지원하지 않는 확장 기능도 있지만 유용 할 수 있습니다 (예 : 추가 기능 내장 함수 __buildin_addc).
컴파일러 연구를 원하거나 어떻게 작동하는지 궁금하다면 Clang / LLVM 소스 코드를 더 쉽게 찾을 수 있습니다. Clang / LLVM 코드는 컴파일러가 읽을 수있는 것이 아니라 사람이 읽을 수있는 코드입니다.
(AINAL 면책 조항 적용) Clang / LLVM 라이센스는 상용 또는 비공개 소스 제품과 같이 코드로 수행 할 수있는 작업에 대해 더 많은 자유를 제공합니다. Clang 컴파일러 런타임 (compiler-rt 라이브러리)이 허용되는 MIT 라이센스하에있는 동안 GCC 런타임 라이브러리 라이센스에 또 다른 제한 계층이 추가됩니다.
요약 : 프로그램을 개발할 때는 Clang, 최종 빌드에는 GCC를 사용하여 컴파일하십시오 (그러나 더 빠르지 않고 깨지지 않도록하십시오). 컴파일러 연구를 수행하는 경우 Clang / LLVM을 사용하십시오.
__builtin_add
그렇지 않아야 __buildin_addc
합니다. 어쨌든, Clang은 addc
carry와 비교를 사용하여 광범위한 추가를
__builtin_addc
하지 않는다__buildin_addc