5 pontos por GN⁺ 4 시간 전 | 1 comentários | Compartilhar no WhatsApp
  • Um documentário que resume em uma única obra os 40 anos de história do C++, desde o início no Bell Labs até a adoção global e o crescimento atual, com a participação de pessoas que estiveram envolvidas na história do C++, na padronização e no ecossistema de ferramentas
  • C++ começou como C with Classes, criado por Bjarne Stroustrup no Bell Labs para combinar o controle de hardware do C com a abstração orientada a objetos do Simula, e cresceu como uma linguagem de abstração eficiente para sistemas de grande porte
  • A implementação inicial, CFront, convertia C++ em código C, permitindo usar a infraestrutura e as bibliotecas existentes de C sem mudanças, e à medida que os usuários aumentaram após 1983, compatibilidade se tornou um desafio central
  • A padronização ANSI/ISO, iniciada sob pressão de IBM, HP e Sun, impediu a fragmentação entre implementações de diferentes fornecedores, e o padrão de 1997 incluiu namespace, exception, template e STL
  • No começo dos anos 2000, Java e C#, o estouro da bolha ponto-com e o rápido aumento do desempenho das CPUs trouxeram o inverno do C++, mas por volta de 2004 a escalabilidade de frequência parou, o paralelismo se tornou crucial e o C++11 criou um renascimento
  • Hoje, o C++ é usado no CERN, em jogos, finanças, IA e HPC com CUDA, sistemas embarcados e muito mais, enquanto segurança de memória, complexidade, tamanho do comitê de padronização e falta de financiamento continuam sendo desafios centrais

C with Classes, nascido no Bell Labs

  • O C++ é uma linguagem com mais de 40 anos e, quando foi criada, não existiam ferramentas como editor com recursos modernos, destaque de sintaxe, navegação de código, autocompletar ou refatoração, e muitos desenvolvedores usavam BASIC ou assembly diferente para cada chip
  • Em uma época em que programas maiores e mais complexos estavam se tornando necessários, Bjarne Stroustrup tentou construir sistemas distribuídos no Bell Labs, e para lidar com elementos como drivers de dispositivo, interfaces de rede, gerenciadores de memória e processos era necessário uma linguagem de baixo nível
  • O C permitia controle total do hardware e era adequado para programação de sistemas, mas à medida que os programas cresciam, faltavam meios para expressar estruturas como módulos, canais de comunicação e protocolos
  • Stroustrup gostava da forte segurança de tipos do Simula, dos tipos definidos pelo usuário, classes e hierarquias de classes, que havia usado em Cambridge, mas considerava que o Simula era lento demais e consumia muita memória
  • Por isso, criou o C with Classes colocando os recursos básicos do Simula dentro do C e, ao longo de quase 40 anos, o C++ evoluiu na direção de conseguir fazer tudo o que Simula e C podiam fazer

CFront, o nome e a expansão inicial

  • O C with Classes foi criado inicialmente na forma de um pré-processador de C e, quando outras pessoas começaram a usá-lo, Stroustrup concluiu que a diferença em relação ao C ainda não era suficiente e investiu um ano em melhorar o compilador e a linguagem
  • O CFront não gerava código de máquina com um backend tradicional; ele compilava para código C, permitindo que usuários de C++ mantivessem o ambiente C existente sem precisar adotar uma nova infraestrutura ou novas bibliotecas por completo
  • O CFront foi criado em 1983 e era um compilador de fato, realizando análise léxica, análise sintática, verificação de tipos, geração de representação em árvore e otimização da árvore
  • O nome C++ veio do fato de que o operador ++ em C significa incremento; semanticamente ++C faria mais sentido, mas C++ foi escolhido por conveniência de indexação e referência
  • A AT&T tentou vender compiladores C++ ao entrar no negócio de computadores e software, mas o hardware não vendeu o suficiente, e as implementações iniciais de C++ puderam na prática ser distribuídas amplamente por causa do custo de fita e de taxas comerciais muito baixas
  • Por um tempo, Stroustrup cuidou sozinho da documentação, do compilador, da implementação da linguagem e do help desk, e o investimento da AT&T era muito pequeno; em certa ocasião, foram destinados US$ 5.000 para três anos de difusão de uma linguagem de programação de uso geral
  • No CFront 2.0 foi encontrado um bug no tratamento de herança múltipla, e como um recurso central já prometido poderia quebrar de um jeito impossível de corrigir depois de chegar ao campo, uma versão corrigida foi produzida e distribuída em poucos dias
  • Como era preciso manter o mesmo número de release, a versão foi distribuída como 2.0.0 em vez de 2.0.1, e compatibilidade se tornou uma exigência tão dominante que era chamada em tom de piada de “a palavra com C”

