Ir para o conteúdo principal
BiografiaHistória da informáticaIniciante

Bjarne Stroustrup: conceber C++ sem abdicar do desempenho

Como Bjarne Stroustrup fez C with Classes evoluir para C++, uma linguagem que concilia abstração, compatibilidade e controlo dos recursos.

Publicado 10 de agosto de 2026Leitura : 7 minPor Yann Bastien
Retrato de Bjarne Stroustrup, criador da linguagem C++
Mostrar índice
  1. O problema dos grandes programas eficientes
  2. De «C with Classes» a C++
  3. Abstração sem custo imposto
  4. Da biblioteca a uma linguagem multiparadigma
  5. Normalizar uma linguagem viva
  6. O que C++ permite — e o que exige
  7. Porque Bjarne Stroustrup continua importante
  8. Cronologia
  9. Perguntas frequentes
  10. Bjarne Stroustrup criou C++ sozinho?
  11. Porque se chama C++?
  12. C++ é apenas uma linguagem orientada a objetos?
  13. C++ é compatível com C?
  14. Porque C++ continua difícil de aprender?
  15. Em que áreas C++ continua relevante?

Bjarne Stroustrup não concebeu C++ para substituir C por uma teoria mais elegante. Procurava uma ferramenta capaz de descrever grandes sistemas sem perder o controlo do desempenho, da memória e do hardware.

Esta tensão define C++ desde o início: oferecer abstrações de alto nível e continuar utilizável onde cada recurso conta. Explica simultaneamente a sua longevidade, potência e reputação de linguagem complexa.

O problema dos grandes programas eficientes

Bjarne Stroustrup nasceu em 1950 em Aarhus, na Dinamarca. Estudou matemática e informática na Universidade de Aarhus e depois fez um doutoramento em Cambridge sobre sistemas distribuídos.

Durante esse trabalho utilizou Simula, linguagem pioneira das classes e da programação orientada a objetos. As abstrações de Simula ajudavam-no a representar os componentes de um sistema, mas as ferramentas disponíveis não forneciam o desempenho esperado. Numa experiência seguinte recorreu a BCPL, mais próximo da máquina, mas verificou que a perda de abstração tornava o programa difícil de organizar.

Dessa experiência surgiu uma direção: combinar os mecanismos de estruturação de Simula com o modelo de compilação e a eficiência de C.

De «C with Classes» a C++

Stroustrup entrou nos Bell Labs em 1979. Aí iniciou C with Classes, uma extensão de C dotada de classes, construtores, destruidores, controlo de acesso e verificação de tipos reforçada. As primeiras versões eram transformadas em C por um pré-processador chamado Cfront e depois compiladas com as ferramentas existentes.

A escolha de estender C foi pragmática. Os Bell Labs já dispunham de sistemas, bibliotecas e programadores formados nessa linguagem. A compatibilidade facilitava a experimentação e a adoção. Também transmitiu a C++ vários traços difíceis de simplificar posteriormente: sintaxe densa, conversões implícitas e gestão direta da memória.

Em 1983, a linguagem recebeu o nome C++, numa referência ao operador de incremento de C. As funções virtuais permitiram polimorfismo dinâmico, enquanto a sobrecarga de operadores ajudou tipos definidos pelos utilizadores a comportarem-se como tipos integrados. A primeira edição de The C++ Programming Language surgiu em 1985.

Abstração sem custo imposto

A ideia central de Stroustrup não é que todos os programas devam ser orientados a objetos. C++ tornou-se progressivamente multiparadigma: programação procedimental, classes, programação genérica, funções e cálculo em tempo de compilação podem coexistir.

O princípio das «zero-overhead abstractions» pode ser entendido através de duas regras. As funcionalidades não utilizadas não devem custar tempo nem memória. Quando uma abstração é utilizada, a sua implementação deve poder competir com código especializado escrito à mão. Não é uma promessa automática: uma má conceção pode continuar lenta. A linguagem procura antes dar às bibliotecas meios para oferecer abstrações eficientes.

Os templates ilustram este objetivo. Permitem escrever um algoritmo para uma família de tipos, cabendo ao compilador produzir as versões necessárias. A Standard Template Library associa contentores, iteradores e algoritmos sem impor uma hierarquia comum de classes.

C++ desenvolveu também um modelo determinístico de recursos. Um objeto pode adquirir um recurso no construtor e libertá-lo no destruidor. Esta técnica, conhecida como RAII, não diz respeito apenas à memória: ficheiros, locks e ligações podem acompanhar o tempo de vida de um objeto. Os smart pointers modernos tornam o modelo mais seguro sem eliminar a possibilidade de controlo de baixo nível.

