5 puntos por GN⁺ 4 시간 전 | 1 comentarios | Compartir por WhatsApp
  • Un documental que resume en una sola pieza los 40 años de historia de C++, desde los inicios en Bell Labs hasta su adopción global y su crecimiento actual, con la participación de personas que formaron parte de la historia, la estandarización y el ecosistema de herramientas de C++
  • C++ nació a partir de C with Classes, creado por Bjarne Stroustrup en Bell Labs para combinar el control de hardware de C con la abstracción orientada a objetos de Simula, y creció hasta convertirse en un lenguaje de abstracciones eficientes para sistemas de gran escala
  • La implementación inicial, CFront, convertía C++ a código C para permitir usar intacta la infraestructura y las bibliotecas existentes de C, y a medida que crecieron los usuarios después de 1983, la compatibilidad pasó a ser un reto clave
  • La estandarización ANSI/ISO, iniciada por la presión de IBM, HP y Sun, evitó la fragmentación entre implementaciones de distintos vendors, y el estándar de 1997 incluyó namespace, exception, template y STL
  • A comienzos de los 2000 llegó el invierno de C++ con Java y C#, el colapso puntocom y el rápido aumento del rendimiento de CPU, pero hacia 2004 el fin del escalado de frecuencia y la importancia de la paralelización impulsaron un renacimiento con C++11
  • Hoy C++ se usa en CERN, videojuegos, finanzas, IA y HPC basadas en CUDA, sistemas embebidos y más, mientras que la seguridad de memoria, la complejidad, el tamaño del comité de estándares y la falta de financiamiento siguen siendo desafíos importantes

C with Classes, nacido en Bell Labs

  • C++ es un lenguaje con más de 40 años y, cuando se creó por primera vez, no existían herramientas como editores avanzados, resaltado de sintaxis, navegación de código, autocompletado o refactorización, y muchos desarrolladores usaban BASIC o ensamblador distinto para cada chip
  • En una época en la que se necesitaban programas cada vez más grandes y complejos, Bjarne Stroustrup intentaba construir sistemas distribuidos en Bell Labs, y para manejar elementos como controladores de dispositivos, interfaces de red, administradores de memoria y procesos, necesitaba un lenguaje de bajo nivel
  • C ofrecía control total sobre el hardware y era adecuado para programación de sistemas, pero a medida que los programas crecían se quedaba corto para expresar estructuras como módulos, canales de comunicación y protocolos
  • A Stroustrup le gustaban la fuerte seguridad de tipos, los tipos definidos por el usuario, las clases y las jerarquías de clases de Simula, que había usado en Cambridge, pero consideraba que Simula era demasiado lento y consumía demasiada memoria
  • Por eso creó C with Classes agregando a C las funciones básicas de Simula, y durante casi 40 años después hizo evolucionar C++ en la dirección de permitirle hacer todo lo que podían hacer Simula y C

CFront, el nombre y la expansión inicial

  • C with Classes se creó al principio como una especie de preprocesador de C, y cuando otras personas empezaron a usarlo, Stroustrup concluyó que la diferencia con C no era suficiente, así que dedicó un año a mejorar el compilador y el lenguaje
  • CFront no generaba código máquina con un backend tradicional, sino que compilaba a código C, lo que permitió a los usuarios de C++ mantener su entorno existente de C sin tener que adoptar desde cero nueva infraestructura o bibliotecas
  • CFront fue creado en 1983 y era un compilador real que realizaba análisis léxico, análisis sintáctico, verificación de tipos, generación de representación en árbol y optimización de árboles
  • El nombre C++ surgió del hecho de que el operador ++ de C significa incremento; semánticamente ++C sería más correcto, pero se eligió C++ por comodidad para índices y referencias
  • AT&T intentó vender compiladores de C++ al entrar al negocio de computadoras y software, pero no logró vender suficiente hardware, y las primeras implementaciones de C++ pudieron difundirse ampliamente en la práctica gracias al costo de cinta y a licencias comerciales muy bajas
  • Durante un tiempo, Stroustrup se encargó él solo de la documentación, el compilador, la implementación del lenguaje y el help desk; la inversión de AT&T fue muy pequeña, y en una ocasión se asignaron 5,000 dólares para tres años de difusión de un lenguaje de programación de propósito general
  • En CFront 2.0 se descubrió un bug en el manejo de herencia múltiple, y como una función central ya prometida podía romperse de una manera imposible de corregir una vez desplegada en campo, se preparó y distribuyó una versión corregida en pocos días
  • Como había que mantener el mismo número de release, la versión se distribuyó como 2.0.0 en lugar de 2.0.1, y la compatibilidad se volvió una exigencia tan dominante que en broma la llamaban la “palabra con C”

