3 Motivos pelo qual uso C++ como linguagem de script.

Eu tenho muito dominio sobre a linguagem C, e gosto de usar ela como linguagem principal em muitos projetos, mas recentemente comecei a usar C++ para escrever scripts tanto em projetos Lua, JS ou C. e sinceramente, achei perfeita para isso!

1. STL Rica

a biblioteca padrão do C++ tem muitos recursos e utilitários, faz você não depender de lib de terceiros.

  • stream std::cout std::cin std::iostream std::stringstream std::ifstream
  • algoritimos std::sort std::accumulate std::transform
  • estrutura de dados std::vector std::list std::deque std::set std::map
  • pattern matching std::regex std::search std::find_if
  • controle de tempo std::time_t std::chrono std::chrono::system_clock

2. Não precisa de instalação

Muitas distribuições linux já vem com C++, ou você previamente precisou instalar para outro caso, seja usando react-native, python... é muito dificil você não ter o g++ em seu linux, além do mais não existe breakchanges na linguagem.

g++ tools/doxfilter.cpp -o doxfilter --static

3. Containers

Você pode compilar como um executavél estatico, isso é sem dependencias dinamicas, isso é ótimo para containers, pois você pode usar seu script como um binário em sua maquina local montando dentro de qualquer imagem oficial e não vai estar esperando por nenhuma lib durante a execução.

Exemplo

esse é um código que fiz para boostrapping de documentação doxygen_filter.cpp, o intuito é quando existir o comando especial @sourcecode ele adicione no doxygen o código fonte sem comentários do arquivo atual.

docker run --rm -v $(pwd):/app -w /app rodrigodornelles/doxygen:latest doxygen
  • arquivo de configuração: doxyfile
INPUT_FILTER 		   = ./doxfilter
  • código fonte: doxfilter.cpp
#include <iostream>
#include <fstream>
#include <regex>

int main(int argc, char* argv[]) {
    if (argc != 2) {
        return 1;
    }

    std::string line;
    std::ifstream file(argv[1]);
    std::stringstream sourcecode; 
    std::regex pattern_source("@sourcecode");
    std::regex pattern_comments("^(\\/\\*|\\*\\/|\\s\\*)");

    if (!file.is_open()) {
        return 2;
    }

    while (std::getline(file, line)) {
        if (!std::regex_search(line, pattern_comments)) {
            sourcecode << line << std::endl;
        }
    }

    file.clear();
    file.seekg(0, std::ios::beg);

    while (std::getline(file, line)) {
        if (std::regex_search(line, pattern_source)) {
            std::cout << "@code\n" << sourcecode.str() << "\n@endcode" << std::endl;
        } else {
            std::cout << line << std::endl;
        }
    }

    file.close();
    return 0;
}

Conclusão

tudo isso ainda ainda com os poderes de lambda funcitons, templates e inferencia de tipos, faz com que você escreva um código moderno, robusto e eficiente para tarefas do cotidiano.

acredito que muitos clis sao feitos em c++ e acho que se tu é produtivo na linguagem nao tem por que usar. Assim como alguem que só sabe python deveria fazer seus scripts na mesma ou java. O importante é entregar o resultado.

Aqui estou eu, fazendo malabarismo pra enfiar Lua ou até o JS nas aplicações C++ pra rodar scripts, enquanto a galera tá aí escrevendo script em... C++? Interessante.

Pois é, o C++ moderno tem seus brinquedinhos, mas, sinceramente, esses dois primeiros motivos – STL rica e estar disponível em todo lugar – o Python já faz tudo isso, e sem drama, né?

E essa do binário isolado pra "facilitar a virtualização"? Sei lá, não faz muito sentido. Eu quero que meus scripts rodem dentro de um ambiente específico, com tudo configurado, não de forma isolada.

Pra ser sincero, usar uma linguagem compilada pra fazer scripts me parece mais coisa de quem quer bancar o espertão do que uma vantagem real. As linguagen dinâmicas existem justamente para isso???

Se você realmente precisa que seus scripts sejam rápidos — o que, convenhamos, já indica que talvez nem devesse ser um script — aí sim, manda ver, com Go ou D que entregam performance quase total com muitos menos complicação e boiler plate que C++.

