clang 예제

먼저 코드를 받고, 코드를 빌드하고, 재생합니다. 이것은 당신에게 우리가 오늘 할 수있는 일의 종류를 보여주고 당신이 “Clang 경험”을 직접 할 수 있습니다 : 잘하면 그것은 당신과 함께 “공명”것입니다. :) 대부분의 경우 Clang은 Preprocessor(모든 매크로 확장)를 실행하고 소스 코드를 AST(추상 구문 트리)로 구문 분석합니다. 전처리된 AST는 소스 수준 C 코드보다 훨씬 쉽게 작업할 수 있지만 언제든지 원래 코드를 쉽게 참조할 수 있습니다. 실제로 코드를 나타내는 데 사용되는 Clang의 모든 데이터 구조(AST, CFG 등)는 항상 원래 소스와 다시 관련될 수 있으며, 이는 많은 분석 목적(리팩터링 등)에 매우 유용합니다. AST의 대부분의 클래스는 ForStmt, IfStmt 및 ReturnStmt와 같이 매우 자명합니다. 당신은 몇 분 동안 그것으로 재생 한 후 AST의 묘리를 얻을 수 있습니다. 일반적으로 “Clang FunctionDecl”과 같은 검색을 통해 클래스에 대한 설명서를 찾을 수 있습니다. .c 파일에서 모듈로의 보다 효율적인 경로가 있습니다. Clang 소스 코드에서 Clang 인터프리터를 구현하는 예제/clang-인터프리터/main.cpp에서 보여 주며, Clang API를 사용하여 C 인터프리터를 구현하는 예제입니다. C 인터프리터 예제에서는 이전 예제와 같이 Clang의 “드라이버” 클래스를 사용하는 대신 “프런트 엔드” 클래스를 사용합니다. 이것이 아래 예제(compile_to_module.cpp)에서 수행할 것입니다.

드라이버는 코드를 컴파일하거나 연결하는 작업을 수행하는 방법을 알지 못합니다. 그것은 프로젝트 관리자의 더 많은. 어떤 작업을 수행해야 하는지 알아내고 Clang의 다른 부분또는 ld와 같은 다른 도구를 알려줍니다. 작업 목록은 컴파일 개체에 캡슐화되어 있습니다. 컴파일을 구성한 다음 실행해야 합니다: 일반적으로 Clang AST는 매우 유연한 두 클래스인 Decl 및 Stmt로 구성됩니다. 각 하위 클래스는 여러 개 있습니다. 다음은 몇 가지 예입니다: 코드는 플러그인 자체이며 각 소스 파일에 대한 완전히 새로운 인스턴스로 실행되므로 다른 소스 파일에 걸쳐 전역 정보 나 기타 컨텍스트 정보를 유지할 수 없습니다 (그러나 여전히 여러 파일에서 실행할 수 있습니다. 순차적으로)을 제공합니다.

플러그인은 명령줄 인수를 통해 빌드 시스템 (Clang, Make 등)에 몇 가지 옵션을 전달하여 실행됩니다. GCC에서 최적화를 활성화하는 것과 거의 같습니다(예: “-O1″). 원본 파일을 분석하기 전이나 후에는 사용자 지정 작업을 실행할 수 없습니다. 이제 기본 사항에 대해 조금 알고 있으므로 시작해 보겠습니다! 참고로, 이러한 지침은 리눅스의 모든 버전에서 작동 (그리고 아마 맥 OS X) 하지만 우분투에서 테스트 되었다. 다음 단계(Clang의 공식 설치 지침에서 가져온 것)를 수행하면 LLVM과 Clang을 쉽게 얻을 수 있습니다. 해당 사이트에 명시된 모든 것 외에도 아래의 여러 Clang 인터페이스 간의 다른 중요한 차이점을 강조했습니다.