Taverna /dev/All

C++ hoje - quem usa, como usa e o que sugerem pra começar?

Coloquei C++ no meu radar deste ano apesar de todas as experiências bem sucedidas que tive com Rust ano passado. Então comecei um processo de imersão (em muito breve devo publicar no meu blog uma bibliografia comentada inclusive) que tem sido muito interessante, inclusive aprendendo bastante no Discord aqui do /dev/All a respeito.

O objetivo deste post é analisar C++ hoje. Vocês tem usado? Aonde tem visto ser usado? O que indicam de leitura para quem está dando os primeiros passos neste universo?

Sobre o ferramental, o que tem usado? Quais IDEs? Quais os principais frameworks e bibliotecas?

Sobre o mercado: vocês tem visto oportunidades? De que tipo?

PS:
não é a primeira vez que tento embarcar neste universo C++. Desde que comecei a programar profissionalmente estou tentando mas nunca havia aparecido oportunidades tais como as que tenho visto hoje (no meu caso, muita coisa de automação e desenvolvimento de baixo nível). Então na prática é como se estivesse de novo de novo começando do zero aqui (o que adoro) :slight_smile:

Eu já tenho uns 15 anos com experiência com c++. Minha produção acadêmica foi c++, e os trabalhos mais importantes com segurança e telecomunicações foram usando c++.
Para aprender, é importante estar antenado nos drafts mais recentes da linguagem, porque o isocpp tem por padrão não remover componentes da linguagem que estejam obsoletos para manter retrocompatibilidade dos compiladores. É legal aprender sempre o draft estável atual(hoje o 17). C++ tem mercado extenso para embarcados. Setores automotivos, aeronáuticos, navais, petrolíficos. Todos precisam de sistemas embarcados para os maquinários. O problema do c++ é o mesmo problema que a linguagem c tem. Ela não é nem um pouco segura. É comum encontrar crashes que acontecem sem motivo algum e você não consegue resolver apenas depurando linha a lnha. C++ não resolveu esse problema da linguagem c, embora seja uma alternativa orientada a objetos. Então o estágio de depuração é muito pesado e massante.
Eu acho que Rust resolve o problema que foi citado acima. Seu trabalho segue apenas codificando, e não a maior parte do tempo de projeto depurando No caso, hoje em dia solução para embarcados você desenvolve com c/c++, rust, object pascal e talvez golang.

C++ possui templates, que são generics que funcionam com tipos de statck(int, floats, longs, doubles). Possui um preprocessador. Os dois recursos são muito poderosos, mas os que mais geram bugs na minha opinião.

Rust tem tudo isso seguro.

3 Curtidas

A standard library, a famosa stl, possui classes de containers, smartpointers, sistemas de arquivos, sistema de datas(clock interno e clock com interface humana). Tem praticamente tudo nela. Existem funções para lidar com containers. Você pode somar arrays

auto arr_soma = std::sum(arr1, arr1);

É uma das melhores que eu já vi. A melhor pra mim hoje é a biblioteca da golang, que possui até protocolos para persistir dados para json, xml, binario, etc… por padrão.

1 Curtida

Opa, primeiro post aqui.

C++ é bastante utilizado no mercado financeiro, especialmente dentro do ecossistema das bolsas, corretoras e fundos quantitativos.

Dentro desse nicho, as aplicações

  • processam um alto volume de dados de maneira otimizada (tanto em quantidade absoluta, quanto em TPS)
  • exigem baixa latência na comunicação
  • não podem falhar ao longo do dia (caso contrário deixam de participar do mercado)

Para atender esses tipos de requisitos, algumas soluções são empregadas:

  • pré-alocar todos os objetos do processo para evitar alocações durante o funcionamento.
  • trabalhar com as estruturas de dados em memória, controlando o tamanho e empacotamento das informações para garantir a melhor performance por ciclo do processador.
  • utilizar um thread pool otimizado para atender o workload exigido pela aplicação
  • I/O é normalmente feito de forma assíncrona, em uma thread separada, fora do caminho crítico da aplicação.
  • tratamento de erros

O C++ é indiscutivelmente a linguagem que consegue entregar a performance esperada para essas aplicações.

Outro nicho onde C++ é bastante utilizado são nas aplicações voltadas para produção musical. DAWs (Ableton, Reaper, etc.) e VSTs são aplicações sensíveis a latência e por isso precisam ter alta performance.

Como programo em C# não conheço muito sobre o toolset do C++, mas se for para rodar em Windows sei que o pessoal costuma utilizar o próprio Visual Studio (ainda mais agora na versão 2022 com hot reload). Em Linux imagino que o pessoal costuma utilizar o gcc ou próprio cmake para compilar as aplicações.