Padronização e STL

  • O C++ era uma ferramenta para aumentar a produtividade dentro da AT&T, mas não poderia ter sucesso se ficasse preso a uma única empresa; eram necessários desenvolvedores externos e um ecossistema de bibliotecas
  • Antes da web, grupos como comp.lang.c++ na Usenet e revistas de informática como Byte eram os canais de disseminação de informação, e Stroustrup divulgava a linguagem com palestras em várias empresas e organizações no fim dos anos 1980
  • O uso cresceu sem campanhas publicitárias ou um grande patrocinador, mas vários fornecedores como Borland, Microsoft, IBM e Sun criaram suas próprias implementações de C++ e seus próprios designs de template, o que fragmentou seriamente a compatibilidade do código
  • Representantes de IBM, HP e Sun pediram a Stroustrup a padronização do C++ sob as regras da ANSI, e Stroustrup considerava isso cedo demais, mas acabou decidindo um ano depois criar um documento-base para a padronização
  • O Annotated Reference Manual, ou ARM, tornou-se o documento de entrada para a padronização, abrindo caminho para recursos como template, exception e namespace
  • O padrão foi definido como um contrato entre quem escreve código C++ e a implementação de C++, tornando-se o mecanismo que faz diferentes fornecedores aceitarem o mesmo código com o mesmo significado
  • A STL, criada por Alexander Stepanov, tinha como ideia central fazer algoritmos funcionarem sobre todas as estruturas de dados aplicáveis e permitir que essas estruturas pudessem alimentar umas às outras com dados
  • Antes da STL, cada um criava seu próprio modo de lidar com array, list, tree, container e algoritmos, mas a STL apresentou uma única forma poderosa de definir algoritmos e containers
  • A proposta da STL enfrentou oposição por ser grande demais e ter chegado tarde demais para o cronograma da padronização, e grandes empresas como a Microsoft também se opuseram, mas após apresentações e discussões cerca de 80% do comitê votou a favor e ela entrou no padrão
  • O C++ foi padronizado em novembro de 1997, e namespace, exception, template e a Standard Template Library foram adicionados como recursos básicos centrais
  • O LLVM começou depois dessa padronização, então pôde usar os novos recursos da forma pretendida sem o peso de migrar código anterior

O inverno e o renascimento do C++11

  • Nos anos 1990, o C++ se tornou uma linguagem que mudou o desenvolvimento centrado em Fortran em áreas como software e computação de física de altas energias no CERN, e bibliotecas e códigos existentes foram portados para C++ ou refeitos para C++
  • No desenvolvimento de jogos, à medida que placas de vídeo e APIs assumiram o trabalho de baixo nível, surgiu um movimento de subida de C e assembly para C++, e o C++ passou a ser usado em ecossistemas de engines como a Unreal
  • Em finanças, com o surgimento do trading algorítmico e do high-frequency trading, a latência em microssegundos se tornou importante, e o C++ passou a ser usado como linguagem capaz de alcançar baixa latência sem exigir micro-otimização linha por linha
  • Com o estouro da bolha ponto-com em 2000, Java ascendeu com o forte marketing da Sun como “a linguagem do futuro” e “a linguagem da internet”, e Java surgiu como uma reação explícita à complexidade do C++
  • Dentro da Microsoft, havia o desejo de combinar o desenvolvimento fácil baseado em formulários do Visual Basic com o desempenho e a expressividade do C++, e disso nasceu o C#
  • Entre 2000 e 2005 não houve apenas estagnação, mas um declínio do C++; como a frequência das CPUs continuava aumentando, muitos designers de linguagens e desenvolvedores passaram a considerar desempenho algo menos importante
  • Por volta de 2004, a escalabilidade de frequência dos processadores terminou, apareceram os limites de desempenho e energia de um único núcleo e os ganhos marginais do paralelismo em nível de instrução diminuíram, encerrando a era em que o hardware acelerava automaticamente os programas
  • Multicore e paralelismo se tornaram importantes, mas o padrão C++ da época não tinha nenhum suporte a threading, e o e-mail de Herb Sutter “C++ multi-threading: is the standardization committee listening” destacou esse problema
  • O C++0X começou em 2002 e tinha como meta ser concluído entre 2007 e 2009, mas foi sendo adiado repetidamente para incluir mais recursos importantes e acabou levando 13 anos
  • O C++11 introduziu move semantics, concurrency, auto, range-based for loop, smart pointer, lambda e constexpr, tornando-se o primeiro padrão da família de linguagens C a tratar oficialmente de threading
  • O C++11 foi um renascimento, com a combinação entre recursos de linguagem mais fáceis e seguros e a necessidade de extrair o máximo do desempenho do hardware
  • Depois disso, foi adotado o train model para lançar padrões em datas definidas, e o comitê escolheu um ciclo de três anos em vez de dois
  • O C++14 foi um release pequeno com o que não entrou no C++11 e correções de bugs, e C++17 e C++23 adicionaram muitos recursos à linguagem e à biblioteca padrão

