OS X의 LLVM 대 클랑


133

OS X의 llvm, clang 및 gcc에 관한 질문이 있습니다.

llvm-gcc 4.2, llvm 2.0 및 clang의 차이점은 무엇입니까? 나는 그들이 모두 llvm을 기반으로한다는 것을 알고 있지만 어떻게 다른가?

빠른 컴파일 외에도 gcc보다 llvm의 장점은 무엇입니까?


9
llvm은 백엔드 일 뿐이며 독립형 llvm 컴파일러는 없습니다. gcc 및 clang과 같은 다른 프론트 엔드 만 있습니다.
smerlin

4
@smerlin : "llvm compiler"는 clang + llvm에 대한 Apple의 상표명입니다. developer.apple.com/technologies/tools/…
Stephen Canon

답변:


201

LLVM은 원래 "낮은 수준의 가상 머신"을 의미했지만 이제는 기존 가상 머신이 아닌 다른 머신으로 성장 했으므로 이제는 그대로 유지됩니다. 컴파일러 및 적시 컴파일러를 빌드하는 데 사용할 수있는 표준화 된 중간 표현뿐만 아니라 라이브러리 및 도구 세트입니다. 자체 중간 표현 이외의 다른 것을 컴파일 할 수 없습니다. 그렇게하려면 언어 별 프론트 엔드가 필요합니다. 사람들이 LLVM을 참조한다면 아마도 저수준 라이브러리와 도구를 의미 할 것입니다. 어떤 사람들은 Clang 또는 llvm-gcc를 "LLVM"이라고 잘못 언급하여 혼동을 일으킬 수 있습니다.

llvm-gcc는 GCC의 수정 버전으로 GCC 자체 대신 LLVM을 백엔드로 사용합니다. GCC의 새로운 플러그인 시스템을 사용하여 GCC를 방해하지 않고 동일한 작업을 수행하는 DragonEgg를 위해 더 이상 사용되지 않습니다.

Clang은 완전히 새로운 C / C ++ / Objective-C 컴파일러로, 자체 프론트 엔드와 LLVM을 백엔드로 사용합니다. 그것이 제공하는 장점은 더 나은 오류 메시지, 더 빠른 컴파일 시간 및 다른 도구가 컴파일 프로세스에 쉽게 연결되는 방법입니다 ( LLDB 디버거Clang 정적 분석기 등 ). 또한 모듈 식이므로 C, C ++ 또는 Objective-C 코드를 분석해야하는 다른 소프트웨어의 라이브러리로 사용할 수 있습니다.

이러한 각 접근 방식 (일반 GCC, GCC + LLVM 및 Clang)에는 각각의 장단점이 있습니다. 내가 본 마지막 몇 가지 벤치 마크 세트는 GCC가 대부분의 테스트 사례에서 약간 더 빠른 코드를 생성하는 것으로 나타 났지만 (LLVM은 약간의 우위를 점했지만) LLVM과 Clang은 훨씬 더 나은 컴파일 시간을 제공했습니다. GCC와 GCC / LLVM 콤보는 훨씬 더 많은 코드를 테스트하여 C의 GCC 버전에서 작동한다는 이점이 있습니다. GCC에만있는 일부 컴파일러 특정 확장이 있으며 표준에 따라 구현이 달라 지지만 코드는 특정 구현에 따라 다릅니다. 시간이 지남에 따라 개선되고 있지만 Clang에서 작동하는 것보다 GCC에서 작동하는 많은 양의 레거시 C 코드를 얻는 경우가 훨씬 많습니다.


13
clang은 코드 분석, 자동 완성, 구문 강조 표시 등과 같은 작업에 사용할 수있는 라이브러리 세트 (libclang)입니다. 이것은 IDE에 매우 유용합니다.

5
MacOS X 또는 iOS 용으로 제작할 때 Clang은 Apple이 운영 체제를 포함하여 모든 MacOS X 및 iOS 소프트웨어를 빌드하는 데 사용하는 소프트웨어이며 Clang은 노력없이 자동으로 얻는 것, 그리고 모든 사람을 고려합니다 도움을 요청하십시오. Apple은 gcc 4.2 이후의 gcc를 지원하지 않았으며 더 이상 gcc 버전을 제공하지 않습니다.
gnasher729

1
@ gnasher729 그렇습니다.이 답변은 3 년 전 Apple이 llvm-gcc와 Clang을 모두 기본 컴파일러로 사용하여 출하되었을 때 작성되었습니다. 그때 이후로 시간이 바뀌었다.
Brian Campbell

54

여기에는 두 가지가 있습니다.

LLVM은 그 위에 컴파일러를 구축하기위한 백엔드 컴파일러입니다. 대상 아키텍처에 적합한 코드의 최적화 및 생성을 처리합니다.

CLang은 C, C ++ 및 Objective C 코드를 구문 분석하고이를 LLVM에 적합한 표현으로 변환하는 프론트 엔드입니다.

llvm gcc는 gcc 4.2에 기반한 llvm 기반 C ++ 컴파일러의 초기 버전으로 CLang은 구문 분석 할 수있는 모든 것을 구문 분석 할 수 있으므로 더 이상 사용되지 않습니다.

마지막으로 CLang과 gcc의 주요 차이점은 생성 된 코드가 아니라 접근 방식에 있습니다. gcc는 단일체이지만 CLang은 라이브러리 모음으로 구축되었습니다. 이 모듈 식 설계는 예를 들어 IDE 또는 완성 도구에 대한 큰 재사용 기회를 허용합니다.

현재 gcc 4.6에서 생성 한 코드는 일반적으로 약간 빠르지 만 CLang은 그 격차를 좁히고 있습니다.


5

llvm-gcc-4.2는 GCC 프론트 엔드를 사용하여 코드를 구문 분석 한 다음 LLVM을 사용하여 컴파일 된 출력을 생성합니다.

"llvm 컴파일러 2.0"은 clang 프론트 엔드를 사용하여 코드를 구문 분석하고 LLVM을 사용하여 컴파일 된 출력을 생성합니다. "clang"은 실제로이 프론트 엔드의 이름 일 뿐이지 만 종종 컴파일러 전체의 이름으로 자주 사용됩니다.

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