C ++ Insights는 소스 간 소스 변환을 수행하는 Clang 기반 도구입니다. C ++ Insights의 목표는 정상적이고 의도적으로 무대 뒤에서 발생하는 일을 보이게하는 것입니다. 컴파일러가 우리가 일을 작동시키기 위해하는 마법에 관한 것입니다.
예를 들어이 코드를 사용하십시오.
class Base {
};
class Derived : public Base {
};
int main () {
Derived d;
Derived d2 = d;
d2 = d;
Base& b = d;
}특별한 것은 없으며 물론 컴파일됩니다. 이것은 컴파일러의 관점입니다.
class Base
{
public:
// inline constexpr Base() noexcept = default;
// inline constexpr Base(const Base &) noexcept = default;
// inline constexpr Base & operator=(const Base &) noexcept = default;
};
class Derived : public Base
{
public:
// inline constexpr Derived() noexcept = default;
// inline constexpr Derived(const Derived &) noexcept = default;
// inline constexpr Derived & operator=(const Derived &) noexcept = default;
};
int main ()
{
Derived d;
Derived d2 = Derived (d);
d2. operator =(d);
Base & b = static_cast <Base&>(d);
return 0 ;
} 모든 컴파일러 제공 특수 회원 기능과 Base 에서 Derived 으로 업 캐스트를 볼 수 있습니다.
C ++ Insights는 소스 간 소스 변환을 수행하는 Clang 기반 도구입니다. C ++ Insights의 목표는 정상적이고 의도적으로 무대 뒤에서 발생하는 일을 보이게하는 것입니다. 컴파일러가 우리가 일을 작동시키기 위해하는 마법에 관한 것입니다. 또는 컴파일러 클래스를 살펴보십시오.
2017 년에는 C ++ 11, C ++ 14 및 C ++ 17로 얻은 새로운 것들을 조사하기 시작했습니다. Lambdas, Range Based For-Loops 및 구조적 바인딩과 같은 놀라운 것들. 나는 그것을 이야기에 모았다. 슬라이드와 비디오를 온라인으로 찾을 수 있습니다.
그러나이 모든 연구와 훈련 및 교육의 일부는 컴파일러의 눈으로 볼 수 있다면 어떻게 될지에 대해 생각하게되었습니다. 물론, 적어도 Clang에게는 AST 덤프가 있습니다. 컴파일러 탐색기와 같은 도구를 사용하여 컴파일러가 C ++ 소스 스 니펫에서 생성하는 코드를 볼 수 있습니다. 그러나 우리가 보는 것은 어셈블러입니다. AST 나 컴파일러 탐색기 출력은 코드를 작성하는 언어로되어 있지 않습니다. 따라서이 출력에 익숙하지 않습니다. 또한, 학생들에게 C ++를 가르 칠 때, AST를 보여주고 그것이 나에게 만족스럽지 않다고 설명했습니다.
범위 기반의 For-Loop을 컴파일러 내부 버전으로 변환 할 수있는 Clang 기반 도구를 작성하기 시작했습니다. 그런 다음 구조화 된 바인딩과 람다에 대해서도 똑같이했습니다. 결국, 나는 처음에 계획 한 것보다 훨씬 더 많은 일을했습니다. 운영자가 호출되는 위치와 컴파일러가 일부 캐스팅을하는 장소를 보여줍니다. C ++ Insights는 auto 또는 decltype 의 유형을 추론 할 수 있습니다. 목표는 편집 가능한 코드를 생성하는 것입니다. 그러나 이것은 모든 장소에서 불가능합니다.
예를 들어 람다, 레인지 기반 For-Loop 또는 Auto의 변환을 볼 수 있습니다. 물론 다른 C ++ 스 니펫을 변환 할 수 있습니다.
자신을 만나십시오. C ++ Insights는 온라인으로 제공됩니다 : cppinsights.io.
그래도 할 일이 있습니다.
나는 모든 것을 올바르게 얻는다고 주장하지 않습니다. 또한 현재 C ++ 20과 같은 새로운 표준의 기능을 지원하기 위해 노력하고 있습니다. C ++ 통찰력은 Clang과 AST에 대한 이해를 기반으로합니다.
C ++ 통찰력을 발표 한 이후 C ++ 통찰력에 대해 몇 가지 이야기를했습니다. 예를 들어, 지금 C ++에서. 슬라이드와 비디오는 다음과 같습니다.
C ++ 통찰력은 Clang 소스 트리 내부 또는 외부에서 구축 할 수 있습니다.
readme_windows.md를 참조하십시오
extra/clang 으로 빌드하려면 다음 추가 플래그를 사용하십시오. -DINSIGHTS_USE_SYSTEM_INCLUDES=off -DCLANG_LINK_CLANG_DYLIB=on -DLLVM_LINK_LLVM_DYLIB=on
INSIGHTS_USE_SYSTEM_INCLUDES 끄는 이유에 대한 설명은 #186을 참조하십시오.
extra/clang 및 extra/llvm /usr/lib/{libclangAST.so,libLLVM*.a,libLLVM.so} 를 제공합니다. libclangAST.so so는 libLLVM.so 가 필요하며 libLLVM*.a ( libLLVM.so 대신)가 연결되면 충돌이있을 것입니다. https://bugs.archlinux.org/task/60512를 참조하십시오
검색 경로에 Clang 설치가 필요합니다.
git clone https://github.com/andreasfertig/cppinsights.git
mkdir build && cd build
cmake -G"Ninja" ../cppinsights
ninja
결과 바이너리 (통찰력)는 build 폴더에서 찾을 수 있습니다.
Clang 소스 트리 내부에서 C ++ 통찰력을 구축하는 가장 쉬운 방법은 LLVM_EXTERNAL_PROJECTS 옵션을 사용하는 것입니다.
git clone https://github.com/llvm/llvm-project.git
git clone https://github.com/andreasfertig/cppinsights.git
mkdir build
cd build
cmake -G Ninja -D=CMAKE_BUILD_TYPE=Release -DLLVM_EXTERNAL_PROJECTS=cppinsights -DLLVM_EXTERNAL_CPPINSIGHTS_SOURCE_DIR=<PATH/TO/cppinsights> [INSIGHTS CMAKE OPTIONS] ../llvm-project/llvm
ninja
CMAKE를 사용하여 활성화 할 수있는 몇 가지 옵션이 있습니다.
| 옵션 | 설명 | 기본 |
|---|---|---|
| Insights_strip | 빌드 후 통찰력을 벗기십시오 | 에 |
| Insights_static | 정적 연결을 사용하십시오 | 끄다 |
| Insights_coverage | 코드 적용 범위를 활성화합니다 | 끄다 |
| Insights_use_libcpp | 테스트에는 libc ++를 사용하십시오 | 끄다 |
| 디버그 | 디버그 활성화 | 끄다 |
구성 중에 아키텍처를 공급하는 것이 가장 좋습니다.
cmake -DCMAKE_OSX_ARCHITECTURES=arm64 ../cppinsights
git clone https://github.com/andreasfertig/cppinsights.git
mkdir build_eclipse
cd build_eclipse
cmake -G"Eclipse CDT4 - Unix Makefiles" ../cppinsights/
그런 다음 Cevelop import-> General-> 기존 프로젝트를 작업 공간으로 향합니다. build_eclipse 선택하십시오. Cevelop으로 편집을 즐기십시오.
C ++ 통찰력 사용은 매우 간단합니다.
insights <YOUR_CPP_FILE> -- -std=c++17
시스템이 포함 된 경로와 관련하여 상황이 복잡해집니다. 이 경로는 바이너리에서 하드 코딩되어 있으며, 컴파일러 C ++ 통찰력에서 나온 것으로 보입니다. 이를 돕기 위해 스크립트/getInclude.py를 확인하십시오. 스크립트는 컴파일러에서 시스템을 포함한 경로를 수집하려고합니다. 옵션이 없으면 getinclude.py g++ 사용합니다. 다른 컴파일러를 첫 번째 인수로 전달할 수도 있습니다.
예는 다음과 같습니다.
./scripts/getinclude.py
-isystem/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1 -isystem/usr/local/include -isystem/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/7.3.0/include -isystem/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include -isystem/usr/include
스크립트는 C ++ 통찰력과 함께 사용할 수 있습니다.
insights <YOUR_CPP_FILE> -- -std=c++17 `./scripts/getinclude.py`
GCC 컴파일러 (예 : GCC-11.2.0)의 사용자 정의 빌드가있는 경우 기본 시스템 경로의 컴파일러에 설치 되지 않은 경우 Clang은 올바른 libstdc++ 경로 (GCC의 STL)를 찾지 못합니다. 이 상황에 빠지면 " --gcc-toolchain=/path/GCC-1x.xx/installed/path "를 사용할 수 있습니다.
./cppinsights Insights.cpp -- --gcc-toolchain=${GCC_11_2_0_INSTALL_PATH} -std=c++20
여기 " ${GCC_11_2_0_INSTALL_PATH} "는 사용자 정의 구축 GCC의 설치 디렉토리입니다. Clang의 옵션은 여기에 설명되어 있습니다.
최신 C ++ Insights 버전이있는 Docker 컨테이너를 설정하는 또 다른 Github 프로젝트도 있습니다. C ++ Insights -Docker
VIM 용 플러그인은 여기에서 제공됩니다.
Neovim 용 플러그인은 여기에서 제공됩니다.
Visual Studio Code의 확장은 VS Code Marketplace : C ++ Insights -VSCODE Extension에서 제공됩니다.
적어도 MACOS의 경우이 포름 덕분에 Homebrew를 통해 C ++ 통찰력을 설치할 수 있습니다.
brew install cppinsights
나는 리포지토리가 최신 버전의 Clang 및 적어도 이전 버전을 컴파일하는 것을 목표로합니다. 웹 사이트는 최신 Clang 릴리스에 가까워 지려고합니다. 그러나 특정 문제 (Windows 용 Clang 구축)로 인해 웹 사이트 버전은 종종 몇 개월까지 지연됩니다.
매달 새 비디오를 출시하는 YouTube 채널을 만들었습니다. 이 비디오에서는 C ++ 통찰력을 사용하여 특정 C ++ 구성을 보여주고 설명하며 때로는 C ++ 통찰력도 설명합니다.
TODO를 참조하십시오.
프로젝트를 지원하려면 패치 제출을 고려하십시오. 또 다른 대안은 Github 스폰서 또는 Patreon 지지자가되는 것입니다.