La 3.ª edición revisada de 『Programming: Principles and Practice Using C++』 de Stroustrup
(stroustrup.com)- La 3.ª edición de 『Programming: Principles and Practice Using C++』 está dirigida principalmente a lectores que aprenden a programar por primera vez, y también puede servir como texto introductorio para quienes ya tienen algo de experiencia y quieren aprender C++ moderno y mejores estilos y técnicas.
- El enfoque central del libro no es memorizar detalles de la sintaxis de C++, sino los principios básicos de programación y las técnicas prácticas, cubriendo programación procedural, orientada a objetos y genérica.
- PPP3 se redujo a aproximadamente la mitad del tamaño de PPP2, reforzando los capítulos básicos que suelen cubrirse en un curso semestral e incorporando C++20, C++23 y código de Graphics/GUI basado en Qt.
- Los capítulos más especializados y el material puramente de referencia se trasladaron a la web para consultarlos cuando se necesiten, siguiendo una tendencia de complementar la información de referencia actualizada con recursos web como cppreference.com.
- Se ofrecen un PDF de muestra, módulos y headers de PPP, código GUI con Qt, diapositivas de clase y guías de estilo de código, por lo que puede usarse tanto en cursos como para autoaprendizaje.
Objetivo del libro y público lector
- 『Programming: Principles and Practice Using C++ (3rd Edition)』, abreviado PPP3, es un libro introductorio para personas sin experiencia en programación.
- Los lectores que ya hayan programado un poco también pueden usarlo para mejorar su estilo y sus técnicas, o para aprender C++ moderno.
- Aunque fue diseñado para clases, también fue escrito pensando en el autoaprendizaje.
- Las ediciones anteriores se usaron en el primer curso de programación para estudiantes de ingeniería eléctrica, ingeniería en computación y ciencias de la computación de Texas A&M University, además de otros lugares.
Forma de enseñar programación
- El libro tiene como objetivo que el lector termine siendo capaz de escribir programas lo suficientemente buenos como para que otras personas puedan usarlos y darles mantenimiento.
- El foco está en los conceptos y técnicas fundamentales más que en detalles menores y específicos del lenguaje.
- No está planteado como una simple introducción al lenguaje C++, sino como una introducción a la programación en general.
- Programación procedural
- Programación orientada a objetos
- Programación genérica
- Junto con técnicas modernas de alto nivel, también cubre técnicas de bajo nivel necesarias para usar el hardware de forma eficiente.
- Proporciona una base para escribir código útil, correcto, seguro en tipos, mantenible y eficiente.
- Cubre ampliamente conceptos esenciales, diseño y técnicas de programación, características del lenguaje y bibliotecas.
Qué cambió en la 3.ª edición
- PPP3 tiene aproximadamente la mitad del tamaño de PPP2.
- Se redujo el volumen reforzando los capítulos básicos que normalmente se cubren en un curso semestral.
- Aprovecha partes clave de C++20 y C++23.
- El código de los capítulos de Graphics/GUI se rehízo sobre Qt, considerando la portabilidad a entornos como navegadores y teléfonos.
- Los capítulos más especializados, llamados “broadening the view” en PPP2, se colocaron en la web para usarlos cuando haga falta.
- Se eliminó el material puramente de referencia.
- En la web se puede encontrar material más abundante y actualizado; se menciona cppreference.com como ejemplo.
Estándar de C++ y alcance de las bibliotecas
- El libro usa C++20 y C++23.
- Trata el diseño y uso de tipos integrados y tipos definidos por el usuario.
- Entrada
- Salida
- Cálculo
- Gráficos/GUI simples
- También incluye una introducción a los contenedores y algoritmos de la biblioteca estándar de C++.
Material de muestra publicado
- Preface: trata lo que el libro promete y lo que no promete.
- Table of Contents: PDF con el índice.
- Chapter 0: Notes to the Reader: guía sobre el enfoque del libro.
- Chapter 10: A Display Model: capítulo de muestra.
- A los principiantes absolutos les conviene no leerlo todavía.
- Es un capítulo pensado para mostrar a docentes y lectores con experiencia el nivel al que llega el libro hacia la semana 5, asumiendo un ritmo de 2 capítulos por semana.
- También busca mostrar parte de C++ moderno.
Material de apoyo y código
- Links: enlaces a implementaciones de C++ y entornos de desarrollo, con consejos sencillos para empezar.
- How to use modules?: incluye cómo compilar module PPP usando
PPP_support.h. - module PPP: módulo PPP para usar cuando se pueden utilizar módulos.
- header "PPP.h": header para usar
stdy el móduloPPPde la forma más sencilla. - header "PPPheaders.h": header para usar cuando hay que volver al uso de archivos header.
- GUI support: incluye la biblioteca de interfaz de usuario Graphics/GUI para los capítulos 10 al 14 de PPP3.
- Para ejecutarlo, es necesario instalar Qt.
- También se ofrece The User Manual.
- Sample code from the various chapters: código de muestra de varios capítulos, marcado como TBD.
- Errata: fe de erratas.
- Lectures based on PPP: diapositivas de clase actualizadas para PPP3.
- PPP Coding Style Guide
- Exercise Material: marcado como TBD.
Capítulos de PPP2 que siguen en la web
- Algunos capítulos de PPP2 fueron escritos usando C++14, pero siguen siendo correctos y presentan razonablemente bien esos temas.
- Material de PPP2 disponible:
Estado de las traducciones
- PPP3 todavía no tiene traducciones.
- Las traducciones de la edición anterior pueden consultarse en la book covers page.
1 comentarios
Opiniones de Hacker News
Me parece bastante problemático que el “primer programa clásico” de este libro use
import std;desde la primera línea. Hasta donde sé, salvo quizá MSVC, ningún compilador lo soporta bien de forma predeterminada.En Debian, ni siquiera con
g++ --std=c++23 -fmodules-tsfunciona, y si uno mira https://en.cppreference.com/w/cpp/23, la propuesta relacionada es P2465R3, pero clang++ 17 también aparece con “soporte parcial”. Incluso instalandoclang++17, salemodule 'std' not found.Entiendo que
import std;es una función muy nueva, pero este libro es para principiantes en C++, y me pregunto cómo reaccionaría un novato promedio. También vi el mismo problema cuando leí “Tour of C++” hace uno o dos años.g++da exactamente el mismo error y la misma indicación.No leí la edición más reciente de Stroustrup de la que se habla ahora, pero sí leí una edición anterior en la época en que usaba C++ todos los días. Incluso 20 años después sigo prefiriendo Accelerated C++, de Koenig y Moo. Puede que desde entonces hayan salido libros mejores, pero no los he leído.
Según recuerdo, el Hello World de ese libro era algo como
#include,int main(),std::cout << "Hello, world!" << std::endl;, y aun hoy en Arch Linux se compila cong++ a.cppy al ejecutar./a.outfunciona tal cual.Todo el libro tenía una estructura excelente para imitar un estilo moderno de C++, simple y limpio, casi como pseudocódigo, sin aritmética de punteros de C. Se parecía también a la sensación prolija del Python temprano, aunque en Python no aparecieron elementos de ese tipo hasta que más tarde pandas empezó a traer bibliotecas contenedoras de C++ como numpy y scipy.
En el trabajo casi nunca vi código C++ limpio. No trabajé en FAANG, y en prototipos rápidos las revisiones de código también eran raras, así que no sé qué tan extendida está la enseñanza al estilo Koenig y Moo fuera del mundo greenfield que me tocó. Campos como la radioterapia, donde no quieren convertirse en el próximo Therac-25, podrían ser la excepción.
Por eso, por ahora hay que escribir primero el archivo de módulo adecuado para que
importfuncione. Dicho eso, no creo que la actualización de la biblioteca estándar de C++ en GCC vaya a tardar demasiado, así que más adelante probablemente se pueda usar este nuevo libro directamente tal como está.Para alguien que ya conoce C++ antiguo y solo quiere actualizar sus conocimientos, escribir ese archivo de módulo por cuenta propia también podría ser una buena experiencia de aprendizaje.
g++del ejemplo termine funcionando algún día mediante un tratamiento especial del compilador, si alguien envía un parche a GCC.En general, salvo ejemplos de investigación, encadenar llamadas directas a
g++ya no es una forma realista de trabajar. Otros lenguajes compilados tampoco se manejan tocando directamentegccgo,rustcojavac, sino usando sistemas como gobuild, cargo o Maven.https://www.kitware.com/import-std-in-cmake-3-30/
En el capítulo de GUI cambió de FLTK a Qt. Como Qt se usa mucho en la industria, es un cambio bastante grande y probablemente reciba una buena reacción, aunque no sé cómo cambiará la curva de aprendizaje.
Me pregunto si fue porque es multiplataforma o porque en el código con el que se entrenaron estos modelos hay más ejemplos de uso de SFML. SFML parece relativamente más reciente que Qt o FLTK, así que sería raro que hubiera más datos de entrenamiento; también es curioso que los cuatro coincidieran en proponer SFML para gráficos en C++.
Lo que me gusta del código de Stroustrup es
using namespace std;. La convención de ponerstd::delante de todo, comostd::every std::last std::bloody std::thing, vuelve loco a cualquiera.using namespacede ningún espacio de nombres. Justamente porque así se crean los choques de nombres que los espacios de nombres existen para evitar.Incluso en archivos de implementación, personalmente no me gusta
using namespace std;. Creo que reduce la legibilidad del código, y como el contenido destd::es enorme y sigue creciendo, prefiero evitar directamente la posibilidad de choques de nombres.El código se escribe una vez pero se lee muchas veces, así que elegir nombres cortos, incluso incluyendo el espacio de nombres, me parece una mala decisión en términos de eficiencia.
stden sí, lo feo es el doble dos puntos::. Nunca entendí por qué no pudieron usar simplemente un punto, como otros lenguajes.Hace más de 10 años que no uso C++, pero recuerdo haber estudiado muy a fondo una edición anterior de este libro. Eso fue incluso después de haber usado C++ para casi el 99% de todo durante 4 años en la universidad
Es un libro realmente bueno. Si te tomas el tiempo de entender bien el C++ del libro, hasta da un poco de tristeza ver por qué el mundo le tenía tanto miedo a C++
Claro que después me encontré con montones de personas que escribían código C++ horrible sin haber leído nunca un libro así
Extraño la época en que trabajaba con C++. Se siente como si hubiera bajado a capas más profundas del stack de desarrollo que antes. Antes manejábamos UI, parseo de API y casi todo en C++
No diría que era perfecto, pero el trabajo era divertido, y era un gusto estar con gente de alto nivel capaz de trabajar en ese stack. No hubo almuerzo más emocionante que cuando pusimos
distcca correr en servidores blade para acelerar muchísimo los builds. También era agradable no ser el único usuario entusiasta de LinuxDurante el último año terminé la mayor parte de la 2.ª edición. Es un libro excelente y me ayudó a superar varias barreras mentales con las que me había topado durante años en programación
La razón principal por la que esta edición es más corta es que se eliminó la Part IV: Broadening the View. Esa parte cubría temas adicionales como procesamiento de texto, cálculo numérico y sistemas embebidos, y ahora está disponible en línea. Esos capítulos siguen siendo relevantes y usan C++11/14, así que no se actualizaron desde la 2.ª edición
También comparto C++ Annotations, un libro que se mantiene actualizado con C++ moderno: http://www.icce.rug.nl/documents/cplusplus/
autosería un enfoque bastante razonableUna vez escuché que C++ tiene cuatro componentes. El primero es “C”; el segundo, la orientación a objetos; el tercero, productividad y flexibilidad como la STL y los templates; y el último, cosas para situaciones especiales como
volatileyasm. Él recomendaba usar el 1 con cuidado y evitar las situaciones en las que hiciera falta usar el 4; me pregunto si eso tiene sentidoPensé que sería un ladrillo más grueso, pero sorprendentemente se redujo a la mitad
La 2.ª edición tenía 1312 páginas en paperback y pesaba 4.81 libras; la 3.ª edición tiene 656 páginas en paperback y pesa 2.71 libras
Dice que la 3.ª edición de “Programming: Principles and Practice Using C++” tiene aproximadamente la mitad del tamaño de la 2.ª edición, y que los estudiantes que tengan que cargar el libro agradecerán el menor peso. También dice que la razón de la reducción es que hay más información sobre C++ y la biblioteca estándar en la web
Me pregunto por qué Bjarne a veces pone un espacio después de
#includey a veces nohttps://www.stroustrup.com/PPPheaders.h
Me entusiasma mucho que haya salido una nueva versión. Aunque no te interese C++ o ya seas un programador experimentado, vale la pena leer este libro
Hasta donde sé, es uno de los mejores ejemplos de escritura técnica y enseñanza de programación informática