Estandarización y STL

  • C++ era una herramienta para elevar la productividad interna de AT&T, pero no podía triunfar como un lenguaje encerrado en una sola empresa: necesitaba desarrolladores externos y un ecosistema de bibliotecas
  • Antes de la web, grupos como comp.lang.c++ en Usenet y revistas de computación como Byte eran las vías de difusión de información, y Stroustrup dio charlas en muchas empresas y organizaciones a finales de los 80 para dar a conocer el lenguaje
  • El uso creció sin campañas publicitarias ni un patrocinador fuerte, pero cuando varios vendors como Borland, Microsoft, IBM y Sun empezaron a crear cada uno su propia implementación de C++ y su propio diseño de templates, la compatibilidad de código se fragmentó gravemente
  • Personas que representaban a IBM, HP y Sun pidieron a Stroustrup que iniciara la estandarización de C++ bajo las reglas de ANSI; él pensaba que era demasiado pronto, pero al final aceptó preparar un documento base para la estandarización un año después
  • El Annotated Reference Manual, o ARM, se convirtió en el documento de entrada para la estandarización, y abrió el camino a incorporar funciones como templates, exceptions y namespaces
  • El estándar se definió como un contrato entre quienes escriben código C++ y las implementaciones de C++, y pasó a ser el mecanismo para lograr que distintos vendors interpretaran el mismo código con el mismo significado
  • La STL creada por Alexander Stepanov tenía como idea central hacer que los algoritmos funcionaran sobre cualquier estructura de datos aplicable y que distintas estructuras de datos pudieran llenarse mutuamente con información
  • Antes de STL, cada quien hacía sus propios arrays, lists, trees, containers y algoritmos, pero STL propuso una sola manera poderosa de definir algoritmos y contenedores
  • La propuesta de STL recibió oposición por haber llegado demasiado tarde y ser demasiado grande para el calendario de estandarización, y grandes empresas como Microsoft también se opusieron, pero tras presentaciones y discusiones cerca del 80% del comité votó a favor y entró en el estándar
  • C++ se estandarizó en noviembre de 1997, y namespace, exception, template y la Standard Template Library se añadieron como funciones fundamentales
  • LLVM nació después de esta estandarización, así que pudo usar las nuevas funciones de la manera prevista sin cargar con el costo de migrar código anterior

El invierno y el renacimiento con C++11

  • En los 90, C++ se convirtió en el lenguaje que transformó el desarrollo centrado en Fortran dentro del software y la computación de física de altas energías en lugares como CERN, y bibliotecas y código existentes fueron porteados a C++ o rehechos para ajustarse a C++
  • En el desarrollo de videojuegos, a medida que las tarjetas de video y las APIs asumieron el trabajo de bajo nivel, surgió una transición de C y ensamblador hacia C++, y C++ pasó a usarse en ecosistemas de motores como Unreal
  • En finanzas, con la aparición del trading algorítmico y el high-frequency trading, la latencia a nivel de microsegundos se volvió crítica, y C++ se usó como un lenguaje capaz de lograr baja latencia sin tener que microoptimizar cada línea
  • Con el colapso puntocom de 2000, Java emergió con el fuerte marketing de Sun como “el lenguaje del futuro” y “el lenguaje de internet”, y Java apareció como una reacción explícita a la complejidad de C++
  • Dentro de Microsoft existía el deseo de combinar la facilidad del desarrollo basado en formularios de Visual Basic con el rendimiento y la expresividad de C++, y de ahí surgió C#
  • Entre 2000 y 2005 no hubo solo un estancamiento, sino un declive de C++; como las frecuencias de CPU seguían aumentando, muchos diseñadores de lenguajes y desarrolladores empezaron a considerar menos importante el rendimiento
  • Hacia 2004 terminó el escalado de frecuencia de los procesadores y se hicieron evidentes los límites de rendimiento y energía por núcleo, junto con los rendimientos decrecientes del paralelismo a nivel de instrucción, marcando el fin de la era en la que el hardware hacía que los programas fueran automáticamente más rápidos
  • El multicore y la paralelización se volvieron importantes, pero en ese momento el estándar de C++ no tenía nada sobre threading, y el correo de Herb Sutter “C++ multi-threading: is the standardization committee listening” puso ese problema en primer plano
  • C++0X comenzó en 2002 y apuntaba a completarse entre 2007 y 2009, pero siguió retrasándose para incorporar más funciones importantes y terminó tardando 13 años
  • C++11 introdujo move semantics, concurrency, auto, range-based for loop, smart pointer, lambda y constexpr, y se convirtió en el primer estándar de la familia C en tratar oficialmente el threading
  • C++11 fue un renacimiento porque coincidieron la necesidad de exprimir al máximo el rendimiento del hardware y la llegada de funciones del lenguaje más fáciles y seguras
  • Después se adoptó el train model para publicar estándares en tiempos fijos, y el comité eligió un ciclo de 3 años en lugar de uno de 2
  • C++14 fue un release pequeño con lo que no alcanzó a entrar en C++11 y con correcciones de bugs, y en C++17 y C++23 se añadieron muchas funciones del lenguaje y de la biblioteca estándar

