C++ Debería Ser C++
La rápida evolución de C++ y su creciente complejidad están polarizando a sus usuarios: algunos elogian los estándares modernos por hacer el lenguaje más expresivo y potente, mientras que otros los ven como barrocos, difíciles de aprender y complicados de adaptar a grandes bases de código heredadas. Los comentaristas discuten si C++ debería priorizar ser un lenguaje de sistemas de alto rendimiento, mejorar la ergonomía y la seguridad (posiblemente en respuesta a las expectativas y regulaciones emergentes sobre “seguridad de memoria”), o incluso aceptar que lenguajes más nuevos como Rust, Zig o Go pueden ser más adecuados para muchos dominios. Las carencias de tooling —especialmente en módulos, gestión de dependencias y reproducibilidad de builds— se consideran obstáculos prácticos importantes, independientemente de hacia dónde vaya el lenguaje.
Recepción del C++ moderno
- Fuerte división: algunos consideran que C++20/23 supone un enorme salto en calidad de vida (p. ej.,
optional,expected, filesystem, structured bindings, inicialización en if/switch, lambdas) y disfrutan del “C++ moderno”. - Otros, especialmente usuarios de larga data, ven los estándares más recientes como barrocos y desagradables, y prefieren “C con clases” o un subconjunto muy pequeño.
- Muchos desarrolladores, de facto, se limitan a un subconjunto específico de su proyecto, pero esto es más difícil en bases de código grandes y cuando nuevas características (p. ej., move semantics) introducen boilerplate o requisitos sutiles.
Herramientas, módulos y gestión de dependencias
- Se percibe ampliamente como una debilidad importante: no hay un gestor de paquetes estándar, ni una historia integrada para dependencias, pruebas, logging, etc.
- Los módulos se ven como prometedores, pero en la práctica inutilizables debido a un soporte desigual de compiladores y herramientas.
- Se critica a vcpkg por comportamiento frágil, fuentes alteradas y versionado anclado a commits; se mencionan Bazel/Buck y Nix/Guix como respuestas parciales.
- Algunos equipos recurren a comprobar toolchains en control de versiones o a hacer snapshots de máquinas virtuales.
Modelo de compilación y rendimiento
- Los tiempos de compilación se consideran uno de los principales puntos dolorosos, a menudo con mayor prioridad que las nuevas funciones de seguridad.
- Se discuten las causas: análisis repetido de headers, instanciación de templates por unidad de traducción, trabajo extra del linker para eliminar duplicados, y una gramática difícil; hay desacuerdo sobre cuál factor domina.
- Las comparaciones con Go, Rust, Zig y C destacan cómo el modelo de preprocesado y compilación de C/C++ envejece mal, incluso con headers precompilados o módulos.
Seguridad de memoria, regulaciones y dirección del lenguaje
- Hay desacuerdo sobre cuánto exigen realmente los usuarios de C++ la seguridad de memoria; algunos dicen que quienes se preocupan ya se han ido, otros sostienen que muchos la quieren pero no mediante herramientas adicionales de pago.
- La seguridad “a medias” (opt-in, cobertura parcial, costo en tiempo de ejecución) se considera de beneficio limitado.
- El hilo analiza la presión gubernamental (guías de NSA/CISA, próximas normas de EE. UU./UE) hacia lenguajes seguros en memoria; no hay prohibiciones directas, pero se espera presión en compras y papeleo.
- Algunos ven el artículo como una reacción defensiva frente a Rust, que muchos consideran un sustituto creíble de C++ para trabajo de sistemas.
Biblioteca estándar, ergonomía y “zero-cost”
- Hay quejas de que std carece de primitivas de alto rendimiento (allocators especializados, estructuras lock-free/wait-free, IPC, threading de alto rendimiento) y no está ajustada para cargas de trabajo de juegos/BBDD/sistemas operativos.
- Otros argumentan que eso debe ir en bibliotecas externas y que ningún diseño genérico de alto rendimiento sirve para todas las cargas.
- Se cuestiona el ideal de “abstracción zero-cost”; el flujo de control oculto (constructores, destructores, copias) y las excepciones pueden tener un costo real si se usan mal o no se optimizan bien.
- Se ve que nuevas APIs como
std::printson más engorrosas que los idioms antiguos (streams) para la personalización, reforzando la percepción de mala ergonomía.
Generalidad, legado y alternativas
- Hay un debate amplio sobre si “usado por millones” prueba que C++ es un buen lenguaje de propósito general; algunos llaman a esto una falacia, otros dicen que el uso extendido en el mundo real a través de dominios es, de facto, evidencia de idoneidad.
- El legado y la inercia se citan repetidamente: mucha gente escribe C++ solo porque el código anterior lo hacía; las enormes bases de código existentes hacen impracticables los cambios rompientes o las reescrituras completas.
- Algunos sostienen que C++ debería redoblar su apuesta por ser el lenguaje de sistemas más rápido; otros piensan que su historia y complejidad lo hacen una mala opción para nuevos programadores frente a Rust o Go.
- Se mencionan propuestas como Carbon, cppfront y “C con templates” como intentos de empezar de cero, pero existe escepticismo sobre la adopción y sobre la capacidad del comité para hacer cambios radicales y rompientes.