Estou sem tempo pra comentar decentemente e o seu também nem explorou tudo o que poderia, mas quero reforçar que isso faz pouco sentido real. Claro que dá pra usar e se a pessoa só sabe C++, isso é algo muito raro, até faria algum sentido mais prático do que necessidade. Várias argumentações da PO não fazem sentido, pelo menos para quem é experiente. E sim, Lua é ótima pra isso, e dá até pra gerar `exe` fácil se for muito necessário, resolve todas as questões que tenham alguma relevância (velocidade pra *script*...).
ai que tá qual versão do python você vai usar? pois o python tem atualizações frequentes pode cair na problematica de usar uma versão mais atualizada que outro. no C++ as mudanças levam tempo, nunca são breakchanges e novas features são adicionadas somente 1 vez por decada. --- STL do C++ é muito grande, equiparavel ao java.. muito maior que o Python, sem contar que você ainda tem beneficios de execução em comptime e muito mais polimorfismo maior que JS, Ruby ou Python. --- Binário isolado faz total sentido, pois você não fica dependente de shell script para fazer coisas mais complexas ao usar containers, vamos supor que tu usa um gerador de documentação como doxygen, se usa-se python ou js teria que buildar uma imagem apenas para usar um pequeno script de filtro. já fazendo um binário estatico você pode usar imagens prontas do docker hub.
Cara, última breaking change do Python foi há mais de uma década, e ainda tenho uns scripts rodando em Python 2 sem estresse. E sobre Docker, porque alguém vai criar uma imagem só pra rodar script? Qual a lógica? O script roda na mesma imagem que o source!!! Enfim cada um com seu malabarismo. Mas eu acho que rodar uma linguagem de script dentro do C++, faz muito mais sentido do que fazer scripts em C++. Mas claro, devo ser só mais um espertão
mano, ta dificil de tu entender esse bagui. casos que você não passou ou não sabe dizer uma solução mais eficiente chama de "malabarismo", isso é atitude pequena. se tu escreveu um código em Java, C, Python ou JS.. e ira gerar docs com doxygen, a imagem de doxygen (ex, da greenbone) não vem nenhuma linguagem de script além do shell original. (e nem deveria vir para manter a imagem limpa) se usar o proprio python do projeto para fazer um script de filtro você vai precisar criar um dockerfile só para geração de documentação. agora, se fazer um script de filtro escrito em uma linguagem compilada e montada dentro do volume sem precisar fazer nenhum docker build. ``` docker run --rm -v $(pwd):/app -w /app greenbone/doxygen:latest doxygen ``` dentro do Doxyfile ``` INPUT_FILTER = ./doxfilter ``` --- e denovo, se fez um script em python com features de 3.10 e a pessoa tem python 3.9 não ira rodar. agora além de existir pouca atualizações de features em C++ é padrão fazer checkagem se o recurso existe e é muito mais facil porque você verifica muitos de uma vez só.
Calma aí, amigo, só tô tentando ter uma conversa agradável. Entendi o ponto, mas acho que você é que não pegou o meu. Se já tem um ambiente de desenvolvimento, o Python faz parte dele, então nem precisa de Docker pra isso, certo? Ou você já vai ter uma imagem de build, então não precisa de outra só pra um script. Mas, olha, vai em frente se você acha que faz sentido. Já dei minha opinião. E, se ainda quiser insistir nessa ideia maluca, considere Go ou D, que permitem esse seu binário independente, seja lá o motivo, mas de forma muito mais ágil. D usa a STL de forma nativa, e a standard library do Go é uma delícia de usar. E de novo: a questão da portabilidade nem é tão robusta quanto parece quando há dependências dinâmicas. Escrever scripts em C++? Pra mim, é como fazer em Java ou C#.

Tenho usado C++ profissionalmente desde 2019 e de fato é uma linguagem bem poderosa. Trabalhei com algoritmos de SLAM e Visão Computacional e normalmente fazemos a prototipagem em Python e depois otimizamos para C++.

O que eu detesto em C++ é que nem sempre você consegue buildar as coisas de forma estática, pois depende se suas as libs que você usa foram buildadas de forma estática. Quando não, tenho que ficar movendo um montarel de .so kkk, mas faz parte.