Escala e desafios atuais

  • A complexidade do C++ continuou crescendo, e a linguagem recebeu críticas por ter várias formas de inicializar variáveis e por uma “complexidade difícil de entender”
  • O comitê de padronização também cresceu e chegou a 527 membros, levantando a preocupação de que hoje existam tantos comitês e presidentes quanto havia membros no início
  • No design da linguagem, adicionar é possível, mas remover é quase impossível, então a questão importante muitas vezes deixa de ser o que incluir e passa a ser quando dizer não
  • O C++ é usado em geração de energia, turbinas eólicas, panelas elétricas de arroz, pistas de boliche, filmes de Hollywood, automóveis, finanças, câmeras e muitos outros lugares, levando à expressão de que ele está “praticamente em todo lugar”
  • A base de código C++ da HRT tem mais de 1 milhão de linhas e 15.000 arquivos, e somente em 2025 cerca de 800 desenvolvedores fizeram 84.000 commits
  • Em jogos, enquanto a Unity usa C#, a Unreal usa C++, e jogos como Call of Duty, que exigem alta taxa de quadros e gráficos rápidos, usam C++ por causa da velocidade
  • Na Nvidia e na computação acelerada, o C++ também é importante, e mesmo quando Python aparece na superfície, a carga real de computação é assumida por bibliotecas CUDA altamente otimizadas
  • Rust e C++ foram apontadas como linguagens em rápido crescimento, e foi apresentado o número de que os desenvolvedores de C++ aumentaram de 9,4 milhões em 2022 para 16,3 milhões em 2025
  • A demanda por linguagens em que eficiência energética em relação ao desempenho é importante continua, e o C++ mantém casos de uso excelentes e difíceis de substituir
  • Ao mesmo tempo, existe a preocupação de que o financiamento para C++ possa diminuir à medida que grandes players migram para IA
  • Durante a pandemia, governos e órgãos reguladores passaram a se mover para longe do C++, que não oferece segurança de memória por padrão, e a segurança de memória é apresentada como o problema mais importante a resolver
  • No C++26, para fortalecer o software, variáveis não inicializadas deixarão de ser undefined behavior, e a biblioteca padrão do C++26 oferecerá opções de bounds safety para tipos comuns como string, span e vector
  • O static reflection do C++26 é um recurso que permite ao código do programa ver o próprio código do programa, e é avaliado como o recurso único padronizado de maior impacto
  • A conclusão é que a IA pode ter grande influência sobre a segurança das linguagens e sobre a forma de usar linguagens de programação, mas ainda não se sabe o que exatamente acontecerá daqui para frente

