C ++ Insights ist ein auf Clang-basiertes Tool, das eine Quelle zu Source-Transformation durchführt. Das Ziel von C ++ - Insights ist es, die Dinge sichtbar zu machen, die normalerweise und absichtlich hinter den Kulissen geschehen. Es geht um die Magie, die der Compiler für uns tut, damit die Dinge funktionieren.
Nehmen Sie zum Beispiel diesen Code: Zum Beispiel:
class Base {
};
class Derived : public Base {
};
int main () {
Derived d;
Derived d2 = d;
d2 = d;
Base& b = d;
}Nichts Besonderes, und natürlich kompiliert es. Dies ist die Ansicht des Compilers darauf:
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 ;
} Sie können alle mit Compiler bereitgestellten Sonderfunktionen und die upcast von Derived zu Base sehen.
C ++ Insights ist ein auf Clang-basiertes Tool, das eine Quelle zu Source-Transformation durchführt. Das Ziel von C ++ - Insights ist es, die Dinge sichtbar zu machen, die normalerweise und absichtlich hinter den Kulissen geschehen. Es geht um die Magie, die der Compiler für uns tut, damit die Dinge funktionieren. Oder durch die Klassen eines Compilers schauen.
Im Jahr 2017 begann ich mit C ++ 11, C ++ 14 und C ++ 17 neue Dinge zu untersuchen. Erstaunliche Dinge wie Lambdas, Range-basierte For-Schleife und strukturierte Bindungen. Ich habe es in einem Gespräch zusammengestellt. Sie können die Folien und ein Video online finden.
All diese Forschungen und einige meiner Ausbildung und mein Unterricht brachten mich jedoch dazu, darüber nachzudenken, wie es wäre, wenn wir mit den Augen des Compilers sehen könnten. Sicher, es gibt einen AST -Dump, zumindest für Klang. Wir können sehen, welchen Code der Compiler aus einem C ++ - Quell -Snippet mit Tools wie Compiler Explorer generiert. Wir sehen jedoch Assembler. Weder der AST- noch der Compiler Explorer -Ausgang befinden sich in der Sprache, in der ich Code schreibe. Daher bin ich mit dieser Ausgabe nicht sehr vertraut. Außerdem, wenn sie den Schülern C ++ unterrichten, ein AST zeigten und erklären, dass alles für mich nicht ganz befriedigend war.
Ich habe angefangen, ein Clang-basiertes Tool zu schreiben, mit dem ein rebendasiertes For-Schleife in die Compiler-Internal-Version umgewandelt werden kann. Dann habe ich dasselbe für strukturierte Bindungen und Lambdas gemacht. Am Ende habe ich viel mehr als anfangs geplant. Es zeigt, wo die Betreiber angerufen werden und an denen der Compiler etwas Casting durchführt. C ++ - Erkenntnisse können den Typ hinter auto oder decltype abgeben. Ziel ist es, kompilierbaren Code zu erstellen. Dies ist jedoch an allen Stellen nicht möglich.
Sie können beispielsweise die Transformation eines Lambda, einer aufgebietsbasierten FOROP oder eines Autos sehen. Natürlich können Sie jeden anderen C ++ - Snippet verwandeln.
Sehen Sie sich selbst. C ++ - Insights ist online verfügbar: CPPInsights.io.
Trotzdem gibt es zu tun.
Ich behaupte nicht, alle Dinge richtig zu machen. Ich arbeite im Moment auch daran, Funktionen aus neuen Standards wie C ++ 20 zu unterstützen. Bitte denken Sie daran, dass C ++ Insights auf Clang und seinem Verständnis des AST basiert.
Ich habe ein paar Gespräche über C ++ - Erkenntnisse geführt, seit ich C ++ - Erkenntnisse veröffentlicht habe. Zum Beispiel bei C ++ jetzt. Hier sind die Folien und das Video.
C ++ - Erkenntnisse können innerhalb oder außerhalb des Klangquellbaums gebaut werden.
Siehe Readme_Windows.md
Um mit extra/clang zu erstellen -DINSIGHTS_USE_SYSTEM_INCLUDES=off -DCLANG_LINK_CLANG_DYLIB=on -DLLVM_LINK_LLVM_DYLIB=on verwenden
Eine Erläuterung, warum INSIGHTS_USE_SYSTEM_INCLUDES ausgeschaltet werden muss, finden Sie #186.
extra/clang und extra/llvm bereitstellen /usr/lib/{libclangAST.so,libLLVM*.a,libLLVM.so} . libclangAST.so braucht libLLVM.so und es würde einen Konflikt geben, wenn libLLVM*.a (anstelle von libLLVM.so ) verknüpft wäre. Siehe https://bugs.archlinux.org/task/60512
Sie müssen eine Klanginstallation im Suchpfad haben.
git clone https://github.com/andreasfertig/cppinsights.git
mkdir build && cd build
cmake -G"Ninja" ../cppinsights
ninja
Das resultierende binäre (Erkenntnisse) finden Sie im build -Ordner.
Der einfachste Weg, um C ++ - Erkenntnisse im Klang -Quellbaum zu erstellen, besteht darin, die Option LLVM_EXTERNAL_PROJECTS zu verwenden.
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
Es gibt einige Optionen, die mit CMake aktiviert werden können:
| Option | Beschreibung | Standard |
|---|---|---|
| Insights_strip | Erkenntnis nach dem Bau streifen | AN |
| Insights_static | Verwenden Sie statische Verknüpfung | AUS |
| Insights_Coverage | Aktivieren Sie die Codeabdeckung | AUS |
| Insights_USE_LIBCPP | Verwenden Sie LIBC ++ für Tests | AUS |
| DEBUGGEN | Debug aktivieren | AUS |
Es scheint am besten, die Architektur während der Konfiguration zu liefern:
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/
Dann, in der Einfuhr -> allgemein -> bestehendes Projekt in den Arbeitsbereich. Wählen Sie build_eclipse . Genießen Sie es mit der Bearbeitung mit Preopie.
Die Verwendung von C ++ - Insights ist ziemlich einfach:
insights <YOUR_CPP_FILE> -- -std=c++17
Die Dinge werden kompliziert, wenn es um die Systeme inklude Wege geht. Diese Wege sind in der Binärdatei fest codiert, was aus dem Compiler C ++-Einsichten zu stammen scheint. Um dabei zu helfen, lesen Sie Skripte/GetInclude.py. Das Skript versucht, das System-include-Pfade aus dem Compiler zu sammeln. getinclude.py verwendet ohne Option g++ . Sie können auch einen anderen Compiler als erstes Argument übergeben.
Hier ist ein Beispiel:
./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
Das Skript kann zusammen mit C ++ - Einsichten verwendet werden:
insights <YOUR_CPP_FILE> -- -std=c++17 `./scripts/getinclude.py`
Falls Sie beispielsweise einen benutzerdefinierten Build des GCC-Compilers haben, sind GCC-11.2.0 und nicht im Compiler im Standard-Systempfad installiert. Nach dem Erstellen findet Clang nicht den richtigen libstdc++ Pfad (GCCs STL). Wenn Sie diese Situation begegnen, können Sie " --gcc-toolchain=/path/GCC-1x.xx/installed/path " verwenden, um Clang/C ++ Einblicke zu sagen, dass der Standort des STL:
./cppinsights Insights.cpp -- --gcc-toolchain=${GCC_11_2_0_INSTALL_PATH} -std=c++20
Hier " ${GCC_11_2_0_INSTALL_PATH} " ist das Installationsverzeichnis Ihres angepassten GCC. Die Option für Clang wird hier beschrieben.
Es gibt auch ein weiteres GitHub -Projekt, das einen Docker -Container mit der neuesten C ++ - Insights -Version darin einstellt: C ++ Insights - Docker
Ein Plugin für VIM ist hier erhältlich.
Ein Plugin für Neovim ist hier erhältlich.
Eine Erweiterung für Visual Studio -Code ist auf dem VS -Code -Marktplatz verfügbar: C ++ Insights - VSCODE -Erweiterung.
Zumindest für macOS können Sie dank dieses Formulars C ++ - Insights über Homebrew installieren:
brew install cppinsights
Ich ziele darauf ab, dass das Repository mit der neuesten Version von Clang und zumindest die zuvor kompilierte. Die Website versucht, in der Nähe der neuesten Veröffentlichung von Clang zu bleiben. Aufgrund bestimmter Probleme (Erstellung von Clang für Windows) wird die Version der Website jedoch häufig um einige Monate verzögert.
Ich habe einen YouTube -Kanal erstellt, in dem ich jeden Monat ein neues Video veröffentlichen. In diesen Videos verwende ich C ++ - Erkenntnisse, um bestimmte C ++ - Konstrukte zu zeigen und zu erklären, und manchmal erkläre ich auch C ++ - Erkenntnisse.
Sehen Sie Todo.
Wenn Sie das Projekt unterstützen möchten, sollten Sie einen Patch einreichen. Eine andere Alternative besteht darin, Github -Sponsor oder Patreon -Anhänger zu werden.