이것은 SO 질문으로 시작되었지만 웹 사이트의 실제 설명을 기반으로 매우 전통적이지 않다는 것을 깨달았습니다. 질문이 개념적 무게가 많기 때문에 programmers.se에 더 적합 할 수 있습니다.
나는 clang LibTooling을 배우고 있으며 코드의 전체 " 미묘한 "전체를 친숙한 방식으로, 즉 시맨틱 한 방식으로, 그리고 추측하지 않고 노출시킬 수있는 매우 강력한 도구 입니다. clang이 코드를 컴파일 할 수 있으면 clang은 해당 코드 내의 모든 단일 문자의 의미에 대해 확신 합니다.
이제 잠시 뒤로 물러서겠습니다.
C ++ 템플릿 메타 프로그래밍에 참여할 때 (특히 템플릿을 넘어서서 영리한 영역에도 불구하고 매크로를 영리하게 만들 때) 발생할 수있는 실질적인 문제가 많이 있습니다. 솔직히 말하면, 많은 프로그래머들에게, 템플릿을 많이 사용하는 것도 다소 무섭습니다.
좋은 예는 컴파일 타임 문자열 일 것 입니다. 이것은 1 년이 넘은 질문이지만 지금 당장 C ++이 단순한 필사자에게는 이것을 쉽게 만들지 못한다는 것이 분명합니다. 이러한 옵션을 살펴 보는 것만으로는 메스꺼움을 유발할만큼 충분하지는 않지만, 소프트웨어에 적용 할 수있는 멋진 응용 프로그램에 적합하도록 마법적이고 최대로 효율적인 기계 코드를 생성 할 수 있다는 확신이 들지 않습니다.
내 말은, 직면하자, 사람들, 문자열은 매우 간단하고 기본입니다. 우리 중 일부는 간단한 코드를 작성할 때 얻을 수있는 것보다 특정 문자열이 "베이크 인 된"기계 코드를 생성하는 편리한 방법을 원합니다. C ++ 코드에서.
clang 및 LibTooling을 입력하면 소스 코드의 추상 구문 트리 (AST)가 노출되고 간단한 사용자 정의 C ++ 애플리케이션 Rewriter
이 AST의 모든 의미에 대한 풍부한 의미 론적 객체 지향 모델과 함께 원시 소스 코드 ( ) 를 정확하고 안정적으로 조작 할 수 있습니다. 많은 것을 처리합니다. 매크로 확장에 대해 알고 체인을 따라갈 수 있습니다. 예, 소스-소스 코드 변환 또는 번역에 대해 이야기하고 있습니다.
필자의 기본 논문은 clang을 사용하여 C ++ 소프트웨어에 대한 이상적인 사용자 지정 전 처리기 단계로 작동 할 수있는 실행 파일을 만들 수 있으며 이러한 메타 프로그래밍 단계를 C ++로 구현할 수 있다는 것입니다. 이 단계는 유효한 C ++ 코드 인 입력을 가져와보다 유효한 C ++ 코드를 출력으로 생성해야한다는 사실에 의해 제약을받습니다. 또한 빌드 시스템에 적용되는 다른 제한 사항이 있습니다.
clang은 컴파일러 프론트 엔드이며 API를 사용하여 창의력을 발휘하기 때문에 입력은 적어도 유효한 C ++ 코드에 매우 가깝습니다. 사용할 새 구문을 정의 할 수있는 조항이 있는지는 잘 모르겠지만,이를 위해서는 구문을 올바르게 구문 분석하고이를 clang 프로젝트에 추가하는 방법을 개발해야합니다. 더 이상 기대하는 것은 범위를 벗어난 clang 프로젝트에 무언가를 갖는 것입니다.
문제가 아니다. 나는 어떤 no-op 매크로 함수 가이 작업을 처리 할 수 있다고 상상할 것입니다.
내가 설명하는 것을 보는 또 다른 방법은 언어 자체에서 사용할 수있는보다 제한된 도구를 사용하여 소스 코드의 AST (clang 및 API 덕분에)를 조작하는 대신 런타임 C ++을 사용하여 메타 프로그래밍 구문을 구현하는 것입니다. 이것은 명백한 컴파일 성능 이점도 가지고 있습니다 (템플릿이 많은 헤더는 사용 빈도에 비례하여 컴파일 속도가 느려집니다. 많은 컴파일 된 항목이 링커에 의해 조심스럽게 일치되어 버려집니다).
그러나 이것은 빌드 프로세스에서 추가 단계를 도입하고 비용이 다소 들며, 좀 더 장황한 소프트웨어를 작성해야 할 필요가 있습니다 (그러나 최소한 런타임 C ++입니다). .
그것은 전체 그림이 아닙니다. 핵심 언어 기능으로는 매우 어렵거나 불가능한 코드를 생성하여 얻을 수있는 훨씬 더 큰 기능 공간이 있다고 확신합니다. C ++에서는 템플릿이나 매크로 또는 둘 다의 미친 조합을 작성할 수 있지만, clang 도구 에서는 시맨틱 컨텐츠에 대한 전체 액세스 권한을 가지면서 런타임에 C ++로 달성 할 수있는 방식으로 클래스와 함수를 수정할 수 있습니다 . 템플릿 및 매크로 및 기타 모든 것 외에도 .
그래서 나는 왜 모두가 이미 이것을하지 않는지 궁금합니다. clang 의이 기능이 너무 새롭고 아무도 clang의 AST의 거대한 클래스 계층 구조에 익숙하지 않습니까? 그럴 수 없습니다.
어쩌면 나는 이것의 어려움을 약간 과소 평가하고 있지만, clang 도구로 "컴파일 타임 문자열 조작"을하는 것은 거의 범죄 적으로 간단합니다. 그것은 장황하지만, 엄청나게 간단합니다. 필요한 것은 실제 실제 std::string
작업에 매핑되는 무수한 매크로 기능입니다 . clang 플러그인은 관련된 모든 no-op 매크로 호출을 가져와이를 구현하고 문자열을 사용하여 작업을 수행합니다. 그런 다음이 도구는 빌드 프로세스의 일부로 삽입됩니다. 빌드하는 동안 이러한 no-op 매크로 함수 호출은 자동으로 결과로 평가 된 다음 프로그램에서 일반 오래된 컴파일 타임 문자열로 다시 삽입됩니다. 그런 다음 평소대로 프로그램을 컴파일 할 수 있습니다. 실제로이 결과 프로그램은 결과적으로 훨씬 이식성이 뛰어나므로 C ++ 11을 지원하는 멋진 새 컴파일러가 필요하지 않습니다.