3ª edição revisada de “Programming: Principles and Practice Using C++”, de Stroustrup
(stroustrup.com)- A 3ª edição de “Programming: Principles and Practice Using C++” tem como público principal leitores que estão aprendendo programação pela primeira vez, mas também pode ser usada por leitores com alguma experiência como uma introdução para aprender C++ moderno e melhores estilos e técnicas
- O foco do livro não é memorizar detalhes da sintaxe de C++, mas sim princípios fundamentais de programação e técnicas práticas, abordando programação procedural, orientada a objetos e genérica
- O PPP3 ficou com cerca de metade do tamanho do PPP2, reforçando os capítulos básicos usados em um curso de um semestre e refletindo C++20/C++23 e código de Graphics/GUI baseado em Qt
- Capítulos mais especializados e materiais puramente de referência foram movidos para a web, para consulta quando necessário; informações de referência atualizadas são complementadas por recursos online como cppreference.com
- São oferecidos PDF de amostra, módulos e headers do PPP, código de GUI em Qt, slides de aulas, guia de estilo de codificação e outros materiais, úteis tanto para aulas quanto para autoestudo
Objetivo do livro e público-alvo
- “Programming: Principles and Practice Using C++ (3rd Edition)”, abreviado como PPP3, é um livro introdutório para pessoas sem experiência em programação
- Leitores que já programaram um pouco também podem usá-lo como material para melhorar estilo e técnicas ou aprender C++ moderno
- Foi projetado para uso em sala de aula, mas também escrito com autoestudo em mente
- Edições anteriores foram usadas no primeiro curso de programação para alunos de engenharia elétrica, engenharia da computação e ciência da computação da Texas A&M University, além de vários outros lugares
Forma de ensinar programação
- O objetivo do livro é fazer com que o leitor acabe escrevendo programas bons o suficiente para serem usados e mantidos por outras pessoas
- O foco está em conceitos e técnicas fundamentais, mais do que em detalhes periféricos de tecnologia da linguagem
- Ele não é apenas uma introdução à linguagem C++, mas uma introdução à programação em geral
- Programação procedural
- Programação orientada a objetos
- Programação genérica
- Além de técnicas modernas de alto nível, também aborda técnicas de baixo nível necessárias para usar o hardware de forma eficiente
- Fornece uma base para escrever código útil, correto, type-safe, manutenível e eficiente
- Abrange de forma ampla conceitos essenciais, técnicas de projeto e programação, recursos da linguagem e bibliotecas
O que mudou na 3ª edição
- O PPP3 tem cerca de metade do tamanho do PPP2
- A redução de volume veio com o reforço dos capítulos básicos normalmente cobertos em um curso de um semestre
- Usa partes centrais de C++20 e C++23
- O código dos capítulos de Graphics/GUI foi reorganizado com base em Qt, considerando portabilidade para ambientes como navegadores e celulares
- Capítulos mais especializados, chamados no PPP2 de “broadening the view”, foram colocados na web para serem usados quando necessário
- Materiais puramente de referência foram removidos
- Há mais materiais, e mais atualizados, disponíveis na web; cppreference.com é citado como exemplo
Escopo dos padrões C++ e da biblioteca
- O livro usa C++20 e C++23
- Aborda o projeto e o uso de tipos embutidos e tipos definidos pelo usuário
- Entrada
- Saída
- Cálculo
- Gráficos/GUI simples
- Também inclui uma introdução a contêineres e algoritmos da biblioteca padrão de C++
Materiais de amostra publicados
- Preface: aborda o que o livro promete e o que não promete
- Table of Contents: PDF do sumário
- Chapter 0: Notes to the Reader: guia sobre a abordagem do livro
- Chapter 10: A Display Model: capítulo de amostra
- Iniciantes absolutos provavelmente ainda não deveriam lê-lo
- É um capítulo destinado a mostrar a professores e leitores experientes o nível que o livro alcança por volta da 5ª semana, considerando 2 capítulos por semana
- Também tem o objetivo de mostrar parte do C++ moderno
Materiais de apoio e código
- Links: links para implementações de C++ e ambientes de desenvolvimento, além de conselhos simples para começar
- How to use modules?: inclui como compilar o module PPP usando
PPP_support.h - module PPP: módulo PPP usado quando módulos estão disponíveis
- header "PPP.h": header para usar
stde o móduloPPPda forma mais fácil - header "PPPheaders.h": header usado quando for necessário voltar ao uso de arquivos de header
- GUI support: inclui a biblioteca de interface de usuário Graphics/GUI dos capítulos 10 a 14 do PPP3
- Para executar, é necessário instalar o Qt
- The User Manual também é fornecido
- Sample code from the various chapters: código de amostra de vários capítulos, marcado como TBD
- Errata: errata
- Lectures based on PPP: slides de aulas atualizados para o PPP3
- PPP Coding Style Guide
- Exercise Material: marcado como TBD
Capítulos do PPP2 que permanecem na web
- Alguns capítulos do PPP2 foram escritos usando C++14, mas ainda são corretos e apresentam razoavelmente seus respectivos temas
- Materiais do PPP2 disponíveis:
Status das traduções
- Ainda não há uma versão traduzida do PPP3
- Traduções de edições anteriores podem ser conferidas na book covers page
1 comentários
Comentários do Hacker News
Acho bem problemático que o “primeiro programa clássico” deste livro use
import std;já na primeira linha. Pelo que sei, tirando talvez o MSVC, nenhum compilador dá suporte direito a isso na configuração padrãoNo Debian,
g++ --std=c++23 -fmodules-tstambém não funciona, e em https://en.cppreference.com/w/cpp/23 a proposta relacionada é a P2465R3, mas até o clang++ 17 está com “suporte parcial”. Mesmo instalandoclang++17, aparecemodule 'std' not foundEntendo que
import std;é um recurso muito novo, mas este livro é para iniciantes em C++, então fico imaginando como um iniciante médio reagiria. Vi o mesmo problema quando li “Tour of C++” há 1 ou 2 anosg++também mostra exatamente o mesmo erro e orientaçãoNão li esta edição mais recente do Stroustrup que está sendo discutida agora, mas li as edições antigas quando usava C++ todos os dias. Mesmo passados 20 anos, ainda prefiro Accelerated C++, de Koenig e Moo. Talvez tenham saído livros melhores depois, mas não cheguei a lê-los
Se bem me lembro, o Hello World desse livro era algo como
#include,int main(),std::cout << "Hello, world!" << std::endl;, e mesmo hoje no Arch Linux, se eu compilar comg++ a.cppe rodar./a.out, funciona exatamente assimO livro inteiro tinha uma estrutura excelente, imitando um estilo de C++ moderno simples e limpo, quase como pseudocódigo, sem aritmética de ponteiros em C. Tinha até uma semelhança com a sensação enxuta do Python inicial, embora no lado do Python isso tenha mudado depois que pandas passou a puxar bibliotecas de wrapping em C++ como numpy e scipy
Na prática profissional, quase nunca vi código C++ limpo. Não trabalhei em FAANG, e em protótipos rápidos revisão de código também é rara, então não sei o quanto essa orientação no estilo de Koenig e Moo se espalhou fora do mundo greenfield que eu vivi. Lugares como radioterapia, onde se tenta evitar virar o próximo Therac-25, talvez sejam uma exceção
Então, por enquanto, é preciso escrever antes um arquivo de módulo adequado para que
importfuncione. Ainda assim, não parece que a atualização da biblioteca padrão de C++ no GCC vá demorar tanto, então mais adiante talvez dê para usar este livro novo diretamente, sem adaptaçãoPara quem já conhece C++ antigo e só quer atualizar o conhecimento, escrever esse arquivo de módulo por conta própria pode até ser uma boa experiência de aprendizado
g++citada no exemplo um dia passe a funcionar via tratamento especial do compilador, caso alguém envie um patch para o GCCEm geral, tirando exemplos de pesquisa, montar chamadas diretas de
g++já não é mais algo realista. Em outras linguagens compiladas também se usa sistemas como gobuild, cargo e Maven, em vez de mexer diretamente emgccgo,rustcoujavachttps://www.kitware.com/import-std-in-cmake-3-30/
No capítulo de GUI, trocaram FLTK por Qt. É uma mudança bem grande, e como o Qt é amplamente usado na indústria, isso provavelmente vai ser bem recebido, mas não sei como a curva de aprendizado muda
Fico pensando se é por ser multiplataforma, ou se esses modelos viram mais exemplos de uso de SFML no código com que foram treinados. SFML parece relativamente mais recente do que Qt ou FLTK, então seria estranho haver mais dados de treino sobre ele, e também é curioso que os 4 tenham concordado em usar SFML para gráficos em C++
O que gosto no código do Stroustrup é o
using namespace std;. Essa convenção de colocarstd::na frente destd::every std::last std::bloody std::thingenlouquece qualquer umusing namespacede namespace nenhum, porque isso cria exatamente os conflitos de nomes que os namespaces existem para evitarMesmo em arquivos de implementação, pessoalmente não gosto de
using namespace std;. Acho que piora a legibilidade, e como o conteúdo destd::é grande e continua crescendo, prefiro evitar a própria possibilidade de conflito de nomesCódigo é escrito uma vez e lido várias, então escolher nomes curtos incluindo o namespace me parece uma decisão ruim em termos de eficiência
std, o que é horrível é o dois-pontos duplo::. Nunca entendi por que não puderam usar só um ponto, como nas outras linguagensFaz mais de 10 anos que não uso C++, mas lembro de ter estudado bem a fundo uma edição anterior deste livro. Isso foi mesmo depois de passar 4 anos na faculdade usando C++ em quase 99% do tempo
É um livro realmente excelente. Se você dedicar tempo para entender direito o C++ apresentado nele, chega a dar uma certa tristeza perceber por que o mundo acabou ficando tão assustado com C++
Claro, depois disso acabei encontrando um monte de gente que nunca leu um livro assim e escrevia um código em C++ horrível
Sinto falta da época em que trabalhava com C++. Parece que eu atuava em camadas mais baixas da stack de desenvolvimento do que hoje. Antes eu fazia UI, parsing de API, praticamente tudo em C++
Não vou dizer que era perfeito, mas o trabalho era divertido, e era ótimo estar com gente muito qualificada que conseguia trabalhar naquela stack. Nunca houve horário de almoço mais empolgante do que quando colocamos
distccpara rodar em servidores blade e aceleramos muito as builds. Também era legal não ser o único usuário fanático por LinuxAo longo do último ano, terminei a maior parte da 2ª edição. É um livro realmente excelente e me ajudou a superar várias barreiras mentais com as quais esbarrei durante anos programando
A principal razão de esta edição ter encolhido é a remoção da Parte IV: Broadening the View. Essa seção, que tratava de temas adicionais como processamento de texto, computação numérica e sistemas embarcados, agora está disponível online. Esses capítulos continuam relevantes e usam C++11/14, então não foram atualizados nesta 2ª edição
Também compartilho C++ Annotations, um livro que continua sendo atualizado para C++ moderno: http://www.icce.rug.nl/documents/cplusplus/
autojá seria bem razoávelUma vez ouvi dizer que C++ tem quatro componentes. O primeiro seria “C”, o segundo orientação a objetos, o terceiro produtividade e flexibilidade com coisas como STL e templates, e o último seria para situações especiais, como
volatileeasm. A recomendação era usar o item 1 com cuidado e evitar cair em situações em que fosse preciso usar o item 4, e fico pensando se isso faz sentidoAchei que viraria um calhamaço ainda maior, mas surpreendentemente ficou com metade do tamanho
A 2ª edição em paperback tinha 1312 páginas e pesava 4,81 libras, enquanto a 3ª edição em paperback tem 656 páginas e pesa 2,71 libras
“Programming: Principles and Practice Using C++” 3ª edição tem cerca de metade do tamanho da 2ª edição, e os estudantes que precisam carregar o livro vão gostar do peso menor. O motivo da redução, segundo o texto, é que hoje há mais informação sobre C++ e a biblioteca padrão na web
Fico pensando por que Bjarne às vezes coloca espaço depois de
#includee às vezes nãohttps://www.stroustrup.com/PPPheaders.h
Estou realmente animado por ter saído uma nova versão. Mesmo para quem não tem interesse em C++ ou já é um programador experiente, este livro vale a leitura
Até onde eu sei, é um dos melhores exemplos de escrita técnica e de ensino de programação de computadores