Escala actual y desafíos

  • La complejidad de C++ ha seguido creciendo, y recibe críticas por tener varias formas de inicializar variables y por una complejidad descrita incluso como “difícil de entender”
  • El comité de estándares también ha crecido hasta 527 miembros, y existe la preocupación de que ahora haya tantos comités y chairs como personas había en la composición completa al inicio
  • En diseño de lenguajes casi siempre es posible agregar, pero casi imposible quitar, así que más importante que decidir qué entra es decidir cuándo decir que no
  • C++ se usa en generación de energía, turbinas eólicas, arroceras, boliches, películas de Hollywood, automóviles, finanzas, cámaras y muchos otros lugares, al punto de describirse como “más o menos en todas partes”
  • La base de código en C++ de HRT supera el millón de líneas y está compuesta por 15,000 archivos, y solo en 2025 unos 800 desarrolladores hicieron cerca de 84,000 commits
  • En videojuegos, mientras Unity usa C#, Unreal usa C++, y juegos que necesitan alto frame rate y gráficos rápidos, como Call of Duty, usan C++ por velocidad
  • C++ también es clave en Nvidia y en la computación acelerada; aunque en la superficie se use Python, la carga real de cómputo recae en bibliotecas CUDA altamente optimizadas
  • Se mencionó a Rust y C++ como lenguajes de rápido crecimiento, y se presentaron cifras según las cuales los desarrolladores de C++ pasaron de 9.4 millones en 2022 a 16.3 millones en 2025
  • La demanda de lenguajes donde importa la eficiencia energética en relación con el rendimiento sigue existiendo, por lo que C++ conserva casos de uso sobresalientes y difíciles de reemplazar
  • Al mismo tiempo, existe la preocupación de que, a medida que los grandes actores se mueven hacia la IA, pueda reducirse el financiamiento para C++
  • Durante la pandemia hubo movimientos en gobiernos y organismos reguladores para alejarse de C++, que por defecto no ofrece seguridad de memoria, y la seguridad de memoria se plantea como el problema más importante por resolver
  • En C++26, para fortalecer el software, las variables no inicializadas dejarán de ser undefined behavior, y la biblioteca estándar de C++26 ofrecerá opciones de bounds safety para tipos comunes como string, span y vector
  • La static reflection de C++26 es una función que permite que el código del programa vea el código del programa, y se la evalúa como la función individual estandarizada de mayor impacto
  • La conclusión es que la IA podría influir mucho en la seguridad de los lenguajes y en la forma de usar los lenguajes de programación, pero todavía no se sabe qué ocurrirá a partir de ahora