1 Curtida

Assim como o @jcbritobr eu tenho uma loooonga estrada com o C++. Usei tanto na indústria de telecomunicações, quanto desenvolvendo games, quanto num passado onde o C++ Builder ainda era uma das principais linguagens do mercado, ao lado do Delphi e do Visual Basic.

Hoje é uma linguagem um tanto árida. Isso por causa da decisão da isocpp de que o compilador deve se manter compatível até o início dos tempos. Isso significa que é uma linguagem cheia de “pegadinhas” e cheia de legados que incomodam quem está começando. Você é praticamente obrigado a ler livros de boas práticas, como os “Effective” da vida. E, se prepare, porque no caso do C++ são QUATRO Effective: Effective C++, More Effective C++, Effective Modern C++ e Effective STL.

Além disso, o C++ não é (e não quer ser) uma linguagem defensiva. Na verdade, o paradigma dela é o OPOSTO disso. Ele é feito para te deixar programar do jeito que você quiser, mesmo que você queira programar errado. Então é 100% tarefa sua, de programador, programar defensivamente e deixar a semântica do seu programa clara para os próximos. E isso torna muito difícil de se garantir em uma equipe onde haja júniores. Só para dar alguns exemplos:

  1. Você pode usar um comando chamado const_cast para retirar o const de uma variável const e modifica-la. Mas isso pode ter consequências nefastas imprevisíveis. Mas é vc programador hardcore que tem que saber disso.
  2. Você pode, através de truques de ponteiros, substituir o valor em uma referência que, teoricamente, deveria ser insubstituível;
  3. Você pode fazer casts sinistros como de um objeto para um array de bytes (e vice-versa). Pode ser bem útil se está escovando bits em redes, mas pode ser bem perigoso também

Por fim, um último detalhe é que é uma linguagem não gerenciada. Ou seja, você tem que controlar memória na mão. Os smart pointers já facilitaram muito, mas não se engane. Você ainda terá que saber muito mais detalhes do que em linguagens com GC, ou mesmo em linguagens onde eles já foram implementados desde o início. Sempre terá um código legado para interagir, sempre terá uma situação de conversão bizarra de ponteiro, etc. E isso vai te incomodar, muito.

Em resumo, por mais que eu ame essa linguagem, não estou impressionado dela estar desaparecendo - até mesmo em mercados em que ela era certa como o de games. Hoje temos alternativas melhores: seja no Rust ou na Unity. Obviamente uma linguagem importante dessa vai levar décadas para chegar no ostracismo de um Cobol, mas não estou mais tão certo assim de que valha a pena um mega investimento nela só por questões de estudo.

E quem me acompanha sabe que, nos últimos 20 anos, eu falava o oposto disso.

3 Curtidas

O grande ponto positivo dela é realmente o PODER. Você pode fazer qualquer coisa, com performance. Tem bibliotecas para absolutamente tudo. E, melhor do que isso, os fabricantes de novos hardwares e dispositivos irão produzir seus drivers para ela primeiro. Então, se você quer trabalhar com uma tecnologia mega de ponta, ao ponto de ser meio experimental ainda, é provavelmente a linguagem para você.

E, claro, em alguns mercados específicos isso é bem relevante. Você vai encontrar maravilhas como a OpenCV para visão computacional.

É também a linguagem da portabilidade. Se você quiser compilar para umas 500 plataformas, use C++. Mas cuidado: estamos falando em uma linguagem PORTÁVEL, e não MULTIPLATAFORMA. A diferença é que não vai ter uma VM por trás traduzindo código. Vai caber a você programar com cuidado, testar em múltiplos compiladores, etc. Agora, com eles, não se impressione de poder compilar para mais dispositivos do que você sequer supos que existissem. Por exemplo, dá uma olhada no tamanho da lista de plataformas suportadas do QT (que é uma baita biblioteca para quem quer desenvolver em desktop): Supported Platforms | Qt 5.15

Sobre ferramentas. Hoje fico entre QT e CLion. Não entendo o fetiche do pessoal com o Visual. Para mim, deixou de ser uma boa IDE faz mais de 10 anos.

2 Curtidas

Eu acho object pascal uma linguagem bem mais sucedida que c++. Ninguém valoriza, mas ela tem definitivamente melhor suporte a paradigma OO e faz tudo que c e c++ fazem. A performance é pareada e o compilador produz binários eficientes da mesma forma. Ela é tão bem sucedida que a grande maioria dos malwares do planeta são escritos nela. Gera código nativo, e ainda por cima todo compilado estaticamente, ou seja, você não tem dependências nem runtime necessários para execução do programa. E é uma linguagem bem mais alto nível. Para processamento de imagens ela é number one para mim. Possui todas as bibliotecas necessárias para montar software robusto nesse quesito.

