C ++ Insights es una herramienta basada en rayos que realiza una transformación de origen a fuente. El objetivo de C ++ Insights es hacer que las cosas sean visibles que ocurren normalmente e intencionalmente detrás de escena. Se trata de la magia que el compilador hace para que las cosas funcionen.
Tome este código, por ejemplo:
class Base {
};
class Derived : public Base {
};
int main () {
Derived d;
Derived d2 = d;
d2 = d;
Base& b = d;
}Nada especial, y por supuesto, se compila. Esta es la opinión del compilador:
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 ;
} Puede ver todas las funciones de miembros especiales proporcionadas por el compilador y el upcast de Derived a Base .
C ++ Insights es una herramienta basada en rayos que realiza una transformación de origen a fuente. El objetivo de C ++ Insights es hacer que las cosas sean visibles que ocurren normalmente e intencionalmente detrás de escena. Se trata de la magia que el compilador hace para que las cosas funcionen. O mirar a través de las clases de un compilador.
En 2017, comencé a buscar algunas cosas nuevas que obtuvimos con C ++ 11, C ++ 14 y C ++ 17. Cosas asombrosas como Lambdas, bucles basados en rango y enlaces estructurados. Lo reuní en una charla. Puede encontrar las diapositivas y un video en línea.
Sin embargo, toda esa investigación y parte de mi entrenamiento y enseñanza me hicieron comenzar a pensar en cómo sería si pudiéramos ver con los ojos del compilador. Claro, hay un volcado AST, al menos para Clang. Podemos ver qué código genera el compilador a partir de un fragmento de fuente C ++ con herramientas como Compiler Explorer. Sin embargo, lo que vemos es el ensamblador. Ni el AST ni la salida del Compilador del Explorador están en el código del lenguaje que escribo. Por lo tanto, no estoy muy familiarizado con este resultado. Además, al enseñar a los estudiantes C ++, mostrar una AST y explicar que es todo lo que no fue muy satisfactorio para mí.
Comencé a escribir una herramienta basada en rayos que puede transformar un bucle for-bans en la versión interna del compilador. Luego, hice lo mismo para enlaces estructurados y lambdas. Al final, hice mucho más de lo que inicialmente planeado. Muestra dónde se invocan los operadores y los lugares en los que el compilador hace algo de casting. Las ideas C ++ pueden deducir el tipo detrás auto o decltype . El objetivo es producir código compilable. Sin embargo, esto no es posible en todos los lugares.
Puede ver, por ejemplo, la transformación de una lambda, for-bucle basada en rango o auto. Por supuesto, puede transformar cualquier otro fragmento de C ++.
Mira a ti mismo. C ++ Insights está disponible en línea: cppinsights.io.
Aún así, hay trabajo por hacer.
No pretendo acertar todas las cosas. También estoy trabajando en características de apoyo de nuevos estándares, como C ++ 20, en este momento. Recuerde que C ++ Insights se basa en Clang y su comprensión del AST.
Hice un par de conversaciones sobre C ++ Insights desde que lanzé C ++ Insights. Por ejemplo, en C ++ ahora. Aquí están las diapositivas y el video.
Las ideas de C ++ se pueden construir dentro o fuera del árbol fuente de CLANG.
Ver readMe_windows.md
Para construir con extra/clang use los siguientes indicadores adicionales: -DINSIGHTS_USE_SYSTEM_INCLUDES=off -DCLANG_LINK_CLANG_DYLIB=on -DLLVM_LINK_LLVM_DYLIB=on
Vea el #186 para obtener una explicación de por qué debe INSIGHTS_USE_SYSTEM_INCLUDES .
extra/clang y extra/llvm proporcionar /usr/lib/{libclangAST.so,libLLVM*.a,libLLVM.so} . libclangAST.so necesita libLLVM.so y habría un conflicto si libLLVM*.a (en lugar de libLLVM.so ) está vinculado. Ver https://bugs.archlinux.org/task/60512
Debe tener una instalación de Clang en la ruta de búsqueda.
git clone https://github.com/andreasfertig/cppinsights.git
mkdir build && cd build
cmake -G"Ninja" ../cppinsights
ninja
El binario (información) resultante se puede encontrar en la carpeta build .
La forma más fácil de construir ideas C ++ dentro del árbol fuente de Clang es usar la opción 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
Hay un par de opciones que se pueden habilitar con Cmake:
| Opción | Descripción | Por defecto |
|---|---|---|
| Insights_strip | Spare Insight después de la construcción | EN |
| Insights_static | Use enlace estático | APAGADO |
| Insights_Coverage | Habilitar la cobertura del código | APAGADO |
| Insights_use_libcpp | Use libc ++ para pruebas | APAGADO |
| DEPURAR | Habilitar la depuración | APAGADO |
Parece mejor suministrar la arquitectura durante la configuración:
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/
Luego, en la importación del desarrollo de CeEvel -> General -> Proyecto existente en el espacio de trabajo. Seleccione build_eclipse . Disfruta editando con CEOVEL.
Usar C ++ Insights es bastante simple:
insights <YOUR_CPP_FILE> -- -std=c++17
Las cosas se complican cuando se trata de las rutas del sistema. Estos caminos están codificados en el binario, que parece provenir del compilador C ++ Insights fue construido. Para ayudar con eso, consulte Scripts/Getinclude.py. El script intenta recopilar las rutas de inclusión del sistema del compilador. Sin una opción, getinclude.py usa g++ . También puede pasar otro compilador como primer argumento.
Aquí hay un ejemplo:
./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
El script se puede usar junto con C ++ Insights:
insights <YOUR_CPP_FILE> -- -std=c++17 `./scripts/getinclude.py`
En caso de que tenga una compilación personalizada del compilador GCC, por ejemplo, GCC-11.2.0, y no está instalado en el compilador en la ruta del sistema predeterminada, luego, después de la construcción, Clang no puede encontrar la ruta correcta libstdc++ (STL de GCC). Si se encuentra con esta situación, puede usar " --gcc-toolchain=/path/GCC-1x.xx/installed/path " para decirle a Clang/C ++ información de la ubicación del STL:
./cppinsights Insights.cpp -- --gcc-toolchain=${GCC_11_2_0_INSTALL_PATH} -std=c++20
Aquí " ${GCC_11_2_0_INSTALL_PATH} " es el directorio de instalación de su GCC de construcción personalizada. La opción para Clang se describe aquí.
También hay otro proyecto de GitHub que establece un contenedor Docker con la última versión de C ++ Insights: C ++ Insights - Docker
Un complemento para VIM está disponible aquí.
Un complemento para Neovim está disponible aquí.
Una extensión para el código Visual Studio está disponible en el mercado VS Code: C ++ Insights - VSCODE Extension.
Al menos para MacOS, puede instalar C ++ Insights a través de Homebrew gracias a esta formular:
brew install cppinsights
Apunto a que el repositorio compile con la última versión de Clang y al menos la anterior. El sitio web trata de mantenerse cerca del último lanzamiento de Clang. Sin embargo, debido a ciertos problemas (construcción de Clang para Windows), la versión del sitio web a menudo se retrasa unos pocos meses.
Creé un canal de YouTube donde lento un nuevo video cada mes. En estos videos, uso C ++ Insights para mostrar y explicar ciertas construcciones de C ++, y a veces también explico las ideas de C ++.
Ver TODO.
Si desea apoyar el proyecto, considere enviar un parche. Otra alternativa es convertirse en un patrocinador de Github o un partidario de Patreon.