1 pontos por GN⁺ 2024-04-20 | 1 comentários | Compartilhar no WhatsApp
  • 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

Capítulos do PPP2 que permanecem na web

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

 
GN⁺ 2024-04-20
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ão
    No Debian, g++ --std=c++23 -fmodules-ts també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 instalando clang++17, aparece module 'std' not found
    Entendo 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 anos

    • Boa observação, e eu passei pela mesma coisa. Meu g++ também mostra exatamente o mesmo erro e orientação
      Nã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 com g++ a.cpp e rodar ./a.out, funciona exatamente assim
      O 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
    • A documentação atual do GCC 13.2.1 diz que a biblioteca padrão não é fornecida como unidades de cabeçalho importáveis. Para importar essas unidades, primeiro é preciso compilá-las explicitamente, e, se não tomar cuidado, o mecanismo de módulos pode acabar gerando declarações duplicadas que precisam ser mescladas, fazendo o uso de recursos do compilador depender da forma como os arquivos de cabeçalho foram divididos
      Então, por enquanto, é preciso escrever antes um arquivo de módulo adequado para que import funcione. 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ção
      Para 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
    • Hoje em dia, não é realista manter um programa C++ minimamente interessante sem um sistema de build. Mesmo assim, é bem possível que a chamada de g++ citada no exemplo um dia passe a funcionar via tratamento especial do compilador, caso alguém envie um patch para o GCC
      Em 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 em gccgo, rustc ou javac
      https://www.kitware.com/import-std-in-cmake-3-30/
    • Este documento referenciado na página do livro talvez ajude com a questão dos módulos: https://www.stroustrup.com/module_use.html
  • 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 curioso para saber o que Stroustrup acha do Meta Object Compiler. Em certo sentido, Qt parece um dialeto próprio de C++
    • Vejo isso como uma melhora, já que o Qt tem o Qt Creator
    • Como usam uma biblioteca wrapper personalizada, não sei o quanto do Qt de fato fica exposto
    • Pedi aos 4 assistentes de programação com IA que já usei (claude3, gemini, gpt4, deepseek) para escreverem boids e Game of Life em C++, e todos usaram SFML para os gráficos
      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 colocar std:: na frente de std::every std::last std::bloody std::thing enlouquece qualquer um

    • Depende do caso. Em arquivos de cabeçalho, nunca se deve colocar using namespace de namespace nenhum, porque isso cria exatamente os conflitos de nomes que os namespaces existem para evitar
      Mesmo em arquivos de implementação, pessoalmente não gosto de using namespace std;. Acho que piora a legibilidade, e como o conteúdo de std:: é grande e continua crescendo, prefiro evitar a própria possibilidade de conflito de nomes
      Có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
    • Não ter conflito de nomes é ótimo. Mas de algum jeito outras linguagens resolveram esse problema
    • Tenho a impressão de que, quando os módulos de C++ estiverem bem estabelecidos, isso vai deixar de ser um tema de discussão
    • Mais do que std, o que é horrível é o dois-pontos duplo ::. Nunca entendi por que não puderam usar só um ponto, como nas outras linguagens
    • Parece alguém que aprendeu a programar no Windows
  • Faz 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++

    • Por um tempo senti falta de Fortran, mas bastou escrever por uns 30 minutos para isso passar na hora. Tente fazer parsing de JSON em C++ e veja se a saudade sobrevive ao processo
    • Eu também sinto muita falta. Nem faz tanto tempo assim, mas havia apps em que cliente e servidor eram ambos em C++, e UI, API, tudo era C++. Parecia mesmo que a linguagem de uso geral tinha finalmente chegado
      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 distcc para rodar em servidores blade e aceleramos muito as builds. Também era legal não ser o único usuário fanático por Linux
    • Na nossa empresa, quase tudo é C++, exceto a UI. Acho que a única razão de a UI não ser em C++ é deixar pelo menos uma parte da base de código em que recém-formados possam começar a trabalhar antes de passarem pelo treinamento em C++
    • Ainda mexo num motor de jogo como projeto pessoal para matar a vontade de C++. Apesar de todas as críticas, eu realmente gosto de usar C++
    • Só queria não trabalhar com Python
  • Ao 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/

    • Fico pensando se, para um projeto de emulador, uma abordagem de C com classes mais smart pointers e auto já seria bem razoável
      Uma 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 volatile e asm. 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 sentido
    • Dá 404
  • Achei 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

    • Pelo prefácio, parece que tiraram uma parte considerável do material de referência do livro e a transferiram para a documentação de C++ na internet
      “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
    • Gostei de ver conhecimento de C++ sendo medido em libras
    • Literalmente ficou com exatamente a metade. Fico me perguntando se escolheram uma fonte menor
  • Fico pensando por que Bjarne às vezes coloca espaço depois de #include e às vezes não
    https://www.stroustrup.com/PPPheaders.h

    • Se misturou headers digitados à mão com headers inseridos automaticamente pela IDE, e ainda tinha alguma configuração recolhendo imports por padrão ou deixou de rodar o clang-format ao salvar, isso pode passar batido
  • 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