1 comentários

 
GN⁺ 4 시간 전
Comentários do Hacker News
  • Ainda me marca a crítica de Ken Thompson chamando C++ de um amontoado inconsistente e complexo de ideias. A última vez que usei C++ profissionalmente foi no C++98, e 11/17/20 eu só mexi um pouco por curiosidade
    Se c++/cfront não tivesse pegado carona no prestígio de C, duvido que teria sido tão amplamente usado, e acho que isso era ao mesmo tempo sua identidade e uma limitação que o C++ nunca tentou mudar. É muito irritante gastar um tempo parecido limpando implementações com ferramentas como Coverity/Valgrind para resolver coisas que o compilador poderia ter tratado
    Na época do C++98, dava para entender razoavelmente bem o que estava acontecendo com os livros do Bjarne sobre a estrutura interna, mas depois disso os livros do tipo “effective, more effective, proficient, performant C++” cresceram como uma indústria, e até o surgimento dos LLMs eu já tinha desistido de esperar que fosse possível entender código legado escrito por outras pessoas. Foi mais satisfatório gastar esse tempo aprendendo o domínio do problema
    Mesmo assim, pretendo ver o documentário porque aparecem figuras de que gosto, como Kernighan e Stepanov

    • Um fato pouco conhecido: quando eu estava pensando em estender o Zortech C para C++, fiquei preocupado com a propriedade intelectual da AT&T e entrei em contato com Ryan Williams, advogado de PI da AT&T
      Perguntei se eu precisaria de licença para fazer um compilador C++ e se deveria chamar a linguagem por outro nome que não C++, e ele riu e disse para eu fazer como quisesse. Também agradeceu, dizendo que eu fui a única pessoa de compiladores que tinha pedido permissão. Vi o obituário dele alguns anos atrás; era uma boa pessoa
    • A base do sucesso do C++ foi o Zortech C++. Na época, 90% da programação era feita em MS-DOS, e o cfront era praticamente inútil no DOS
      A compilação era dolorosamente lenta e ele não suportava ponteiros near/far, que eram indispensáveis para aplicativos minimamente complexos. O Zortech C++ resolveu esses problemas e vendeu muito, criando a massa crítica necessária para o sucesso do C++
      O tráfego em comp.lang.c++ disparou, e a Borland viu nossas vendas, abandonou seu próprio produto de linguagem orientada a objetos e criou o Turbo C++. A Microsoft também viu o sucesso da Borland e fez seu próprio C++
      Também vendemos muitos compiladores Zortech C++ para a Microsoft, e eles desenvolveram o COM com ele. Também ouvi rumores de que a Microsoft estava criando seu próprio C orientado a objetos chamado C*, mas nunca confirmei isso
    • Muita gente deixa passar, mas é bem possível que C tenha sobrevivido por causa da existência do C++. Se o C++ não existisse, a pressão para colocar mais recursos no próprio C teria sido enorme
      Um dos motivos de o comitê de C ter conseguido resistir por tanto tempo sem adicionar muita coisa foi poder apontar para o C++ e dizer “isso é problema deles, não nosso”. Sem C++, não dá para saber se C teria virado alguma linguagem com classes, templates e lambdas
    • C++98 já é bem diferente de C++11. O livro do Bjarne sobre C++11 pareceu completamente diferente da edição do 98
    • Tenho enorme respeito por Ken Thompson e pelas figuras históricas do UNIX, mas imagino que até eles admitiriam que o mundo real é bagunçado e que a melhor solução em isolamento nem sempre vence
      O C e o UNIX que eles criaram também venceram sistemas mais avançados em LISP e Smalltalk, porque eram mais simples de implementar. Nem mesmo o sistema operacional deles baseado em Plan 9, mais avançado, conseguiu superar os sistemas tipo Unix que se espalharam mais
      No fim, capacidade de distribuição e “bom o suficiente” parecem sempre vencer. Acho que linguagens dinâmicas como Perl, Python, Ruby, JavaScript e PHP, junto com o Java fortemente promovido por marketing, ofereceram recursos de alto nível bons o suficiente para impedir que as pessoas migrassem para Lisp e Smalltalk
      Sob essa perspectiva, o C++ pode ter sido o meio de adicionar recursos de alto nível a uma linguagem de baixo nível e alto desempenho já amplamente adotada, tornando-a tecnologia boa o suficiente para uma adoção massiva
  • Trabalho bastante com C++ hoje em dia, então resolvi ver o vídeo enquanto esperava o build terminar. A duração caiu como uma luva, e felizmente o vídeo também foi muito bom

    • Tenho lido tudo o que consigo sobre a história do C++, e também estou ansioso por esse vídeo. Acho o processo de evolução do C++ realmente fascinante
    • Fico curioso se isso era só uma piada ou se o build realmente leva tipo uma hora. Se for isso mesmo, é um absurdo
  • Pessoalmente, C++ é a linguagem mais elegante que já usei em uns 15 anos. Se você é do tipo “sistematizador” e quer ter um modelo mental extremamente preciso, até o último bit, sobre aquilo que escreveu, não há nada como C++
    Reconheço as limitações e incertezas vindas de compiladores e afins, mas ainda assim penso isso

    • Pode dar um exemplo do que você quer dizer com um modelo mental preciso sobre algum objeto?
    • Acho que daria para dizer a mesma coisa sobre Rust
    • Uma linguagem elegante é uma linguagem que faz muito com muito pouco. Forth e Scheme são linguagens elegantes
      Você tem todo o direito de gostar de trabalhar com C++ e é verdade que dá para alcançar muita coisa com ela, mas dificilmente há controvérsia na ideia de que C++ não faz isso com “muito pouco”
  • Fico feliz que este documentário inclua Andrei Alexandrescu. Modern C++ Design foi um livro que expandiu muito meu jeito de pensar quando li, e talvez ainda faça isso hoje. Alguém aqui já leu?

    • As palestras dele estão entre as minhas favoritas. Ele é um excelente apresentador, muito envolvente e com ótimo senso de humor, que usa muito bem
    • Ainda acho divertido, mas os livros do Andrei foram o golpe final que me afastou do C++ por vários anos. Eram livros realmente ótimos e, ao mesmo tempo, consolidaram em mim a vontade de migrar para outra linguagem. Na época foi Go
    • Concordo. Modern C++ Design provavelmente foi o livro de programação do qual mais tirei proveito na minha carreira
    • Tive exatamente a mesma sensação. Encontrei o Andrei uma vez num meetup em Munique e disse a ele que ele tinha me ensinado a pensar; a conversa ficou um pouco constrangedora. Ainda assim, foi um ótimo momento
    • Li recentemente. Alguns capítulos foram bons, e achei particularmente interessante como classes de política corrigem alguns problemas do design orientado a objetos
      Recomendo resumir cada capítulo com um chatbot de IA e perguntar quais seriam os equivalentes modernos. Alguns idioms já foram melhorados, e uma seção inteira parecia ter sido substituída pelo uso de std::variant e std::visit
  • O C++ precisa desaparecer. Entendo que muita gente investiu nisso e que uma quantidade enorme de código foi escrita em C++. Eu era fã antes e ainda é a minha principal linguagem de trabalho, mas em 2026, numa situação em que LLMs conseguem encontrar todas as vulnerabilidades e os atacantes também estão aumentando, precisamos de linguagens em que segurança seja o padrão
    C++ é uma linguagem em que, para obter segurança, você precisa ativá-la de forma opcional e com vigilância extrema. Isso não funciona, e décadas de experiência provam isso

    • Então substituir por quê?
    • Se uma LLM consegue encontrar todas as vulnerabilidades mesmo sem o código-fonte, não conseguiria encontrá-las ainda mais facilmente quando o código existe?
    • C++ foi uma linguagem excelente para a sua época. Não havia linguagem mais rápida que oferecesse abstrações tão poderosas. Também mostrou, com a entrada de coisas como shared_ptr no C++11, o quanto uma linguagem pode mudar profundamente
      Aceitou praticamente todas as ideias, e passamos a saber o que funciona e o que não funciona em campo. RAII, a distinção entre mover e copiar, ponteiros inteligentes, placement-new e genéricos podem ficar
      Em contrapartida, auto_ptr, cópia padrão, certas formas de implementar exceções, herança virtual múltipla e templates que substituem blocos inteiros de código podem ir embora. Na minha opinião, a disputa acabou, e Rust é o resultado que melhor organizou o que funcionou. Herdar até o tempo de compilação foi um bônus
  • Surpreende que o fluxo de desenvolvimento em C++ continue. Quando um jogo ou programa é feito em C++, normalmente é bom porque o desempenho tende a estar garantido, mas se me pedirem para usar C++ diretamente, acho que vou chorar
    Tem coisa demais para decorar e os padrões são variados demais. Se o projeto que vou manter é em C++, eu já desanimo na hora. É simplesmente difícil demais. Gosto quando outra pessoa escreve, mas não é uma linguagem que eu queira usar diretamente

    • Pessoalmente, eu não sinto que programar em C++ seja tão difícil assim. O ponto fraco é que ele exige um aquecimento mental, e isso precisa ser refeito a cada projeto, mas quando o volante de inércia começa a girar, eu passo a escrever código quase sem esforço
      Um aquecimento parecido é necessário em qualquer linguagem, então para mim não é tão diferente de usar Python, Go ou Java
    • Em jogos, C++ vira uma linguagem bem mais simples. Isso acontece porque codebases de jogos normalmente ignoram a maior parte da biblioteca padrão de C++, e há bons motivos para isso. Veja, por exemplo, [0]
      Sem a biblioteca padrão, C++ fica até razoavelmente aceitável
      O principal problema do ecossistema de C++ é que todo mundo esculpe o seu próprio subconjunto da linguagem. Então, em vez de um único ecossistema, existem vários ecossistemas com estilos conflitantes e subconjuntos conflitantes da linguagem/biblioteca padrão. Isso faz com que o reuso de código via bibliotecas seja mais difícil do que precisava ser
      [0] https://hftuniversity.com/post/the-c-standard-library-has-be...
    • É verdade que C++ tem muitos recursos. Mas, como já disseram em outro lugar, a maioria dos projetos define suas próprias regras e o subconjunto de recursos que usa
      A grande vantagem desse conjunto amplo de recursos é que o C++ permite usar boas abstrações desde o nível mais baixo até o mais alto. Dá para usar inline assembly, operações de bits e manipulação direta de memória no baixo nível, e também dá para usá-lo de forma bem mais alta, quase como uma linguagem de script. Seja o que for que o domínio do problema exija, C++ dá conta
    • Mesmo conhecendo só 70% da linguagem, já dá para usá-la com bastante produtividade. É um equívoco comum achar que C++ só serve para áreas como engines de jogos; ele também funciona muito bem para aplicações
      Além disso, vendo as informações do perfil, a menos que você esteja na Coreia do Norte, seria melhor colocar mais um zero no valor cobrado. Assim você consegue clientes mais duradouros e com maior foco em qualidade
    • Um dos meus hobbies é fuçar lojas de usados, admirar objetos cafonas de eras passadas, filtrar bugigangas modernas mal feitas e, se eu encontrar, me alegrar com ferramentas simples e robustas
      Viver como programador de C++ é exatamente essa sensação
  • Sempre que ensino desenvolvedores web, digo que a linguagem da internet não é JavaScript, e sim C++. Desenvolvedores web são apenas usuários brincando dentro de programas feitos por desenvolvedores de C++

    • Seguindo essa analogia, desenvolvedores de navegador são apenas usuários brincando dentro de programas em C/sistema operacional/kernel
    • Eu costumo ver web e internet como coisas diferentes. Se fosse para escolher a linguagem da web, provavelmente eu diria HTML
      Qual é a linguagem da internet é algo bem menos claro
  • Documentários gratuitos sobre temas pelos quais sou apaixonado são realmente ótimos. Obrigado
    Só que eu sou um pouco peculiar: não consigo assistir documentários feitos com pessoas falando em frases curtas costuradas umas nas outras. Entendo a intenção de “deixar que eles contem a história”, mas isso me distrai, então preciso de um narrador dizendo no que pensar
    Ainda assim, mando carinho para os criadores

  • Eu estava por fora do que anda acontecendo, mas recentemente houve documentários sobre Python, Clojure e talvez outras linguagens também. É a mesma turma fazendo uma série sobre várias linguagens? É coincidência? Ou agora toda linguagem de programação está correndo para fazer seu próprio documentário em vídeo?

    • Sim, foi feito pelas mesmas pessoas: https://www.cultrepo.com/
      Pelo visto fazem documentários sobre software de código aberto
  • Há uma reflexão interessante do Chandler Carruth sobre esse tema: https://hachyderm.io/@chandlerc/116694268329657881

    • Faz sentido. O vídeo realmente pareceu bem mais próximo de uma homenagem, e eu também senti falta de vozes mais críticas
      Só nos 10 minutos finais eles tocaram um pouco em críticas comuns, como a complexidade crescente e a segurança de memória. Ainda assim, gostei de assistir