C ++ Insights是一種基於叮噹的工具,可進行源代碼轉換。 C ++見解的目標是使通常且故意發生在幕後的事情可見。這是關於編譯器為我們使事情起作用的魔術。
以此代碼為例:
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 ;
}您可以看到所有編譯器提供的特殊會員功能以及從Derived到Base的升級。
C ++ Insights是一種基於叮噹的工具,可進行源代碼轉換。 C ++見解的目標是使通常且故意發生在幕後的事情可見。這是關於編譯器為我們使事情起作用的魔術。或查看編譯器的類別。
在2017年,我開始研究C ++ 11,C ++ 14和C ++ 17獲得的一些新事物。諸如Lambdas,基於範圍的陸面和結構化綁定之類的令人驚奇的事情。我把它放在一起。您可以在線找到幻燈片和視頻。
但是,所有的研究以及我的一些培訓和教學都使我開始思考如果我們可以用編譯器的眼光看待情況。當然,至少有一個AST垃圾場。我們可以看到編譯器從C ++源代碼段生成的代碼,並使用編譯器Explorer等工具。但是,我們看到的是彙編器。 AST和編譯器Explorer輸出都不是我編寫代碼的語言。因此,我對此輸出不太熟悉。另外,當教學生C ++時,展示了AST並解釋說這對我來說並不令人滿意。
我開始編寫一個基於clang的工具,該工具可以將基於範圍的FOROP轉換為編譯器內部版本。然後,我對結構化綁定和lambdas做了同樣的事情。最後,我做的比最初計劃的要多得多。它顯示了調用操作員的位置以及編譯器在其中進行一些鑄造的地方。 C ++洞察力可以推斷auto或decltype背後的類型。目標是生成可編譯的代碼。但是,這在所有地方都是不可能的。
您可以看到,例如,lambda,基於範圍的for-loop或自動的轉換。當然,您可以改變任何其他C ++片段。
看到自己。 C ++洞察力可在線獲得: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需要libLLVM.so ,如果鏈接libLLVM*.a (而不是libLLVM.so ),將會發生衝突。請參閱https://bugs.archlinux.org/task/60512
您需要在搜索路徑中安裝叮噹聲。
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/
然後,在CE開發中 - >一般 - >現有項目中的工作空間。選擇build_eclipse 。享受與CE開發的編輯。
使用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 ”來告訴clang/c ++見解stl:
./cppinsights Insights.cpp -- --gcc-toolchain=${GCC_11_2_0_INSTALL_PATH} -std=c++20
這裡“ ${GCC_11_2_0_INSTALL_PATH} ”是您自定義構建的GCC的安裝目錄。此處描述了Clang的選項。
還有另一個GitHub項目,該項目設置了一個具有最新C ++ Insights版本的Docker容器:C ++ Insights -Docker
這裡有一個用於VIM的插件。
Neovim的插件可在此處找到。
Vis Code Marketplace可以找到視覺工作室代碼的擴展名:C ++ Insights -VSCODE擴展。
至少對於MacOS,您可以通過Homebrews安裝C ++洞察力,這要歸功於此格式:
brew install cppinsights
我的目標是將存儲庫與最新版本的clang編譯,至少是以前的版本。該網站試圖保持最新版本的Clang。但是,由於某些問題(為Windows建立叮噹聲),該網站的版本通常會延遲幾個月。
我創建了一個YouTube頻道,每個月都會發布一個新視頻。在這些視頻中,我使用C ++見解來顯示和解釋某些C ++結構,有時我也解釋了C ++的見解。
見托多。
如果您想支持該項目,請考慮提交補丁。另一種選擇是成為GitHub贊助商或Patreon支持者。