Faz sentido escrever scripts de construção em C ++?

15

Estou usando o CMake para gerar meus projetos IDE / makefiles, mas ainda preciso chamar "scripts" personalizados para manipular meus arquivos compilados ou até mesmo gerar código.

Em projetos anteriores, eu estava usando Python e estava tudo bem, mas agora estou tendo sérios problemas para gerenciar muitas dependências em dois projetos muito grandes em que estou trabalhando, por isso quero minimizar as dependências em todos os lugares.

Alguém me sugeriu usar C ++ para escrever meus scripts de compilação, em vez de adicionar uma dependência de linguagem apenas para isso. Os próprios temas do projeto já usam C ++, então há várias vantagens que posso ver:

  • para construir o projeto inteiro, apenas um compilador C ++ e o CMake seriam necessários, nada mais (todas as outras dependências são C ou C ++);
  • A segurança do tipo C ++ (ao usar o C ++ moderno) torna tudo mais fácil de ser "correto";
  • é também a linguagem que conheço melhor, por isso estou mais à vontade com ela, mesmo que seja capaz de escrever um bom código Python;
  • ganho potencial na velocidade de execução (mas não acho que seja realmente perceptível);

No entanto, acho que pode haver algumas desvantagens e não tenho certeza do impacto real, pois ainda não tentei:

  • pode levar mais tempo para escrever o código (que disse que não tenho certeza porque sou eficiente o suficiente em C ++ para escrever algo que funcione rapidamente, então talvez para este sistema não demore muito para escrever) (o tempo de compilação não deve ser ' ser um problema para este caso);
  • Devo assumir que todos os arquivos de texto que vou ler como entrada estão em UTF-8, não tenho certeza de que possam ser facilmente verificados em tempo de execução em C ++ e o idioma não o verificará;
  • as bibliotecas em C ++ são mais difíceis de gerenciar do que nas linguagens de script;

Eu não tenho experiência e previsão, então talvez eu esteja perdendo vantagens e desvantagens. Portanto, a pergunta é: faz sentido usar C ++ para isso? você tem experiências a relatar e vê vantagens e desvantagens que podem ser importantes?

Klaim
fonte
1
Dependendo de um intérprete de linguagem única para a compilação, isso não parece muito ruim, principalmente porque é Python - muito portátil, difundido no Linux e facilmente disponível no Windows. Se você precisar de bibliotecas Python adicionais, poderá usar o virtualenv e ele não adicionará nada além de um arquivo Python (que você pode enviar) à conexão à Internet e um pouco de encanamento para configurar o virtualenv, instalá-los e executar o seu computador real. construir scripts nesse ambiente. Você pode obter um script extra em sua compilação e uma conexão à Internet como requisito.
Você pode estimar a codificação do texto com uma confiabilidade bastante boa.
DeadMG 04/04
@DeadMG Sim, mas fazê-lo com a mão se muito trabalho (se você quiser um bom palpite e não limitar-se a "é este ascii ou unicode, e se ele é unicode, quantos bits e que ordem byte?") E adicionar outra dependência (se houver uma biblioteca livre e independente para isso) impede o uso do C ++ para parar, dependendo do Python.
@delnan Sim, mas ainda está em mais idiomas para instalar. Pela sua descrição, qualquer dependência adicional não pareceria "muito ruim", mas estou considerando isso, porque já há muito o que gerenciar, então talvez possa ajudar a limitar os idiomas usados ​​também. Também uso uma linguagem de script incorporada (implementada em C ++ diretamente no projeto), javascript / HTML / CSS, XML e outros formatos que já são muito para se ter em mente.
Klaim
2
o que você usará para criar seu script de compilação c ++?
jk.

Respostas:

24

Basta usar o Python.

Desenvolvo em C ++ e faço meus scripts de construção em Python, e acho difícil criar scripts em C ++:

  • O Python torna trivial manipular dicionários, listas, dicionários aninhados de dicionários de listas etc. (Por exemplo, um dos meus scripts usa uma hierarquia de vários níveis de todas as minhas ferramentas, versões de ferramentas e caminhos de versões de ferramentas. ) O C ++ pode fazer o mesmo com modelos e classes personalizadas, mas é muito mais detalhado (o que se traduz em mais linhas de código, o que geralmente se traduz em menor produtividade).
  • O Python fornece bibliotecas e rotinas de alto nível, como manipulação, subprocesso e os.walk em XML e JSON . Novamente, o C ++ pode fazer isso, mas é muito mais trabalhoso encontrar as bibliotecas, aprender suas APIs, montar corretamente as chamadas (que geralmente são de nível inferior) etc.
  • Os scripts de construção são uma atividade sem valor agregado (para emprestar um termo do lean). É melhor usar um idioma de alto nível possível, fazê-lo o mais rápido possível, voltar ao trabalho que beneficia seus usuários.
  • Na minha experiência, scripts de construção tendem a crescer de maneiras imprevistas. Mesmo que uma tarefa pareça inicialmente simples para C ++, ela pode ser complicada às pressas. Quando um novo requisito surge, geralmente é muito mais simples aderir ao manuseio em um script Python do que em C ++ (o que pode exigir a localização ou leitura de novas APIs de bibliotecas, etc.).

Em relação às vantagens listadas para C ++:

  • Adicionar uma única dependência (Python) não deve complicar significativamente sua compilação. Já é padrão na maioria das instalações Linux, por exemplo. Graças às bibliotecas "baterias incluídas" do Python, pode ser ainda mais fácil gerenciar do que as bibliotecas C ++ das quais seus scripts de construção dependem.
  • A segurança de tipo fornecida pelo C ++ é mais útil para projetos grandes, não para pequenos scripts.
  • O Python complementa muito bem o C ++ (de alto nível versus baixo, tipado dinamicamente versus tipicamente estatístico etc.) e pode até se integrar muito bem ao C ++ (graças ao SWIG e Boost.Python), se você quiser fazer isso mais tarde. vale a pena aprender para um programador de C ++.
  • Como você disse, a velocidade de execução deve ser uma não emissão.
Josh Kelley
fonte
Fizemos isso (python builds) após um ano de luta com o cmake em um projeto cross paltform. No final, nem nos importamos em tentar fazer a verificação de dependência (a parte mais complexa de uma compilação). Uma vez que para compilações automatizadas que pretende reconstruir tudo de qualquer maneira e em C ++ há tantas dependências complexas
Martin Beckett
1

Eu acredito que essa seja uma pergunta específica de caso. Eu diria que não há resposta correta, se faz sentido ou não usar C ++ para criar scripts, a única maneira de descobrir isso é experimentá-lo na prática.

Pessoalmente, eu considerava o Python superior ao C ++ devido à melhor expressividade da linguagem e às ferramentas de biblioteca padrão mais fáceis (opinião pessoal, é claro) para gerenciar a tarefa de manipular arquivos binários e gerar código. É claro que bibliotecas sofisticadas desenvolvidas para a tarefa podem estar disponíveis, mas, se não, então eu pessoalmente apostaria que o Python seria a resposta "mais frequentemente correta" - em geral.

zxcdw
fonte
1

Não escreva scripts, você está duplicando o esforço e reinventando as rodas.

Use algo como SCONS ou mesmo o Maven 3, que tenha suporte para sistemas de compilação C ++ .

Um bom sistema de construção, independentemente da linguagem, não deve exigir lógica customizada na forma de scripts para construir um artefato executável em funcionamento.

Se você precisar escrever scripts para um sistema de construção para personalizá-lo, não será um bom sistema de construção. Escrever um plug-in para um sistema de compilação é uma história diferente, mas ainda assim deve ser muito particular para um ambiente / hardware e deve ser algo que raramente é utilizado.


fonte
1
Como expliquei, já estou usando o cmake, mas ainda preciso executar scripts personalizados. Estou falando desses scripts personalizados, não do processo de compilação em si.
Klaim
1
Eu amo o Maven - o script necessário para criar um programa C "Hell World" é mais longo que o programa!
quant_dev
@quant_dev, lembro-me da primeira vez em que usei o Maven, em sua própria página da web, eles recomendam começar com alguém que já conhece o maven, já que é difícil de configurar pela primeira vez. Esse foi o primeiro sinal de que eu não queria nada com isso!
Brady
Gostei do SCons, é um pouco lento, mas muito fácil de usar.
Quant_dev 28/05
1
@JarrodRoberson Eu usei "scripts" muito liberalmente. Quero dizer seus arquivos de configuração. Não tenho certeza se ser declarativo torna o Maven automagicamente mais portátil e mais fácil de manter. Torna-o menos flexível, porém, o que pode ser uma dor em grandes projetos.
Quant_dev 28/05
0

Para se concentrar na pergunta:

Faz sentido escrever scripts de construção em C ++?

A resposta é um simples não .

A resposta atualmente aceita amplia o python e lista um monte de preocupações válidas, mas eu gostaria de adicionar um motivo independente da linguagem:

Você realmente não deseja escrever nada em nenhum idioma compilado, se puder ajudá-lo:

  • Você precisará de um script para inicializar o script!
  • Ou você precisa verificar o script compilado no controle de origem (e mantê-lo sincronizado com as fontes registradas!)
  • De repente, o script também possui uma configuração de compilação para o script anexado. (Isso precisa ser mantido!)

Além disso, acompanhando a outra resposta:

Provavelmente você também não deseja usar uma linguagem de script "bruta" para criar seus scripts de construção (entendo que os meandros do C ++ seriam tratados pelo CMake).

O que você provavelmente deve fazer é escolher um dos Build . Sistemas . fora . . e veja se alguém se encaixa na sua conta. scriptability / extensibilidade / play-nice-with-CMake / crossplatformness.

Martin Ba
fonte