Da biblioteca a uma linguagem multiparadigma

Uma linguagem só se torna verdadeiramente utilizável em grande escala quando as suas abstrações podem ser partilhadas sob a forma de bibliotecas. No início de C++, as classes serviam sobretudo para representar objetos e proteger o seu estado. Os templates ampliaram depois essa ambição: permitem descrever famílias de algoritmos e estruturas de dados sem fixar previamente o tipo manipulado.

O trabalho de Alexander Stepanov e Meng Lee na Standard Template Library teve um papel decisivo. A STL não foi concebida como uma hierarquia de objetos. Separa contentores, algoritmos e iteradores, que funcionam como interface entre eles. O mesmo algoritmo de ordenação pode assim trabalhar com várias representações de dados sem depender de uma classe base comum.

A sua integração na biblioteca padrão durante os anos 1990 confirmou que C++ já não se resumia a «C com classes». A programação genérica tornou-se um dos seus eixos principais. Mais tarde, os concepts procuraram exprimir explicitamente os requisitos impostos aos parâmetros de um template, tornando interfaces e erros de compilação mais compreensíveis.

Esta evolução ilustra a forma de trabalhar de Stroustrup. Não procura impor um único paradigma: quer permitir ao utilizador escolher a abstração adequada e depois ao compilador eliminar, tanto quanto possível, o seu custo de execução.

Normalizar uma linguagem viva

À medida que surgiram vários compiladores, tornou-se indispensável uma definição comum. O primeiro padrão ISO de C++ foi publicado em 1998. A normalização transformou a linguagem numa obra coletiva: Stroustrup manteve uma influência importante, mas as evoluções passaram a ser discutidas e votadas por um comité internacional.

C++11 marcou uma modernização importante com move semantics, expressões lambda, ferramentas de concorrência e numerosas melhorias da biblioteca. As edições seguintes adotaram um ritmo regular e acrescentaram, entre outros elementos, concepts, módulos, ranges e corrotinas.

Esta acumulação responde a necessidades reais, mas tem um custo pedagógico. Vários estilos históricos coexistem, e código correto segundo uma prática antiga pode já não representar a forma mais segura de escrever C++ moderno. A compatibilidade protege investimentos de software consideráveis; em contrapartida, limita a possibilidade de recomeçar do zero.

O que C++ permite — e o que exige

C++ é utilizado quando desempenho, latência ou acesso ao hardware são importantes: motores de jogos, browsers, bases de dados, ferramentas de criação, sistemas embebidos e infraestruturas financeiras. Permite construir abstrações ricas sem impedir o controlo preciso da representação dos dados.

Esta liberdade transfere uma responsabilidade importante para o programador. Acessos inválidos à memória, comportamento indefinido e erros de tempo de vida continuam possíveis. As recomendações modernas privilegiam contentores, objetos proprietários dos seus recursos, verificações estáticas e bibliotecas comprovadas em vez do uso sistemático de ponteiros crus.

Comparar C++ com Java ou Python significa, portanto, menos escolher um vencedor do que comparar contratos. Java entrega mais decisões a uma máquina virtual; Python privilegia um ciclo de desenvolvimento muito direto; C++ expõe mais amplamente os custos e as escolhas de representação.

Porque Bjarne Stroustrup continua importante

Stroustrup demonstrou que uma abstração não é necessariamente inimiga da eficiência. Esta ideia influencia C++ e também linguagens mais recentes, que procuram igualmente tornar garantias e custos visíveis.

O seu legado inclui ainda uma lição menos confortável: uma linguagem adotada durante décadas torna-se uma infraestrutura social tanto quanto técnica. Fazê-la evoluir exige conciliar inovação, segurança, ferramentas, ensino e milhares de milhões de linhas existentes.

Cronologia

  • 1950: nascimento de Bjarne Stroustrup em Aarhus, Dinamarca.
  • 1975: licenciatura na Universidade de Aarhus.
  • 1979: doutoramento em Cambridge e entrada nos Bell Labs.
  • 1979: início do trabalho em C with Classes.
  • 1983: adoção do nome C++.
  • 1985: primeira edição de The C++ Programming Language.
  • 1989: publicação de C++ 2.0.
  • 1990: publicação de The Annotated C++ Reference Manual.
  • 1998: primeiro padrão internacional de C++.
  • 2011: publicação de C++11, etapa importante do C++ moderno.
  • 2014–2023: novos padrões a um ritmo aproximadamente trienal.
  • Hoje: Stroustrup prossegue o trabalho sobre conceção, ensino e segurança de C++.

