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.
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.