C++ 'freestanding': Lenguaje sin sistema operativo

Fuentes: Freestanding standard library

El término 'freestanding' en C++ se refiere a una implementación del lenguaje que opera sin la dependencia de un sistema operativo (SO) 'hosted'. Esto es crucial en entornos restringidos como sistemas embebidos, kernels de SO o 'bare-metal' donde la asignación dinámica de memoria (heap), llamadas al sistema operativo (system calls) y el manejo de excepciones son inexistentes o limitados. La norma C++ define un subconjunto mínimo del lenguaje y la biblioteca que debe funcionar en estos entornos. Para determinar si una implementación es 'hosted' o 'freestanding', se inspecciona la macro __STDC_HOSTED__: un valor de 1 indica 'hosted', mientras que 0 indica 'freestanding'.

Las diferencias clave radican en que en un entorno 'hosted' se asume la existencia de múltiples hilos de ejecución concurrentes, una función main() global obligatoria y la disponibilidad de todos los headers estándar. En un entorno 'freestanding', estas características son 'implementation-defined', es decir, dependen de la implementación específica. Aunque no es obligatorio que un proveedor ofrezca una implementación 'freestanding', la norma sí exige la disponibilidad de un subconjunto mínimo de la biblioteca.

Este subconjunto mínimo incluye headers esenciales como <cstdint>, <cstddef>, <limits> y <type_traits>, que proporcionan tipos de enteros de ancho fijo, definiciones de tamaño, inspección de tipos en tiempo de compilación y límites numéricos, todos independientes del SO. Sin embargo, componentes que dependen de servicios del SO, como <thread>, <filesystem> e incluso <iostream>, suelen estar ausentes, al igual que el soporte para memoria dinámica y excepciones.

Históricamente, las implementaciones 'freestanding' eran muy limitadas. Sin embargo, desde C++20, y continuando con C++23 y C++26, se ha realizado un esfuerzo considerable para expandir la disponibilidad de funcionalidades en estos entornos. Esto incluye la inclusión de partes de la biblioteca de algoritmos, utilidades y, en C++26, características como std::span, std::expected, std::mdspan y adaptadores de punteros inteligentes. Esta expansión responde a la demanda de dominios como sistemas embebidos y desarrollo de videojuegos, que buscan combinar rendimiento y abstracciones de alto nivel.

En resumen, comprender la distinción 'freestanding' es fundamental para el desarrollo en entornos con recursos limitados y proporciona una mejor comprensión de las decisiones de diseño de la biblioteca estándar de C++.