C ++ Insights est un outil basé sur Clang qui effectue une transformation source à source. Le but des informations C ++ est de rendre les choses visibles qui se produisent normalement et intentionnellement dans les coulisses. Il s'agit de la magie que le compilateur fait pour nous de faire fonctionner les choses.
Prenez ce morceau de code, par exemple:
class Base {
};
class Derived : public Base {
};
int main () {
Derived d;
Derived d2 = d;
d2 = d;
Base& b = d;
}Rien de spécial, et bien sûr, il compile. Ceci est la vue du compilateur à ce sujet:
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 ;
} Vous pouvez voir toutes les fonctions de membres spéciaux fournies par le compilateur et upcast de Derived à Base .
C ++ Insights est un outil basé sur Clang qui effectue une transformation source à source. Le but des informations C ++ est de rendre les choses visibles qui se produisent normalement et intentionnellement dans les coulisses. Il s'agit de la magie que le compilateur fait pour nous de faire fonctionner les choses. Ou en regardant à travers les classes d'un compilateur.
En 2017, j'ai commencé à examiner de nouvelles choses que nous avons obtenues avec C ++ 11, C ++ 14 et C ++ 17. Des choses incroyables comme les lambdas, les boucles pour des plages et les reliures structurées. Je l'ai mis ensemble dans une conférence. Vous pouvez trouver les diapositives et une vidéo en ligne.
Cependant, toutes ces recherches et une partie de mon entraînement et de mon enseignement m'ont amené à réfléchir à la façon dont ce serait si nous pouvions voir avec les yeux du compilateur. Bien sûr, il y a un vidage AST, du moins pour Clang. Nous pouvons voir quel code le compilateur génère à partir d'un extrait de source C ++ avec des outils comme le compilateur Explorer. Cependant, ce que nous voyons est l'assembleur. Ni l'AST ni la sortie d'explorateur du compilateur ne sont dans le langage que j'écris le code. Par conséquent, je ne connais pas très bien cette sortie. De plus, lors de l'enseignement aux étudiants C ++, en montrant un AST et en expliquant que c'est tout ce qu'il n'y avait pas tout à fait satisfaisant pour moi.
J'ai commencé à écrire un outil basé sur Clang qui peut transformer une boucle basée sur la plage en version interne du compilateur. Ensuite, j'ai fait de même pour les liaisons structurées et les lambdas. En fin de compte, j'ai fait bien plus que prévu initialement. Il montre où les opérateurs sont invoqués et les lieux dans lesquels le compilateur effectue un casting. C ++ Insights peut déduire le type derrière auto ou decltype . L'objectif est de produire du code compilable. Cependant, ce n'est pas possible à tous les endroits.
Vous pouvez voir, par exemple, la transformation d'un lambda, d'une boucle basée sur une plage ou d'une auto. Bien sûr, vous pouvez transformer tout autre extrait C ++.
Voyez-vous. C ++ Insights est disponible en ligne: cppinsights.io.
Pourtant, il y a du travail à faire.
Je ne prétends pas bien faire les choses. Je travaille également sur le soutien des fonctionnalités de nouvelles normes, comme C ++ 20, pour le moment. N'oubliez pas que C ++ Insights est basé sur Clang et sa compréhension de l'AST.
J'ai fait quelques discussions sur C ++ Insights depuis que j'ai publié C ++ Insights. Par exemple, à C ++ maintenant. Voici les diapositives et la vidéo.
Les informations C ++ peuvent être construites à l'intérieur ou à l'extérieur de l'arbre source Clang.
Voir Readme_windows.md
Pour construire avec extra/clang utilisez les indicateurs supplémentaires suivants: -DINSIGHTS_USE_SYSTEM_INCLUDES=off -DCLANG_LINK_CLANG_DYLIB=on -DLLVM_LINK_LLVM_DYLIB=on
Voir # 186 pour une explication des raisons pour lesquelles INSIGHTS_USE_SYSTEM_INCLUDES doit être désactivée.
extra/clang et extra/llvm fournissent /usr/lib/{libclangAST.so,libLLVM*.a,libLLVM.so} . libclangAST.so a besoin libLLVM.so et il y aurait un conflit si libLLVM*.a (au lieu de libLLVM.so ) sont liés. Voir https://bugs.archlinux.org/task/60512
Vous devez avoir une installation de clang dans le chemin de recherche.
git clone https://github.com/andreasfertig/cppinsights.git
mkdir build && cd build
cmake -G"Ninja" ../cppinsights
ninja
Le binaire résultant (idées) peut être trouvé dans le dossier build .
La façon la plus simple de construire des informations C ++ à l'intérieur de l'arborescence source Clang consiste à utiliser l'option 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
Il existe quelques options qui peuvent être activées avec CMake:
| Option | Description | Défaut |
|---|---|---|
| Insights_strip | Strip Insight After Build | SUR |
| Insights_static | Utiliser des liens statiques | DÉSACTIVÉ |
| Insights_coverage | Activer la couverture du code | DÉSACTIVÉ |
| Insights_use_libcpp | Utilisez LiBC ++ pour les tests | DÉSACTIVÉ |
| DÉBOGUER | Activer le débogage | DÉSACTIVÉ |
Il semble préférable de fournir l'architecture pendant la configuration:
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/
Ensuite, dans Develop Import -> General -> Projet existant dans Workspace. Sélectionnez build_eclipse . Profitez de l'édition avec Devel.
L'utilisation de C ++ Insights est assez simple:
insights <YOUR_CPP_FILE> -- -std=c++17
Les choses se compliquent en ce qui concerne les chemins du système. Ces chemins sont codés en dur dans le binaire, qui semble provenir du compilateur que C ++ Insights a été construit avec. Pour vous aider, consultez les scripts / getinclude.py. Le script essaie de collecter les chemins de système du système du compilateur. Sans option, getinclude.py utilise g++ . Vous pouvez également passer un autre compilateur comme premier argument.
Voici un exemple:
./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
Le script peut être utilisé avec C ++ Insights:
insights <YOUR_CPP_FILE> -- -std=c++17 `./scripts/getinclude.py`
Dans le cas où vous avez une construction personnalisée du compilateur GCC, par exemple, GCC-11.2.0, et non installé dans le compilateur dans le chemin du système par défaut, puis après la construction, Clang ne trouve pas le chemin libstdc++ correct (STL de GCC). Si vous rencontrez cette situation, vous pouvez utiliser " --gcc-toolchain=/path/GCC-1x.xx/installed/path " pour dire à Clang / C ++ Insights l'emplacement du STL:
./cppinsights Insights.cpp -- --gcc-toolchain=${GCC_11_2_0_INSTALL_PATH} -std=c++20
Ici " ${GCC_11_2_0_INSTALL_PATH} " est le répertoire d'installation de votre gcc construit personnalisé. L'option pour Clang est décrite ici.
Il existe également un autre projet GitHub qui configure un conteneur Docker avec la dernière version C ++ Insights: C ++ Insights - Docker
Un plugin pour VIM est disponible ici.
Un plugin pour Neovim est disponible ici.
Une extension pour Visual Studio Code est disponible sur VS Code Marketplace: C ++ Insights - Extension VScode.
Au moins pour MacOS, vous pouvez installer C ++ Insights via Homebrew grâce à ce formulaire:
brew install cppinsights
Je vise que le référentiel se compile avec la dernière version de Clang et au moins celle auparavant. Le site Web essaie de rester à proximité de la dernière version de Clang. Cependant, en raison de certains problèmes (création de Clang pour Windows), la version du site Web est souvent retardée de quelques mois.
J'ai créé une chaîne YouTube où je publie une nouvelle vidéo chaque mois. Dans ces vidéos, j'utilise C ++ Insights pour afficher et expliquer certaines constructions C ++, et parfois j'explique également C ++ Insights.
Voir TODO.
Si vous aimez soutenir le projet, envisagez de soumettre un correctif. Une autre alternative consiste à devenir un sponsor GitHub ou un partisan de Patreon.