C++ é realmente divertido
(learncodethehardway.com)- O C++ mudou muito como linguagem e ecossistema desde o C++11 e se tornou uma linguagem que resgata a diversão de programar no processo de criar e experimentar diretamente
- Houve uma época em que o C++ era lembrado por muitos desenvolvedores como uma linguagem cansativa por causa do excesso de metaprogramação com templates e de uma cultura centrada em padrões e na padronização
- Mudanças como
auto,nullptr,range-for, lambdas,<chrono>, smart pointers e<thread>alteraram bastante o estilo de código em C++ - O C++ moderno oferece muitas opções, de sistema de arquivos, gerenciamento de pacotes, GUI/TUI, gráficos, matemática, IA e acesso a APIs de sistema operacional, o que facilita criar diretamente aquilo que você quer
- Problemas como erros de compilador, ferramentas de build, conformidade com o padrão, complexidade histórica e RAII ainda existem, mas a possibilidade de criação supera esse desconforto
Por que C++ voltou a ser divertido
- Ao criar um pequeno jogo roguelike, foi usado o algoritmo de Dijkstra na geração de mapas para implementar túneis que conectavam salas, e nesse processo o C++ não atrapalhou muito a experimentação
- Também foi possível fazer um experimento desenhando a interface de usuário do FTXUI diretamente em uma janela de renderização do SFML, aprendendo nesse processo sobre o tratamento de Unicode em C++
- Essas coisas não foram fáceis, mas eram realmente possíveis, e a sensação de “essa ideia realmente funcionou” é o que torna o C++ divertido
- O motivo para começar a programar não era fazer bilionários ganharem ainda mais dinheiro, nem brigar com engines de renderização, nem satisfazer a cúpula de projetos open source, mas sim a alegria de implementar ideias
O cansaço da era da metaprogramação com templates
- Do fim dos anos 1990 até o começo dos anos 2000, havia no C++ um clima forte de aplicar metaprogramação com templates a tudo, e esse período é tratado como um ponto de virada que tornou o C++ menos divertido
- Havia discussões do tipo dizer que somar dois números com templates era mais rápido do que somá-los diretamente, mas houve casos em que a saída em assembly era idêntica
- A percepção de que o comitê de padronização do C++ era pouco interessado em oferecer boa usabilidade aos programadores também ampliou as experiências negativas
- O C++ daquela época ficou na memória como uma linguagem cheia de
<>e sintaxe complexa, com pouco retorno prático - No começo, Java também parecia atraente por causa do coletor de lixo e da proposta amigável para desenvolvedores, mas depois acabou gerando um cansaço parecido com excesso de boilerplate e de design patterns
A sensação de linguagem que o C++11 mudou
- Os recursos adicionados no C++11 são vistos como mudanças que alteraram profundamente a impressão sobre C++
- Os principais recursos foram os seguintes
auto: palavra-chave de inferência automática de tipo que reduz a necessidade de repetir o mesmo nome de tipo várias vezesnullptr: representação de ponteiro nulo que corrige problemas doNULLem Crange-for: laço que, junto comauto, simplifica a iteração sobre containerslambda expressions: lambdas que podem mudar bastante o design e a usabilidade de APIs<chrono>: biblioteca de tempo type-safe que permite expressões como100ms<regex>: funcionalidade de expressões regulares incluída na biblioteca padrãounique_ptr,shared_ptr: smart pointers para lidar com ownership e contagem de referências<thread>: recurso que incorporou multithreading ao ecossistema básico da linguagem
- O C++11 mudou a filosofia e o estilo da linguagem sem abandonar a forma anterior, e por isso é percebido de maneira semelhante ao ES6 do JavaScript
As opções do ecossistema C++ moderno
- O C++ atual já tem boa parte dos recursos esperados em outras linguagens
- Exemplos de ferramentas e bibliotecas citados
- Percorrer sistema de arquivos:
filesystem - Gerenciamento de pacotes: Conan, Meson WrapDB, vcpkg
- Biblioteca de matrizes: Eigen
- IA: TensorFlow C++ API
- Gráficos: SFML
- GUI: Qt, wxWidgets, ImGui
- TUI: FTXUI
- Percorrer sistema de arquivos:
- A qualidade do ecossistema varia de item para item, mas no geral é avaliada como superior ao que foi experimentado em JavaScript e Python
- Em especial, FTXUI e a STL são citadas como exemplos de bom design e boa usabilidade
A ampla possibilidade de implementação que cria a “diversão”
- O C++ é divertido não apenas porque ganhou recursos modernos, mas por causa da capacidade de implementação de praticamente qualquer coisa
- Aplicativos desktop podem ser feitos com fenster, SFML e Qt, ou lidando diretamente com APIs do sistema operacional
- Em áudio, há desde opções rápidas como SFML até ferramentas comerciais como Wwise
- Em gráficos 3D, existem várias opções como OpenGL, Vulkan, Direct3D e Ogre3D
- Na área de matemática, há bibliotecas como BLAS, Eigen e GMTL
- Mesmo quando não existe a biblioteca necessária, ainda dá para construir acessando diretamente a ABI de C ou C++ e as APIs do sistema operacional, e esse processo de fazer na mão é parte da diversão
A liberdade criativa de uma linguagem fora da moda
- O C++ tem linguagem e ecossistema de alta qualidade, mas não é a linguagem da moda no momento, então recebe menos atenção do tipo de gente que estraga linguagens
- A comunidade de C++ é retratada como tendo um clima que não interfere muito no que você quer construir
- Dá para tentar livremente projetos como biblioteca de matrizes, biblioteca de GUI, engine de jogos ou jogos estranhos
- Trabalho criativo precisa tanto da etapa de colocar ideias para fora primeiro quanto da etapa posterior de criticá-las friamente e elevar a qualidade
- Em outras linguagens, organizações, lideranças e pressão da comunidade são vistas como fatores que atrapalham a experimentação no meio do processo criativo
- As amplas possibilidades do C++ e uma cultura relativamente menos voltada a envergonhar os outros podem produzir uma experiência criativa
Os pontos fortes do cppreference.com
- O cppreference.com é avaliado como uma das melhores documentações de linguagem de programação já usadas
- Entre os pontos fortes estão
- Todas as palavras-chave e bibliotecas estão organizadas como documentação de referência
- A maioria dos itens traz exemplos que realmente funcionam
- É indicado em qual versão do padrão C++ cada recurso foi introduzido
- Há links para os documentos do padrão e materiais de referência relacionados
- Existe uma caixa de busca baseada em DuckDuckGo, o que facilita encontrar algo mesmo com ortografia errada ou sem saber o termo exato
- Conceitos importantes como Copy elision também são explicados com exemplos
- O ponto fraco é não haver instruções de como instalar compiladores em várias plataformas
- Como não há tantos compiladores e plataformas de C++, ainda existe espaço para adicionar um guia de introdução
Os problemas do C++ que ainda permanecem
- Isso não significa que o C++ seja uma linguagem perfeita; como outras, ele ainda tem muitos incômodos
- No Windows, configurar compiladores e ferramentas de desenvolvimento fora do caminho de instalação da Microsoft é difícil, e por isso foi criado um script de instalação em PowerShell
- Os principais incômodos atuais são os seguintes
- Mais de 95% das mensagens de erro do compilador são avaliadas como estando entre as piores do setor
- Ferramentas de build são difíceis de usar, e até o Meson apresentou o problema de ignorar instruções de pacotes instalados e usar bibliotecas de sistema quebradas
- Falta incentivo para fazer fabricantes de compiladores seguirem o padrão
- O C++ é extremamente complexo por causa de sua história, e convivem ao mesmo tempo o estilo antigo baseado em alocação no heap e raw pointers, o estilo de metaprogramação com templates, o estilo mais voltado à stack após o C++11 e um estilo ainda mais novo centrado em
struct - O RAII muitas vezes atrapalha em situações reais de configuração, e seria necessário algum ponto intermediário entre construtores de inicialização mais ao estilo de outras linguagens e o RAII atual
- Mesmo com esses problemas, os incômodos do C++ não chegam a estragar a diversão, e o C++ já não corresponde mais à imagem antiga de uma linguagem centrada em colchetes angulares e ponteiros
- O código de layout de GUI do FTXUI é citado como um exemplo de sintaxe tão moderna que, se você não soubesse que é C++, poderia achar que era outra linguagem
1 comentários
Opiniões do Hacker News
Chego perto de ser um hater de C++, mas é porque detesto ter que lidar com C++ em código de trabalho que precisa ser confiável, junto com colegas em quem é impossível confiar totalmente
Em projetos pessoais, foi um dos ambientes de programação mais satisfatórios que já experimentei, e é realmente empolgante poder controlar a execução em um nível muito fino
Saí do C++ há cerca de 10 anos e não pretendo voltar, mas nos meus projetos atuais a confiabilidade de longo prazo é o mais importante, então Rust + CI/CD se encaixa perfeitamente
Ainda assim, sinto falta daquela emoção de projetar e implementar um programa para que ele execute exatamente da forma que eu pretendia, e de isso acontecer graças à minha especialização e percepção
Se eu gostaria que as pessoas com quem trabalho fossem movidas por esse tipo de motivação? De jeito nenhum, mas pessoalmente é uma diversão inesquecível
O sistema de build e o gerenciamento de pacotes são um pesadelo, o pré-processador parece uma piada sádica, a sintaxe é horrível, e há tanto entulho em tempo de execução que é preciso anos de experiência para não atirar no próprio pé com uma metralhadora
Mas, em certo sentido, esse sofrimento aumenta a alegria de finalmente soltar um executável embrulhado em inteligência e lágrimas de sangue
Usei C/C++ profissionalmente por alguns anos e não quero voltar
Passei tempo demais depurando código dos outros, lidando com problemas de integração ambíguos e operando um espaguete de sistemas de build
Parece que a indústria de tecnologia perdeu essa ideia nos últimos 10 anos, e culpo as grandes empresas de tecnologia que colocam as melhores pessoas em prisões adultas com comida boa e cadeiras macias
Startups também ficaram menos divertidas, e o setor de VC, ao incentivar uma janela estreita de pensamento, gerou startups clone e modismos demais, todas fazendo a mesma coisa
O motivo de eu usar C++ em todo projeto novo é a confiança de que, quando eu precisar construir algo por conta própria, eu consigo
Frameworks muitas vezes não se comportam do jeito que eu quero, especialmente quando lidam com o núcleo do projeto, então não tenho vontade de continuar usando
Se dá para construir você mesmo, construa; se não, use um framework
Se você consegue construir por conta própria, C++ é uma ótima ferramenta que pode fazer qualquer coisa e não atrapalha nos aspectos importantes
Linguagens como Rust podem reclamar que estou fazendo algo perigoso, mas em C++ posso expressar diretamente o modelo que está na minha cabeça
Às vezes penso em ponteiros, e ponteiros são uma ferramenta realmente boa
Vamos recuperar a diversão, não só na vida pessoal, mas também no trabalho
Este texto parece um tanto confuso
Ele toca em muitos pontos, mas é difícil extrair por que isso leva à conclusão de que C++ é mais ou menos divertido
Também é confuso chamar C++ moderno de qualidade extremamente alta e, ao mesmo tempo, falar de problemas legados amplos e ferramentas terríveis
Dizer que
unique_ptré ótimo mas que RAII é realmente detestável, ou afirmar que metaprogramação estava em toda parte antes e agora não está mais, também soa estranhoBasta olhar para
conceptspara ver que não é bem assim, e a afirmação de que C++ tem as melhores bibliotecas gráficas, ou que instalar Python é mais difícil do que C++, parece mais uma obsessão do autor sem muita relação com o argumentoNo fim, o autor parece achar C++ divertido por uma combinação complexa de fatores pessoais, e isso por si só é perfeitamente aceitável
Por causa do desempenho e do caráter técnico, também já tive meus momentos mais divertidos programando em C++, mas no desenvolvimento de software real C++ é ruim por inúmeros motivos que conhecemos
C++ é uma linguagem profundamente contraditória, ferida por décadas de legado e política, e ignorar a realidade do C++ é o maior erro nas discussões sobre C++
Minha atitude em relação a C++ hoje é mais próxima de cansaço, e não quero mais continuar saltando os obstáculos que C++ vem colocando há tantos anos
Não há necessidade de continuar batendo em um cavalo morto há tempo demais; dá para simplesmente deixar C++ ser C++
Para mim, mais do que confuso, o texto parece ser de alguém que está se divertindo e tentando compartilhar essa alegria o máximo possível
Não é bem um ensaio argumentativo propriamente dito nem um texto tentando convencer ativamente; é mais algo como “se isso ressoa com você sem eu precisar convencer, talvez você também ache divertido”
Se você está cansado depois de apanhar da realidade no trabalho comercial, é totalmente compreensível que isso pareça não fazer sentido
Eu, por acaso, estou me divertindo muito usando JavaScript ultimamente, e se eu escrevesse um texto parecido, acho que ele seria lido de forma igualmente ruim por alguém esgotado por 10 anos de JavaScript comercial
Mesmo assim, é bom ver que o autor está se divertindo e decidiu compartilhar essa diversão
Passei 3 dias fazendo linkagem estática de uma dependência de terceiros em um projeto C++ para funcionar em Linux/Windows/macOS
O pacote não estava no conan/vcpkg; havia apenas um repositório no GitHub com uma combinação estranha de Makefile/cmake
Estou longe de ser especialista em cmake/cpp, mas na maioria das linguagens modernas isso não é um problema, com coisas como
pip install,cargo add,npm install,go getMesmo que você leia um livro de ponta a ponta sobre os detalhes da semântica de C++, trabalhar em um projeto real continua sendo doloroso
É surpreendente que, no fim, tenhamos chegado a algo como autotools versão JavaScript
Fazer build estático de código de outra pessoa, ou adaptá-lo para compilar em outras plataformas, às vezes é complicado, mas a linkagem em si normalmente se resume a diretório de includes, caminho das bibliotecas e especificação das bibliotecas
Se ninguém fez o empacotamento para vcpkg/conan, é bem provável que também não esteja no pip/cargo/npm
Se foi difícil em C++, em outra linguagem poderia ser muito mais difícil
Dito isso, isso também deixa claro que partes históricas do C++, especialmente a história de build, estão em um estado muito ruim
Se estiver no vcpkg, a dificuldade de instalação fica exatamente igual à dos outros ecossistemas
Periodicamente tento trabalhar em C++ em vez de C, e é sempre um padrão parecido
Aprendo alguma técnica nova de C++, escrevo código achando que algo vai melhorar, tomo erros do compilador e passo o resto do dia aprendendo por que não posso fazer o que quero
Normalmente fico preso ao C++14, e alguns problemas foram corrigidos em versões posteriores, mas ainda assim
Eu queria muito gostar de C++; em teoria ele oferece um C mais poderoso que aumentaria a produtividade, mas no fim a carga cognitiva é grande demais e normalmente acabo usando “C com classes” e sigo em frente
Usei muito C++ em tempo real em 2003 e detestei, mas no ano passado escrevi a maior parte do código em C++ e finalmente passei a gostar
Lambdas e
autoforam o ponto de virada que me fez deixar de odiar C++Também usei um pouco de templates, mas principalmente para evitar um monte de ramificações para cada variação da mesma função
Lambdas me permitiram escrever código do jeito que aprendi primeiro com professores de linguagens da família Lisp, naquele clima de SICP
Com
unique_ptr, alocação também deixou de me incomodarNão faça isso; primeiro pense em como o código será usado e, então, se algum recurso resolver o problema, use-o
É problema → solução, não o contrário
Por exemplo, templates em C++ em geral são horríveis, mas duck typing em tempo de compilação ou adicionar padding automaticamente com base em
sizeof()às vezes é muito útilNo começo eu era programador C# e estava aprendendo C por causa de um projeto embarcado, e o fluxo foi exatamente o mesmo
C++ tem muitos recursos legais que parecem poderosos quando se encaixam exatamente na aplicação
Mas toda vez que eu tentava um recurso novo, aquilo que eu queria fazer era sempre um caso-limite que não funcionava naquela situação; depois de horas ou dias tentando, eu desistia e simplesmente escrevia em C
Claro que há linguagens que fogem dessa tendência, como Python ou Ruby
Normalmente copio o texto do erro e peço para decifrarem
C++ é realmente divertido, e acho que as reclamações das pessoas dependem muito do contexto
Muitos desenvolvedores C++ odeiam a linguagem, mas às vezes esse ódio está direcionado ao alvo errado
Na prática, muitas vezes estão lidando com produtos legados feitos por pessoas que não sabiam usar software tão bem
Passei por algo parecido em Rust: fui colocado em um projeto Rust já existente na empresa, com uma base de código antiga cheia de convenções conflitantes
Havia tipos de tratamento de erro que não compunham bem entre si, abstrações de classe ruins, blocos
unsafedesnecessários etc., e foi o projeto mais penoso em que já trabalheiÉ fácil culpar Rust, mas na verdade era apenas desenvolvimento de software ruim
C++ de fato tem defeitos, mas boa parte da dor que as pessoas sentem vem de lidar com código ruim que seria uma bagunça em qualquer linguagem
v[x]=yO
std::optionalde C++ vira comportamento indefinido se você chamar*vquandovestiver vazioO ponto central de optional é armazenar um valor que pode estar ausente; é difícil entender por que colocar comportamento indefinido na operação mais comum quando o optional está vazio
Como alguém que já usou bastante C++, o problema é que todos os programadores do projeto precisam ser 100% perfeitos durante 100% do tempo
Dá para rodar verificadores de memória e o modo de depuração da STL, mas, se você não roda isso também em release, precisa esperar que sua suíte de testes cubra todas as coisas estranhas que um usuário tolo ou mal-intencionado pode fazer
Numa era em que software se tornou tão importante, e Rust parece chegar perto do desempenho de C++, fica a dúvida se vale a pena usar uma linguagem em que muitos recursos básicos são muito difíceis de usar com segurança
E ainda está piorando: chamar um
std::functionvazio disparava um assert, mas o novostd::copyable_functiontransformou isso em comportamento indefinidoO sistema de tipos é irritante, e nem por isso você obtém segurança de memória de verdade
A most vexing parse é realmente irritante, e esquisitices herdadas de C, como decaimento de ponteiros, continuam lá
Em cima disso, colocam novas soluções como
std::array, mas não conseguem remover o jeito antigoA dependência contínua do pré-processador para imitar um sistema real de importação de módulos também é um problema, e por causa disso surgem contornos como a organização de código de classes ou o idioma pimpl
No fundo, os defeitos são tão grandes e numerosos que ficou difícil encontrar beleza ali
Por outro lado, um projeto em uma linguagem blub simples costuma ser relativamente fácil de decifrar, independentemente do estado da base de código
É bom saber que alguém encontra prazer em C++, mas, pessoalmente, depois de mais de 20 anos lidando com isso, para mim já deu de C++
É simplesmente uma bagunça
Se eu realmente precisar de controle de baixo nível, prefiro lidar com C, apesar dos defeitos; caso contrário, Rust, Python etc. me deixam muito mais feliz
Ainda assim, C++ vai continuar por aí
Há código demais escrito nessa linguagem, é sem dúvida uma habilidade boa de ter, e existem empregos muito bem pagos nessa área
Para mim, a linguagem atrapalha demais e parece excessivamente complexa
Conheço o discurso de que “C++ moderno” é excelente, que não é preciso aprender as versões antigas e que a cada nova versão tudo fica mais simples
O problema é que as bases de código que você acaba assumindo na prática não são C++ moderno
Elas usam todos os recursos já lançados até hoje, são difíceis e cheias de armadilhas
Quem passou anos usando C++ apenas em seus próprios projetos talvez consiga desenvolver certa especialização e ficar imune à complexidade, mas ela não é realmente uma boa linguagem
Coisas como trocar os tipos de dados principais, a biblioteca padrão etc.
Especialmente depois do C++20, a base para essas substituições parece bastante nativa e expressiva
Boa parte dos novos projetos em C++ que vejo segue fortemente essa direção
A facilidade de criar uma linguagem específica de domínio em nível de sistema para uma aplicação é um ponto forte do C++
Infelizmente não cheguei a terminá-lo, mas do que lembro eram coisas como classes,
std::function,std::unordered_map,std::stringestd::unique_ptrÉ difícil imaginar ler código de outra pessoa se não for em um estilo parecido
Como não uso programas grandes profissionalmente, o mais difícil foi ir além de padrões de programação como o padrão Visitor
Eu gostaria que C++ tivesse parado no C++11
O comitê agora parece querer colocar tudo dentro da linguagem, e C++ parece uma linguagem gigantesca que dá suporte a todos os estilos de programação de nicho
Mas é uma bagunça divertida, e eu gosto de escrever em C++
Às vezes isso importa
Minha relação com Rust é muito mais fria
Respeito Rust e, especialmente em contextos como trabalho, em que é difícil defender o uso de C++, uso Rust quando acho que é a escolha certa, e considero importante o que Rust faz
Mas, mesmo já tendo feito um bom número de projetos em Rust, ainda acho tedioso escrever nessa linguagem
Em aspectos essenciais ela é melhor, mas, pelo menos para mim, é menos prazerosa
Ao quebrar o selo do
unsafe, dá para fazer cast explícito de inteiros para ponteiros e, por exemplo, controlar hardware com E/S mapeada em memória, não dá?Este texto é uma longa digressão de escopo amplo, e só as letras “C++” já irritam as pessoas a ponto de muita coisa poder ser ignorada
Às vezes eu também faço isso
Para as reclamações, é só pular para a parte “It's Not All Puppies and Butterflies”
O autor ficou muito impressionado com C++11, e, depois de quase 20 anos ignorando C++ de propósito, eu me senti de forma parecida
Gostei de ele apresentar pacotes e bibliotecas para brincar, mas ainda assim colocar bibliotecas de terceiros nos meus projetos costuma ser doloroso
Headers de arquivo único me vêm à cabeça
FTXUI é interessante
E, de verdade, cppreference.com é fantástico
A documentação do Python também é bem boa, mas nunca vi uma documentação tão boa quanto cppreference.com
A documentação do Python fica espalhada em vários lugares, é incompleta em diversos pontos e também carece de um estilo editorial consistente
Mas, pelo critério do framework Diataxis, ela cobre muito bem não só documentação de referência, mas também vários outros tipos de documentação
As pessoas que escrevem essa documentação consideram explicitamente esse framework ao buscar formas de melhorá-la
Ainda assim, é um trabalho open source baseado em voluntários, que se move de maneira muito parecida com o desenvolvimento de código
Há algum tempo eu queria chegar “mais perto do sistema”, e aprender Rust por fora também não foi fácil
Ao ler este texto, fiquei com esperança de que talvez seja possível se eu reaprender C++
Olá, CMake… não, talvez eu deva dizer Meson
Concordo que C++ é excelente se uma equipe talentosa souber usar bem C++ moderno e estiver começando um projeto novo
É uma linguagem divertida e poderosa, tem bom desempenho e, embora seja complexa, a depuração e a otimização são relativamente intuitivas
Tive a oportunidade de trabalhar em uma base de código de cerca de 5 anos, escrita segundo os padrões pós-C++11, e ela foi muito agradável por vários dos motivos citados no texto
Por outro lado, se for uma base de código antiga que evoluiu por 20 ou 30 anos, ou uma base que não foi mantida por pessoas competentes, a experiência será completamente diferente
Aos 21 anos, a empresa se ofereceu para pagar minha faculdade, então voltei para um curso de ciência da computação e mais tarde mudei para computação
No primeiro dia da aula de “introdução à programação”, no momento em que mexi com C++, me apaixonei
Em comparação com o PHP 7 que eu usava na época, o sistema de tipos, a depuração e o ecossistema eram excelentes
Com a permissão do meu gerente, criei APIs baseadas em C++ para partes dos aplicativos de intranet existentes, para que o PHP as chamasse via WebSocket, e pude aproveitar o sistema de tipos e o desempenho
Esses sistemas ainda são usados diariamente em toda a empresa, e a manutenção nunca foi um problema
Mesmo rodando em um ambiente bastante peculiar chamado IBM Pase for i
Hoje, depois de ter usado Rust e Axum, eu preferiria muito mais o ecossistema Rust para criar APIs desse tipo, mas C++ também merece reconhecimento
Especialmente para quem vem de linguagens web como JavaScript sem TypeScript ou PHP, é uma linguagem realmente excelente
Na verdade, eu provavelmente preferiria C++ a várias possibilidades que consigo imaginar, como C, Java ou Fortran
A exceção talvez fosse C#, mas não sei se ela é antiga o bastante para se enquadrar nessa condição
Ao contrário do que se diz sobre C++ ter ganhado expressões regulares embutidas e elas serem muito boas, é difícil dizer que
std::regexseja bomO desempenho é ruim e o suporte a Unicode também é insuficiente, então, em geral, é melhor evitar
std::regexAprendi C++ e até me diverti com ele, mas nunca me aprofundei
Sempre gostei mais de C, e há muitas bases de código de primeira linha que dá para ler para aprender C melhor, como o motor de jogo Dune original ou utilitários Unix
Recentemente mexi um pouco com Rust e não vejo muito motivo forte para usar C++
A combinação de um sistema de tipos poderoso inspirado em programação funcional com desempenho parece difícil de superar, e soa como uma linguagem quase perfeita
Ainda assim, certamente há motivos legados para ter de usar C++
Talvez coisas como motores de jogos, programação embarcada ou outros tipos de acoplamento legado
Se for uma base de código C++ nova, dá para deixá-la bem limpa
Mas, a esta altura, não entendo bem por que criar software novo em C++
Há muitos incômodos em C++
O gerenciamento de bibliotecas/pacotes não é padronizado, headers são duplicação de código, e a biblioteca padrão varia conforme a implementação e é quase ilegível
O padrão tem comportamentos estranhos, as pessoas se apoiam em comportamento indefinido sem saber, há problemas de uso antes da alocação, e vazamentos de memória surgem de forma sutil por problemas de ownership e contagem de referências incorreta
É preciso tornar tudo
constem vez de deixar como padrão, para garantirnoexcepté preciso verificar as exceções de tudo que é chamado, e erros em operações da biblioteca padrão são difíceis de lerCódigo fortemente orientado a objetos é, na prática, dívida técnica
O LSP de C++ não funciona de forma estrutural, verificando a árvore de sintaxe abstrata para encontrar definições como em Rust, então a navegação e a compreensão da base de código são lentas
Rust dá suporte explícito de primeira classe a
nostd, mas em C++ desligar a biblioteca padrão exige flags específicas por compilador, e é difícil confirmar se foi feito corretamentePor isso, o argumento de usar C++ por causa de embarcados me convence pouco
Rust também tem motores de jogo como bevy, embora ainda sejam novos, e, se quiser, dá até para acoplar Rust ao scripting do Godot
Áudio de baixo nível também é igualmente fácil em Rust, e é possível lidar com multiplataforma em um único crate
No geral, acho que o ponto central é código legado e a hesitação diante de mudanças
Inclui número de usuários, conhecimento e materiais publicados e disponíveis, livros, cursos, blogs, textos, vídeos, bibliotecas de software, além da alta compatibilidade com C, outra linguagem gigantesca
Para quem está nessa área há mais de alguns anos, isso é quase senso comum da indústria de software
Eu nunca usei muito C++, então é difícil até me chamar de iniciante de verdade, mas no passado comprei e li livros clássicos de C++ do criador da linguagem, Bjarne Stroustrup, de Scott Meyers etc., e cheguei a entendê-los em alguma medida
Já C eu usei bastante em produção por anos, inclusive em produtos comerciais bem-sucedidos
https://www.stroustrup.com/applications.html
https://www.stroustrup.com
https://en.m.wikipedia.org/wiki/Bjarne_Stroustrup
https://en.m.wikipedia.org/wiki/Scott_Meyers
Por isso acho que o desenvolvimento de jogos será o que permanecerá mais tempo em C++
Mesmo que, para 0,001% dos usuários, o jogo morra com uma falha de segmentação, a reação é meio “e daí?”