클랑이 더 많이 사용되지 않는 이유는 무엇입니까?
이전에 C/C++에서 상당한 양의 프로그래밍을 해봤지만, 요즘은 제가 하는 프로그래밍의 작은 부분만 차지합니다(스크립트 언어가 제가 하는 많은 일에 훨씬 더 적합합니다).저는 지난 며칠 동안 몇몇 C 프로그래밍 프로젝트를 작업했는데, 제가 계속 잊어버린 작은 구문 세부 사항들에 놀랐습니다.은 그 입니다.cc
/gcc
일반적으로 이러한 문제에 대한 암호화된 오류 메시지 또는 비정보적 오류 메시지가 있었습니다(구체적인 예는 기억할 수 없습니다).
나는 그것에 대해 배웠습니다.clang
얼마전에 컴파일러가 그것을 시도해보기로 결정했습니다.오류 메시지는 훨씬 더 명확했고 구문의 문제를 파악하고 수정하는 데 도움이 되었습니다.제 질문은 왜 이 도구가 현재보다 더 많이 사용/언급되지 않는가 하는 것입니다.평소 용의자들과 비교했을 때 그렇게 새롭다는 것인가요 (cc
/gcc
또는 지원하는 기능을 지원하지 않는 것입니까, 아니면 더 얻기 어려운 것입니까?iMac에 dev 도구를 설치하고 명령 하나가 필요했기 때문에 그 마지막 것을 믿기 어렵습니다 (sudo apt-get install clang
Ubuntu 상자에 설치합니다.
제 질문은 왜 이 도구가 현재보다 더 많이 사용/언급되지 않는가 하는 것입니다.
그것은 아마도 역사 때문일 것이고, 우리 인간들이 일반적으로 어떻게 행동하는지 때문일 것입니다.
전통적으로 gcc는 적어도 모든 무료 *nix 클론에서 C 프로그램을 컴파일하는 데 실질적으로 사용할 수 있는 유일한 실제(무료) 컴파일러였습니다.이것은 사실상 리눅스의 모든 기본 시스템과 커널, *BSD, 이제 아마도 OSX 등으로 컴파일되는 것입니다.
결점이 여기저기 있지만, 기본적으로 이것은 gcc가 작동한다는 것을 의미합니다.그리고 고장이 나지 않았다면 고치지 마세요.이 중에서, 당신은 이제 거대한 사용자 기반을 갖게 되었고, gcc에 대한 도움을 쉽게 받을 수 있고, gcc를 사용해본 사람들이 많고, gcc 자체를 작업하고 있습니다.
일반적으로, 거대한 커뮤니티를 그들이 익숙한 것에서 다른 것으로 바꾸고 싶다면, "다른 것"이 *상당히" 더 좋아야 합니다.단지 "더 나은" 것은 종종 충분한 이유가 되지 못합니다.사회 여러 분야에서 이런 사례를 찾아볼 수 있을 것 같습니다.
clang은 더 새롭고, 어떤 사람들은 그것이 그 일에 적합한지, 버그가 있는지, 더 느린 코드를 생성하는지 등을 의심할 것입니다. - 의심하는 것은 인간의 본성인 것 같습니다. - 새로운 것들은 무섭습니다.많은 사람들은 클랑에 대해 알지도 못하고, 많은 사람들은 GCC에 만족하기 때문에 신경 쓰지 않습니다.
하지만, 만약 당신이 clang을 사용하고 싶다면, 해보세요. 오류 메시지는 gcc에 비해 확실히 "더 나은" 것이고 이해하기 쉽습니다.
클랑 프론트 엔드는 비교적 새것입니다.예를 들어 2010년 10월 2.8 릴리스는 C++ 98/03 지원을 완료했음을 나타냅니다.
성숙도가 높아지면서 채택이 늘어날 것으로 보입니다.예를 들어, FreeBSD OS(및 다른 BSD OS)를 클랑(clang)으로 구축하여 GCC/G++에 대한 의존성을 제거하는 작업이 진행 중입니다.
애플은 LLVM/클랑 조합을 추진하고 있습니다.기존 GCC 툴체인 지사(4.2 기준) 지원을 중단하고 OSX/iOS 개발을 클랜 툴에만 의존하게 될 것으로 보입니다.
Clang은 C-like 언어(예: OpenCL용 셰이더 언어 컴파일러)를 위한 맞춤형 컴파일러에서도 채택이 증가하고 있습니다.
LLVM은 한동안 존재해 왔지만, 적어도 내 목에서는 최근에야 두각을 나타냈는데, 이는 애플이 최근 GCC를 자체 툴 체인에서 Clang으로 대체하기 위해 강하게 밀어붙이고 있기 때문일 수 있습니다.
또한 C++ 지원이 최근에야 생산 등급이 된 것 같습니다.편집 : 아직 그마저도 아닌 것 같습니다. (아래 댓글 참조)
또 다른 요인은 LLVM이 단일 벤더에 의해 크게 지원된다는 점일 수 있으며, 이는 애플이 아닌 개발자들이 선천적으로 불신을 가지고 있다는 점입니다.
제 질문은 왜 이 도구가 현재보다 더 많이 사용/언급되지 않는가 하는 것입니다.보통의 용의자들과 비교했을 때 새롭다는 건가요?
이것이 바로 그 이유입니다.그것은 여전히 새로운 것이고 핵심 기능은 여전히 활발하게 개발되고 있습니다.기존 프로젝트는 컴파일러 고유의 기능을 사용하거나 라이브러리를 사용할 수 있으며, 개발자들은 새로운 툴이 매일 점점 더 개선되고 있음에도 불구하고, 어떠한 경우에도 예기치 않은 버그가 있거나 성능/크기/등이 알려지지 않은 실험용 툴을 변경하는 것을 꺼립니다.
학생 프로그래머로서 저는 그것이 주로 도움이 되고 이해할 수 있는 오류 메시지 때문에 완전한 신의 선물이라고 생각합니다.저는 주로 C에서 프로그래밍을 위해 사용하지만, C++에서도 Clang을 사용하여 분기하기 시작했습니다.
왜 더 언급이 안 되는지에 대해서는 GCC가 설립된 지 오래된 것이 아닌가 하는 생각이 듭니다. 대부분의 사용자들에게는 컴파일러입니다.GCC는 학생들이 상당히 불쾌해하는 극도로 난해한 오류 메시지를 제외하고는 잘 작동합니다.
전반적으로 학생과 개발자 모두에게 Clang을 사용할 것을 강력히 추천합니다.애플과 Xcode의 공식 컴파일러가 되었기 때문에 사용법과 이름 인식이 빠르게 회복될 것이라고 생각합니다.FreeBSD도 메인 컴파일러로 채택한 것으로 보이는데 애플이 채택한 것보다는 인기에 덜 영향을 미칠 것으로 생각됩니다.
부록:Clang과의 경쟁으로 인해 GCC 4.8과 4.9의 오류 메시지의 명확성이 크게 향상되었습니다. 그래도 Clang이 조금 더 명확하다고 생각하지만 격차는 크게 줄었습니다.
오늘날 clang은 대부분의 곳에서 gcc를 대체하고 있습니다. 즉, 대부분 *NIX와 유사한 운영 체제와 Linux 배포판입니다.일부 예로는 Clang을 기본 컴파일러로 전환한 FreeBSD, Minix 및 mac(약간 명백한) clang이 있습니다.내 친구들도 보여줬을 때.
이 IMHO는 일부 사람들이 문제가 있었던 것 같습니다. 아마도 이전 버전에서 문제가.그러나 clang 버전 3.0에서는 이런 문제가 없습니다.전에 말씀드렸듯이, 저는 모든 새로운 프로젝트에 그것을 사용하고 있습니다.거의 나의 기본 컴파일러, 가끔 나는.make C=gcc
오류/경고를 클릭하는 방법을 확인하기 위해 필요합니다.그리고 클랑윈은 영원히.더 나은 설명과 함께 최적화를 위해 많은 노력을 기울이십시오.여기에는 코드 생성에서 최상의 성능을 발휘할 수 있도록 컴파일러의 사용 확장(일부는 gccinerhid)에 대한 제안이 포함되어 있습니다.
오류 메시지를 출력하는 사소한 기능을 작성했습니다.하지만 저는 표준 출력에 오류 메시지를 출력한 후 프로그램을 종료하고 싶습니다.그래서, 간단한 수정을 하고, 그것을.exit(1)
함수의 마지막 문장입니다.다음과 같습니다.
void error(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
fprintf(stderr, "error: ");
vfprintf(stderr, fmt, ap);
va_end(ap);
exit(1);
}
그래서 클랑쇼.
warning: 함수 'error'를 'norereturn' [-Wissing-norereturn] 속성으로 선언할 수 있습니다.
(gcc는 사용하지 않아도 생산하지 않습니다.-Wall -Wextra -Wunreachable-code -O3
깃발)
"좋을 것 같네요.하지만 'nonreturn' 속성이란 무엇일까요?난 절대 이 일에 대해 듣거나 읽지 않을 겁니다.구글로 이동하여 검색합니다.clang could be declared with attribute 'noreturn'
(오, 그래, 난 그저 글을 쓸 수 있을 뿐이야)clang nonreturn attribute
하지만 잊어버리세요) 그리고 저는 이 속성이 무엇인지에 대한 좋은 설명과 제가 얻을 수 있는 성과의 가능성에 대한 연결고리를 발견했습니다.
그래서 이 속성을 함수 프로토타입에 추가하기 위해 실행합니다(물론 gcc 또는 clang 컴파일러인 경우; 매크로가 트릭 탐지를 수행합니다)아, 네, 제게는, 어떤 작은 성과도 (물론, 코드를 읽을 수 없게 만들지 않고) 그것은 승리입니다.
그리고 여기서 끝나지 마 몇 년 전에 내가 만든return
(에서와 같이) 기본 처리로 정의된 스위치인 기능에서error()
여기서 기능함).그러나 그렇다고 해도 gcc는 반환 값이 없는 기능에 대해 폐쇄합니다(죄송합니다, 오류/경고 메시지를 정확히 기억하지 못합니다). 어떻게 가능합니까? 에 더 . 하지 않으면 있으면하지 않습니다스위치 후에 더 이상의 문은 없습니다. 만약 케이스가 일치하지 않으면 기본값이 실행되고 아래 문이 있다면 별로 중요하지 않습니다.하지만 클랑은 나처럼 다르게 생각하고 이 선언에 대해 경고를 주고 더 나은 코드를 만들 수 있도록 도와줍니다.
그리고 이런 아주 작은 것에 대해서도, 저는 그 클랑을 사랑합니다. (참고:제가 영어를 잘못해서 죄송합니다.영어는 모국어는 아니지만 그래도 여기서 표현하려고 노력하고 있습니다.)
언급URL : https://stackoverflow.com/questions/4885903/why-is-clang-not-used-more
'programing' 카테고리의 다른 글
ASP를 어떻게 뿌릴 겁니까?기존 웹 사이트 프로젝트에 MVC를 넣을 수 있습니까? (0) | 2023.10.25 |
---|---|
R's magrittr의 python에서 %>%와 같은 기능 파이프 (0) | 2023.10.25 |
printf는 char 배열에서 16진수 인쇄에 'FFFFFF'를 추가합니다. (0) | 2023.10.25 |
Mariadb - 확장된 삽입 실행 시간이 점차적으로 증가하고 있습니다. (0) | 2023.10.25 |
CDN 사용 대 NPM에서 라이브러리 설치 (0) | 2023.10.25 |