C ++ Insightsは、ソースからソース間変換を行うClangベースのツールです。 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は、ソースからソース間変換を行うClangベースのツールです。 C ++洞察の目標は、舞台裏で意図的に起こることを目に見えるようにすることです。それは、コンパイラが物事を機能させるために行う魔法についてです。または、コンパイラのクラスを調べます。
2017年に、C ++ 11、C ++ 14、およびC ++ 17で得たいくつかの新しいものを検討し始めました。ラムダス、レンジベースのフォーループ、構造化されたバインディングなどの驚くべきもの。私はそれを講演でまとめました。オンラインでスライドとビデオを見つけることができます。
しかし、その研究と私のトレーニングと教育のいくつかは、コンパイラの目で見ることができればそれがどうなるかを考え始めるようになりました。確かに、少なくともClangの場合はASTダンプがあります。コンパイラエクスプローラーなどのツールを使用して、C ++ソーススニペットからコンパイラが生成するコードを確認できます。しかし、私たちが見ているのはアセンブラーです。 ASTもコンパイラエクスプローラー出力も、コードを書く言語にはありません。したがって、私はこの出力にあまり精通していません。さらに、学生にC ++を教え、ASTを示し、それが私にとってあまり満足していないことを説明するとき。
私は、レンジベースのフォーループをコンパイラインターナルバージョンに変換できるClangベースのツールを書き始めました。その後、構造化されたバインディングとラムダスについても同じことをしました。最終的に、私は最初に計画した以上のことをしました。オペレーターが呼び出された場所と、コンパイラがいくつかのキャストを行う場所を示しています。 C ++ Insightsは、 autoまたはdecltype背後にあるタイプを推定できます。目標は、複雑なコードを作成することです。ただし、これはすべての場所で不可能です。
たとえば、ラムダ、レンジベースのフォーループ、または自動の変換を見ることができます。もちろん、他のC ++スニペットを変換できます。
自分を見てください。 C ++ Insightsはオンラインで入手できます:cppinsights.io。
それでも、やるべきことがあります。
私はすべてのことを正しくすると主張していません。また、現時点では、C ++ 20のような新しい標準からの機能のサポートに取り組んでいます。 C ++の洞察は、ClangとそのASTの理解に基づいていることを忘れないでください。
C ++ Insightsをリリースして以来、C ++ Insightsについていくつかの講演を行いました。たとえば、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を参照してください
検索パスに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/
次に、inevelop 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-11.2.0などのGCCコンパイラのカスタムビルドがあり、デフォルトのシステムパスのコンパイラにインストールされていない場合、構築後、Clangは正しいlibstdc++パス(GCCのSTL)を見つけられません。この状況に遭遇した場合、 " --gcc-toolchain=/path/GCC-1x.xx/installed/path "を使用して、clang/c ++洞察を伝えます。
./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コードの拡張機能は、VSコードマーケットプレイス:C ++ Insights -VSCODE拡張機能で入手できます。
少なくともMacOSの場合、このフォーミュラーのおかげで、HomeBrewを介してC ++洞察をインストールできます。
brew install cppinsights
私は、リポジトリがClangの最新バージョンと少なくとも以前のものをコンパイルすることを目指しています。このウェブサイトは、Clangの最新リリースの近くにとどめようとしています。ただし、特定の問題(Windows用のClangの構築)により、Webサイトのバージョンは数か月遅れていることがよくあります。
毎月新しいビデオをリリースするYouTubeチャンネルを作成しました。これらのビデオでは、C ++ Insightsを使用して特定のC ++コンストラクトを表示および説明します。C++洞察も説明します。
Todoを参照してください。
プロジェクトをサポートしたい場合は、パッチの送信を検討してください。もう1つの選択肢は、GitHubスポンサーまたはPatreonサポーターになることです。