O que eu também não gosto é que nunca encontrei um gerenciador de dependências simples para C++. A grande maioria das coisas tenho que buildar do zero e toma muito tempo. Já usei o VCPKG e Conan, são bons para projetos que não tem muita firula. Exemplo: tenho que buildar umas libs de TensorRT (NVIDIA), com OpenCV, GSTreamer, e etc...

Por isso que, para algumas coisas, tenho usado Go. Porque, por exemplo, tem um projeto que a gente precisou enviar um JSON para o SQS (Queue Service da AWS), fizemos em Python e depois movemos para C++, por causa de conflito de nomes entre algumas funções e variáveis, por falta do uso de namespaces nas libs, acabou que perdemos um tempão tentando buildar as libs da AWS com o resto do projeto. Aí decidimos usar Go pra criar um binário simples que só faz, literalmente, uma coisa, que é pegar o JSON do folder e enviar pro SQS. Mantemos a chave de envio da AWS em segredo, dentro do binário, restringimos o envio do JSON, ele tem que ter um formato específico pro cara não fazer maldade com nosso billing. E também temos avisos caso esteja ocorrendo envios maiores do que o normal, aí qualquer coisa a gente deleta a chave dele.

C++ foi a primeira linguagem que aprendi quando tinha 12~13 anos, é de fato algo que vai perdurar por muitos e muitos anos.

Eu uso C++ e GO pra linguagem de scripts. Uso GO quando tenho que trabalhar com strings e C++ pra algoritmos mais complexos.

Muito interessante, e faz muito sentido sim. Inclusive, dá até pra brincar um pouco nessa mesma linha com Java, e ainda gerar executáveis nativos com GraalVM.

Eu programo em C e C++ ANSI desde que comecei a faculdade em 1984. Admiro quem tem amor e disposição para usá-las. Seus argumentos foram bem robustos. Parabéns

comecei há pouco no C++ e tenho achado os resultados incríveis. principalmente pela velocidade de execução. eu criei uma rest api pra realizar ETL em alguns bancos de dados e, nossa, eu tive um ganho absurdo. 270 mil registros de uma tabela para outra externa emenos de 30 segundos. no php ou no node era mais de 15 minutos. empolguei e quero criar muito mais coisa. esse post super veio na hora certa. obrigado!

admito que nunca usei nada da famlia do "C" mas parece ser realmente interessante e um case a se pensar

O máximo da família C que brinquei foi aprender um pouco sobre C# e mexer um pouco com arduino, e até hoje não sei que linguagem aquele treco usa.

ele usa C++ só que sem a STL padrão do C++, é só o compilador, e os exemplos e comunicade tudo fazem códigos parecidos com C.
Arduino Core be like: 👀

Sinceramente sou um cara entusiasta de tecnologia principalmente linguagem, e penso o seguinte se resolve o problema então isso importa mais do que qualquer coisa.

Eu não sou expert em C, mas sinto mais facilidade em C do que usar C++, sinto a sintaxe mais agradável (estranho né, mas enfim é isso)

E dá familía C, o meu amorzinho 'kkkkk é o C#, você até me deu a ideia de criar um conteúdo parecido, porém com a linguagem C#.

Obrigado pelo conteúdo.

Caramba, que abordagem top para a lang. Muitas vezes a vemos como cascuda (o que não deixa de ser verdade) mas os pontos citados fazem muito sentido. Tem o ponto que c/c++ é basilar de muita tecnologia como python, nodejs etc.

Amei seu texto e sua forma de usar a linguagem, eu amo C e Cpp, acabei nao aprendendo muito delas, apenas softwares na faculdade com C, e apesar de ter tido que aprender outras langs para ganhar o pão nunca saiu do meu coração aprendelas e dominalas.

Infelizmente, fico receoso por conta do Rust, se valeria a pena eu aprender e dominar elas para trabalhar. Mas sei que elas vão existir por muitos anos e Cpp provavelmente vai traser memory safety na próxima versão.

Mas penso no ano que vem dar uma olhada nos conceitos de C, relembrar e partir pro Cpp pra desenvolver. acredito que ela não será deixada pelos próximos 5/10 anos.

Muito obrigado por reaver minha chama pelo C Family, sucesso a nois!