1 Curtida

Bem o estudo de C, C++ e rust tem entrado um pouco mais no meu radar para casos pontuais como tentativa ou opção para melhoria no desempenho de aplicações python.

Achei a integração dessas linguagens utilizando Cython, no caso C e C++, algo bem tranquilo. E o resultado final foi otimo.

Tenho observado que de certa forma essa tem sido uma opção comum para projetos python que buscam aprimorar seu desempenho de forma “transparente” para os usuários.

1 Curtida

Eu trabalho com C++ já faz 2 anos. Estou num grupo que desenvolve um software para restauração geológica para uso na indústria de petróleo. É um “Sr. programa” que começou ainda na década de 90 com C puro e tem sido continuamente melhorado e adicionado novas features baseando-se bastante em pesquisa científica de novos métodos de restauração e também de melhorias do ponto de vista de cálculo numérico.

O software também usa uma centena de bibliotecas menores (desenvolvidas por nós ou outros grupos) voltadas para criação da interface gráfica, manipulação de objetos 3D, renderização com OpenGL, cálculo numérico, entre outras mais que eu ainda nem bati o olho.

Por ser um software antigo, tem muita coisa legada, principalmente os módulos em C que tiveram que usar alguns mecanismos para simular OO. Mas hoje, tudo é desenvolvido seguindo a cartilha do C++, ainda que na versão 14. Também usamos muita programação paralela, tanto através da std::thread quanto da OpenMP em alguns algoritmos. Para interface gráfica usamos o IUP que nos dá a característica multiplataforma, pois esse sistema precisa rodar em Windows e Linux. O desenvolvimento é feito apenas no Visual Studio (windows).

Essa é minha primeira oportunidade depois que terminei a graduação e a pós (eng. civil). Fiz a minha pesquisa do mestrado atuando dentro desse grupo. Ao fim, fui efetivado. Mesmo eu não sendo diretamente da área de TI, pretendo seguir carreira de programador. Porém sinto receio por trabalhar com C++, por não ser uma lang tão “mainstream” hoje em dia, como JS ou Python, no entanto, estou aprendendo bastante, principalmente porque um dos pontos negativo/positivo do C++ é a necessidade de criar algumas coisas que vêm prontas em outras linguagens. Sem falar que fazemos muito uso de Geometria Computacional e também algumas técnicas de renderização. No roadmap atual estamos incluindo automação de algumas funções e também prevendo o uso de AI em nossos algoritmos.

Sobre aprendizado, meu foco está sendo em criação de interfaces e desenho com OpenGL, mas devo incluir ainda estudos sobre C++ moderno e também programação concorrente. Eu curto muito o canal do TheCherno sobre C++ e também renderização, vídeos um pouco longos, porém muito bem embasados e com exemplos.

No futuro, eu quero estudar Rust e tentar aplicar dentro do grupo em algum estudo de caso.

2 Curtidas

Esta experiência aí é bem interessante hein?

E como é a manutenção desta base de código, é tranquila?

Olha, francamente, eu acho que não vi nem 30% de tudo. Mas a gente segue muito a filosofia do “não mexe em time que tá ganhando”. A maioria dos módulos desenvolvidos em C, que são usados nos primeiros algoritmos de transformação usados para restauração geológica, utiliza muitas variáveis globais estáticas que prejudicam demais a extensão e também paralelismo.

Um caso recente foi a necessidade de automatizar uma dessas transformações para ser executada em várias instâncias sob uma única chamada; o responsável passou muito tempo refatorando principalmente para não quebrar o uso regular.

Uma outra deficiência é a falta de testes, sempre dependemos de rodar o programa, abrir modelo e rodar a função, daí então passamos a tarefa para os geólogos testarem mais, etc. É um tempinho perdido para fazer essas coisas, mas é compreensível por ser algo muito antigo.

Outra coisa curiosa é o controle de versão, ainda usamos SVN e só recentemente passamos a migrar nossas bibliotecas para git (com Gitlab), mas o programa em si, continua no svn.

Eu também acho tudo interessantíssmo, acho que é bem fora dos padrões trabalhar nesse tipo de projeto hoje em dia. Uma das coisas que me motiva é a possibilidade de incluir muitas coisas dentro do projeto para melhorar a eficiência do desenvolvimento, principalmente em relação a testes que é bem chato ter que ficar rodando o programa para tudo, só o build demora uns 5 minutos quando se altera algum header file importante.

itexto