Perguntas frequentes

Bjarne Stroustrup criou C++ sozinho?

Iniciou e liderou a conceção original. A linguagem tornou-se depois produto de compiladores, bibliotecas, utilizadores e de um comité ISO internacional.

Porque se chama C++?

Em C, o operador ++ incrementa um valor. O nome sugere assim um C «aumentado», sem pretender que seja apenas a versão oficial seguinte de C.

C++ é apenas uma linguagem orientada a objetos?

Não. Suporta estilos procedimental, orientado a objetos, genérico e funcional. Stroustrup descreve-a como uma linguagem multiparadigma.

C++ é compatível com C?

Muito código C pode ser adaptado ou compilado em C++, mas as linguagens não são totalmente compatíveis. Cada uma possui os seus próprios padrões e algumas construções válidas numa não o são na outra.

Porque C++ continua difícil de aprender?

Combina vários paradigmas, conserva muitas escolhas históricas e deixa ao programador um controlo alargado. A aprendizagem beneficia de começar pelas práticas modernas em vez da gestão manual sistemática da memória.

Em que áreas C++ continua relevante?

Em software onde desempenho, latência, memória ou integração com hardware são decisivos: jogos, browsers, bases de dados, computação científica, sistemas embebidos e infraestruturas.

Este artigo foi útil?

Fontes e referências

  1. 1.Bjarne Stroustrup --- A History of C++: 1979--1991
  2. 2.Bjarne Stroustrup --- The Design and Evolution of C++
  3. 3.ISO C++ Foundation --- The C++ Standard
  4. 4.Computer History Museum --- Bjarne Stroustrup oral history

Coleção

Linguagens de programação

7 / 26

  1. 01Grace Hopper: dos primeiros compiladores ao COBOL
  2. 02John Backus: FORTRAN, a notação BNF e a recusa do código de máquina
  3. 03Dennis Ritchie: a linguagem C no coração do Unix
  4. 04FORTRAN: provar que um compilador pode competir com assembly
  5. 05A linguagem C: tornar os sistemas portáteis sem esconder a máquina
  6. 06Niklaus Wirth: de Pascal a Oberon, conceber pela simplicidade
  7. 07Bjarne Stroustrup: conceber C++ sem abdicar do desempenho
  8. 08Pascal: aprender a programar tornando a estrutura visível
  9. 09C++: de C with Classes ao C++ moderno
  10. 10Programação orientada a objetos: objetos, mensagens e abstrações reutilizáveis
  11. 11Guido van Rossum: criar Python para tornar o código legível
  12. 12Brendan Eich: JavaScript, do protótipo da Netscape ao padrão da Web
  13. 13James Gosling: o engenheiro na origem de Java
  14. 14Python: legibilidade, baterias incluídas e um ecossistema global
  15. 15Java: escrever uma vez, executar em qualquer lugar
  16. 16JavaScript: a linguagem que tornou a Web interativa
  17. 17Ken Thompson: de Unix a Go, a simplicidade como método
  18. 18John McCarthy: Lisp e a ideia de programar com símbolos
  19. 19Alan Kay: Smalltalk e o computador como meio pessoal
  20. 20Barbara Liskov: a abstração que tornou o software modular
  21. 21Robin Milner: ML, prova assistida e linguagens da interação
  22. 22Brian Kernighan: AWK, Unix e a arte de explicar código
  23. 23Anders Hejlsberg: de Turbo Pascal a C# e TypeScript
  24. 24Larry Wall: Perl, a linguagem que ligou as ferramentas da Internet
  25. 25Yukihiro Matsumoto: Ruby e a felicidade do programador
  26. 26Rasmus Lerdorf: PHP e a democratização da Web dinâmica
HistóriaHistória da informáticaIniciante

C++: de C with Classes ao C++ moderno

De C with Classes aos padrões modernos, descubra como C++ conciliou abstração, programação genérica, compatibilidade e controlo do desempenho.

10 de agosto de 202610 min
BiografiaHistória da informáticaIniciante

Dennis Ritchie: a linguagem C no coração do Unix

Como Dennis Ritchie concebeu a linguagem C e contribuiu para o Unix, duas bases que tornaram o software de sistema mais portável.

3 de agosto de 20267 min