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.