C++ Insights es una herramienta de transformación de código fuente a código fuente basada en Clang cuyo propósito declarado es hacer visible lo que normalmente y deliberadamente ocurre tras bambalinas: la "magia que el compilador hace por nosotros para que las cosas funcionen", en palabras del propio proyecto. En lugar de producir ensamblador o un volcado de árbol de sintaxis abstracta (AST), reescribe un fragmento de C++ de nuevo en C++ —el lenguaje que escribe el programador— para que la reducción interna del compilador sea legible en una sintaxis familiar.

Logotipo del proyecto C++ Insights
El logotipo de C++ Insights, que identifica la herramienta de transformación de código fuente basada en Clang.github.com

El párrafo de apertura presenta a C++ Insights como una herramienta de transformación basada en Clang cuyo propósito es hacer visible la reducción interna del compilador; el logotipo identifica el proyecto que describe el artículo.

La motivación proviene de una brecha en la forma en que se suele enseñar y depurar C++. Clang puede emitir un volcado de AST, y herramientas como Compiler Explorer pueden mostrar el ensamblador que un compilador genera a partir de un fragmento. Pero ninguno de los dos resultados está escrito en C++, y el autor del proyecto afirma que encontró esos resultados poco familiares. Al enseñar C++ a los estudiantes, mostrar un AST y afirmar "todo está ahí" no era satisfactorio. C++ Insights fue escrito para cerrar esa brecha.

El autor, Andreas Fertig, comenzó el trabajo en 2017 mientras estudiaba las nuevas características que llegaban en C++11, C++14 y C++17 —lambdas, bucles for basados en rangos y uniones estructuradas— y lo presentó primero como una charla con diapositivas publicadas y video. Luego escribió una herramienta basada en Clang que transformaba un bucle for basado en rango en su versión interna del compilador, y luego hizo lo mismo para las uniones estructuradas y las lambdas. El proyecto creció más allá de esos objetivos iniciales: ahora muestra dónde se invocan los operadores y dónde el compilador inserta conversiones, y puede deducir el tipo detrás de `auto` o `decltype`.

El ejemplo canónico de la herramienta es una pequeña jerarquía de clases. Dado:

class Base { }; class Derived : public Base { }; int main() { Derived d; Derived d2 = d; d2 = d; Base& b = d; }

C++ Insights produce:

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; }

Encabezado del repositorio de GitHub para andreasfertig/cppinsights
El encabezado del repositorio de GitHub del proyecto, que lleva su nombre y su eslogan sobre ver el código fuente a través de los ojos de un compilador.github.com

El párrafo de disponibilidad enumera la herramienta de línea de comandos, el servicio web cppinsights.io, las integraciones de editores y la fórmula de Homebrew; el encabezado del repositorio dirige a los lectores al hogar del proyecto en GitHub.

El resultado revela dos cosas que el código fuente original oculta. Primero, el compilador ha proporcionado funciones miembro especiales —un constructor por defecto, un constructor de copia y un operador de asignación de copia— para tanto `Base` como `Derived`, cada uno anotado con `inline constexpr` y `noexcept`. Segundo, las operaciones implícitas en `main` se reescriben explícitamente: la copia `Derived d2 = d` se convierte en una construcción explícita `Derived(d)`, la asignación `d2 = d` se convierte en una llamada de miembro explícita `d2.operator=(d)`, y la vinculación de referencia `Base& b = d` se convierte en una conversión ascendente explícita `static_cast<Base&>(d)`.

El mismo mecanismo se aplica a las características que el autor tenía como objetivo originalmente. Un bucle for basado en rango se reescribe en la forma explícita a la que se reduce. Una lambda se reescribe para mostrar el tipo de clausura generado por el compilador y su `operator()`. El tipo deducido detrás de `auto` o `decltype` se muestra en su lugar. El objetivo en todo momento es producir código compilable, aunque el proyecto señala que esto no es posible en todas partes.

C++ Insights está disponible como una herramienta de línea de comandos, un servicio web en cppinsights.io e integraciones para Vim, Neovim, Visual Studio Code y Homebrew (en macOS). La invocación por línea de comandos toma un archivo de fuente y una bandera estándar, por ejemplo `insights <TU_ARCHIVO_CPP> -- -std=c++17`. Las rutas de inclusión del sistema están codificadas de forma fija desde el compilador de construcción del binario, y un script de ayuda, `scripts/getinclude.py`, las recopila del compilador; pasar una instalación personalizada de GCC que no esté en la ruta predeterminada requiere un argumento `--gcc-toolchain` que apunte a la ubicación de la STL.

Se establecen varias advertencias en la propia documentación del proyecto. El autor "no afirma obtener todas las cosas correctamente". El soporte para características de estándares más nuevos, como C++20, estaba en progreso en el momento de la documentación. La herramienta se basa en Clang y su comprensión del AST, por lo que su resultado refleja el modelo de ese analizador del código. El servicio web sigue de cerca el último lanzamiento de Clang, aunque su versión a menudo se retrasa unos meses debido a la dificultad de construir Clang para Windows.

Debido a que la única fuente sustancial suministrada es la propia página del repositorio del proyecto, cada afirmación anterior es atribuible a la documentación del proyecto en lugar de a una verificación independiente. Las incógnitas significativas incluyen la versión exacta de Clang que ejecuta actualmente el servicio web, la integridad del soporte para características de C++20 y posteriores, y qué tan fielmente se compila el resultado reescrito en casos límite que la documentación no enumera. Para los lectores que quieran probar la herramienta directamente, el servicio web en cppinsights.io no requiere instalación local.