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.
-
repositório: https://github.com/gamelly/gly-type
-
resultado: https://gamelly.github.io/gly-type/
-
comando:
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++.
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.
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!