1 comentarios

 
GN⁺ 4 시간 전
Opiniones en Hacker News
  • Todavía me resuena la crítica de Ken Thompson de que C++ es un montón inconsistente y complejo de ideas. La última vez que lo usé profesionalmente fue con C++98, y 11/17/20 apenas los toqué un poco por curiosidad
    Si c++/cfront no se hubiera colgado del prestigio de C, dudo que se hubiera usado tan ampliamente, y creo que ese punto era tanto su identidad como una limitación que C++ nunca intentó cambiar. Me irrita muchísimo dedicar un tiempo similar a sanear implementaciones con herramientas como Coverity/Valgrind para cosas que el compilador podría haber resuelto
    En la época de C++98, con el libro de Bjarne sobre la estructura interna se podía entender bastante bien qué estaba pasando, pero después explotó casi como una industria toda la línea de libros tipo “effective, more effective, proficient, performant C++”, y hasta que aparecieron los LLM tuve que abandonar la idea de poder entender código existente escrito por otros. Me resultó más satisfactorio dedicar ese tiempo a aprender el dominio del problema
    Aun así, como salen figuras que me gustan como Kernighan y Stepanov, sí pienso ver el documental

    • Es un dato poco conocido, pero cuando estaba considerando extender Zortech C a C++, me preocupaba la propiedad intelectual de AT&T, así que contacté a Ryan Williams, abogado de PI de AT&T
      Le pregunté si hacía falta una licencia para crear un compilador de C++, o si debía llamarlo de otra forma en vez de C++, y se rió diciendo que hiciera lo que quisiera; también me agradeció y dijo que yo era la única persona de compiladores que había preguntado. Vi su obituario hace unos años; era buena persona
    • La base del éxito de C++ fue Zortech C++. En ese tiempo, el 90% de la programación se hacía en MS-DOS, y cfront era casi inutilizable en DOS
      Compilar era dolorosamente lento y no soportaba punteros near/far, que eran indispensables para cualquier app no trivial. Zortech C++ resolvió esos problemas y se vendió como pan caliente, creando la masa crítica necesaria para el éxito de C++
      El tráfico de comp.lang.c++ aumentó de golpe, y Borland, al ver nuestras ventas, abandonó su propio producto de lenguaje orientado a objetos y creó Turbo C++. Microsoft también hizo su propio C++ al ver el éxito de Borland
      También le vendimos muchos compiladores Zortech C++ a Microsoft, y con eso desarrollaron COM. También escuché rumores de que Microsoft estaba haciendo su propio C orientado a objetos llamado C*, pero nunca lo confirmé
    • Mucha gente lo pasa por alto, pero es muy posible que C haya sobrevivido gracias a la existencia de C++. Si C++ no hubiera existido, la presión para meterle más funciones al propio C habría sido enorme
      Una de las razones por las que el comité de C pudo resistirse durante tanto tiempo a agregar demasiadas cosas fue que podía señalar a C++ y decir “eso es asunto de ellos, no nuestro”. Sin C++, quién sabe si C habría terminado siendo algún lenguaje con clases, plantillas y lambdas
    • C++98 también es bastante distinto de C++11. El libro de Bjarne sobre C++11 se leía completamente diferente al de la edición 98
    • Respeto muchísimo a Ken Thompson y a las viejas figuras de UNIX, pero me imagino que ellos también reconocerían que el mundo real es desordenado y que la mejor solución en aislamiento no siempre gana
      El C y UNIX que ellos hicieron también vencieron a sistemas más avanzados de LISP y Smalltalk, precisamente porque su implementación era más simple. Incluso su propio sistema operativo más avanzado basado en Plan 9 no logró desplazar a los sistemas tipo Unix, que estaban más extendidos
      Al final, parece que siempre ganan la capacidad de distribución y lo “suficientemente bueno”. Creo que lenguajes dinámicos como Perl, Python, Ruby, JavaScript y PHP, junto con Java fuertemente impulsado por marketing, ofrecieron funciones de alto nivel suficientemente buenas como para que la gente no se fuera a Lisp o Smalltalk
      Desde esa perspectiva, C++ pudo haber sido el medio para montar funciones de alto nivel sobre un lenguaje de bajo nivel y alto rendimiento ya ampliamente adoptado, convirtiéndolo en una tecnología lo bastante buena para una adopción masiva
  • Últimamente trabajo mucho con C++, así que decidí ver el video mientras esperaba que terminara el build. La duración me quedó perfecta y, por suerte, el video también estuvo muy bueno

    • He tratado de leer todo lo posible sobre la historia de C++, y también tengo expectativas con este video. El proceso de evolución de C++ me parece realmente fascinante
    • Me pregunto si esto es solo una broma, o si de verdad el build tarda como una hora. Si es así, eso ya es una locura
  • Personalmente, C++ es el lenguaje más elegante que he usado en unos 15 años. Si eres del tipo “sistematizador” y quieres tener un modelo mental extremadamente preciso, hasta el último bit, de lo que escribiste, no hay nada como C++
    Reconozco las limitaciones e incertidumbres que vienen del compilador y demás, pero aun así lo creo

    • ¿Podrías dar un ejemplo de qué objeto exacto del modelo mental estás hablando?
    • Creo que lo mismo se podría decir de Rust
    • Un lenguaje elegante es uno que logra mucho con muy poco. Forth y Scheme son lenguajes elegantes
      Tienes todo el derecho de disfrutar trabajar con C++, y es cierto que se puede lograr mucho con él, pero probablemente no haya demasiada discusión en que C++ no lo consigue con “muy poco”
  • Me da gusto que Andrei Alexandrescu esté incluido en este documental. Su Modern C++ Design fue un libro que me abrió muchísimo la mente cuando lo leí, y probablemente todavía pueda hacerlo. ¿Alguien lo ha leído?

    • Sus charlas están entre mis favoritas. Es un presentador excelente, muy atrapante y con un gran sentido del humor que sabe aprovechar muy bien
    • Todavía son divertidos, pero los libros de Andrei fueron el golpe final que me fue alejando de C++ durante varios años. Eran libros realmente buenos y, al mismo tiempo, me terminaron de convencer de que quería pasarme a otro lenguaje. En ese momento fue Go
    • De acuerdo. Modern C++ Design probablemente fue el libro de programación del que más saqué en toda mi carrera
    • Me pasó lo mismo. Una vez conocí a Andrei en un meetup en Múnich y, cuando le dije que me había enseñado a pensar, la conversación se puso un poco incómoda. Aun así, la pasé bien
    • Lo leí hace poco. Algunos capítulos me parecieron buenos y, en particular, me resultó interesante cómo las clases de políticas corrigen algunos problemas del diseño orientado a objetos
      Recomiendo resumir cada capítulo con un chatbot de IA y preguntarle cuáles serían sus equivalentes modernos. Algunos modismos ya fueron mejorados, y una sección completa parecía reemplazable por el uso de std::variant y std::visit
  • C++ debería desaparecer. Entiendo que mucha gente ha invertido en él y que una enorme cantidad de código está escrita en C++. Antes era fan y todavía es mi lenguaje principal de trabajo, pero en 2026, con LLMs capaces de encontrar todas las vulnerabilidades y con más atacantes, necesitamos lenguajes donde la seguridad sea la opción por defecto
    C++ es un lenguaje donde, para obtener seguridad, hay que activarla de forma opcional y mantenerse en alerta extrema. No funciona, y décadas de experiencia lo demuestran

    • ¿Entonces con qué debería reemplazarse?
    • Si los LLMs pueden encontrar todas las vulnerabilidades incluso sin el código fuente, ¿no las encontrarían más fácilmente cuando sí lo tienen?
    • C++ fue un gran lenguaje para su época. No había otro más rápido que ofreciera abstracciones tan poderosas. Con C++11, al introducir cosas como shared_ptr, también mostró cuánto puede cambiar un lenguaje
      Adoptó casi todas las ideas, y así aprendimos qué funciona y qué no funciona en el campo de batalla. Podemos conservar RAII, la distinción entre mover y copiar, los smart pointers, placement-new y los genéricos
      En cambio, se pueden desechar auto_ptr, la copia por defecto, cierta forma de implementar excepciones, la herencia virtual múltiple y las plantillas que reemplazan bloques enteros de código. En mi opinión, la pelea ya terminó, y Rust es el mejor resultado de ordenar las cosas que sí funcionaron. Que también haya heredado los tiempos de compilación es un extra
  • Me sorprende que el flujo de desarrollo en C++ siga vigente. Cuando un juego o programa está hecho en C++, normalmente da gusto porque el rendimiento suele estar bastante garantizado, pero si me dijeran que lo use directamente, creo que me pondría a llorar
    Hay demasiado que memorizar y los estándares son demasiado variados. Si voy a mantener un proyecto y resulta ser C++, me desanimo de inmediato. Simplemente es demasiado difícil. Me encanta cuando alguien más lo escribe, pero no es un lenguaje que quiera usar yo mismo

    • Personalmente, no siento que programar en C++ sea tan difícil. La desventaja es que requiere calentar el cerebro, y eso hay que volver a hacerlo en cada proyecto, pero una vez que el volante empieza a girar, escribes código casi sin esfuerzo
      Con cualquier lenguaje hace falta un calentamiento parecido, así que para mí no es muy distinto de usar Python, Go o Java
    • En juegos, C++ se vuelve un lenguaje mucho más simple. Eso es porque las bases de código de juegos normalmente ignoran gran parte de la biblioteca estándar de C++, y con buena razón. Por ejemplo, véase [0]
      Si lo miras sin la biblioteca estándar, C++ está más o menos bien
      El principal problema del ecosistema de C++ es que todo el mundo talla su propio subconjunto del lenguaje. Así que no hay un solo ecosistema, sino varios ecosistemas con estilos incompatibles y distintos subconjuntos del lenguaje o de la biblioteca estándar. Esto hace que la reutilización de código mediante bibliotecas sea mucho más difícil de lo necesario
      [0] https://hftuniversity.com/post/the-c-standard-library-has-be...
    • Es cierto que C++ tiene muchas características. Pero, como ya se dijo en otro lado, la mayoría de los proyectos define sus propias reglas y el subconjunto de funciones que usa
      La gran ventaja de ese conjunto tan amplio es que C++ permite usar buenas abstracciones desde muy bajo nivel hasta muy alto nivel. Puedes hacer cosas de bajo nivel como ensamblador en línea, operaciones de bits y manipulación directa de memoria, y también usarlo a un nivel tan alto que casi parece un lenguaje de scripting. Cualquiera que sea la exigencia del problema, C++ puede hacerse cargo
    • Si conoces solo el 70% del lenguaje, ya puedes usarlo con bastante productividad. Es un error común pensar que C++ solo sirve para áreas como motores de juegos; también es perfectamente válido para aplicaciones
      Además, por la información de tu perfil, si no estás en Corea del Norte, te convendría agregarle un cero a tu tarifa. Así conseguirías clientes más duraderos y de mejor calidad
    • Uno de mis pasatiempos es revolver tiendas de segunda mano para admirar objetos pasados de moda de épocas anteriores, filtrar el desorden moderno mal hecho y alegrarme cuando encuentro herramientas simples y resistentes
      Vivir como programador de C++ se siente exactamente así
  • Cada vez que enseño a desarrolladores web, les digo que el lenguaje de internet no es JavaScript sino C++. Los desarrolladores web no son más que usuarios jugando dentro de programas hechos por desarrolladores de C++

    • Siguiendo esa analogía, los desarrolladores de navegadores no son más que usuarios jugando dentro de programas de C/sistema operativo/kernel
    • Yo suelo ver la web e internet como cosas distintas. Si tuviera que nombrar el lenguaje de la web, probablemente diría HTML
      Qué sería el lenguaje de internet es bastante menos claro
  • Un documental gratuito sobre un tema que me apasiona siempre es algo muy bueno. Gracias
    Eso sí, soy algo raro: no puedo ver documentales hechos con gente diciendo frases cortas una tras otra. Entiendo la intención de “dejar que cuenten la historia”, pero como me distrae, necesito un narrador que me diga qué pensar
    Aun así, les mando cariño a los creadores

  • Me perdí un poco la tendencia, pero hace poco hubo documentales sobre Python, Clojure y probablemente otros lenguajes. ¿Es una serie hecha por la misma gente sobre varios lenguajes? ¿Es coincidencia? ¿O ahora todos los lenguajes de programación están corriendo a hacer su propio documental en video?

  • Chandler Carruth tiene una reflexión interesante sobre este tema: https://hachyderm.io/@chandlerc/116694268329657881

    • Tiene sentido. El video sí parecía acercarse más a una hagiografía, y también sentí que faltaban voces críticas
      Recién en los últimos 10 minutos tocaron un poco críticas comunes como la complejidad creciente o la seguridad de memoria. Aun así, lo disfruté