Ha senso scrivere script di compilazione in C ++?


15

Sto usando CMake per generare i miei progetti IDE / makefile, ma devo ancora chiamare "script" personalizzati per manipolare i miei file compilati o persino generare codice.

In progetti precedenti ho usato Python ed era OK, ma ora ho seri problemi a gestire molte dipendenze in due progetti molto grandi su cui sto lavorando, quindi voglio minimizzare le dipendenze ovunque.

Qualcuno mi ha suggerito di usare C ++ per scrivere i miei script di build invece di aggiungere una dipendenza dal linguaggio solo per quello. I temi stessi del progetto usano già C ++, quindi ci sono molti vantaggi che posso vedere:

  • per costruire l'intero progetto, sarebbero necessari solo un compilatore C ++ e CMake, nient'altro (tutte le altre dipendenze sono C o C ++);
  • La sicurezza di tipo C ++ (quando si utilizza il C ++ moderno) rende tutto più facile da ottenere "corretto";
  • è anche la lingua che conosco meglio, quindi mi sento più a mio agio anche se sono in grado di scrivere del buon codice Python;
  • potenziale guadagno nella velocità di esecuzione (ma non credo che sarà realmente percepibile);

Tuttavia, penso che potrebbero esserci alcuni inconvenienti e non sono sicuro del reale impatto in quanto non ho ancora provato:

  • potrebbe essere più lungo scrivere il codice (detto che non sono sicuro perché sono abbastanza efficiente in C ++ per scrivere qualcosa che funzioni rapidamente, quindi forse per questo sistema non sarebbe così lungo scrivere) (il tempo di compilazione non dovrebbe ' essere un problema per questo caso);
  • Devo presumere che tutti i file di testo che leggerò come input sono in UTF-8, non sono sicuro che possano essere facilmente controllati in fase di esecuzione in C ++ e il linguaggio non lo controllerà per te;
  • le librerie in C ++ sono più difficili da gestire rispetto ai linguaggi di scripting;

Mi manca esperienza e lungimiranza, quindi forse mi mancano vantaggi e svantaggi. Quindi la domanda è: ha senso usare C ++ per questo? hai esperienze da segnalare e vedi vantaggi e svantaggi che potrebbero essere importanti?


1
A seconda di un interprete di una sola lingua per la build , non sembra poi così male, soprattutto perché è Python - molto portatile, diffuso su Linux e facilmente disponibile su Windows. Se hai bisogno di ulteriori librerie Python, puoi usare virtualenv e non aggiungerà altro che un file Python (che potresti spedire) una connessione Internet e un po 'di impianto idraulico per impostare virtualenv, installarli in, ed eseguire il tuo effettivo costruire script in quell'ambiente. Potresti passare a uno script aggiuntivo nella tua build e a una connessione Internet come requisito.

Puoi indovinare la codifica del testo con un'affidabilità abbastanza buona.
DeadMG

@DeadMG Sì, ma farlo a mano se funziona troppo (se vuoi una buona ipotesi e non limitarti a "è questo ASCII o Unicode, e se è Unicode, quanti bit e quale ordine di byte?") E l'aggiunta di un'altra dipendenza (se esiste una libreria libera e indipendente per questo) sconfigge il punto di cadere in C ++ per interrompere a seconda di Python.

@delnan Sì, ma è ancora in più lingue da installare. Dalla tua descrizione, qualsiasi dipendenza aggiuntiva non sembrerebbe "troppo male", ma lo sto considerando perché c'è già molto da gestire, quindi forse può aiutare a limitare anche le lingue utilizzate. Uso anche un linguaggio di scripting incorporato (implementato in C ++ direttamente nel progetto), javascript / HTML / CSS, XML e altri formati che sono già molto da tenere a mente.
Klaim

2
cosa userete per costruire il vostro script di compilazione c ++?
jk.

Risposte:


24

Usa Python.

Sviluppo in C ++ e eseguo i miei script di build in Python, e troverei doloroso fare script di build in C ++:

  • Python rende banale manipolare dizionari, elenchi, dizionari nidificati di dizionari di elenchi, ecc. (Ad esempio, uno dei miei script utilizza una gerarchia multilivello di tutti i miei strumenti, versioni di strumenti e percorsi di versioni di strumenti. ) Il C ++ può fare lo stesso con modelli e classi personalizzate, ma è molto più dettagliato (che si traduce in più righe di codice, che generalmente si traduce in una minore produttività).
  • Python fornisce librerie e routine di alto livello come gestione XML, JSON, sottoprocesso e os.walk . Ancora una volta, C ++ può farlo, ma è molto più lavoro per trovare le librerie, apprendere le loro API, assemblare correttamente le chiamate (che sono spesso di livello inferiore), ecc.
  • Gli script di compilazione sono un'attività senza valore aggiunto (prendere in prestito un termine da lean). È meglio usare una lingua il più alto livello possibile, per farli eseguire il più rapidamente possibile, per tornare al lavoro a beneficio dei tuoi utenti.
  • Nella mia esperienza, costruire script tende a crescere in modi imprevisti. Anche se un'attività sembra inizialmente semplice per C ++, può diventare complicata in fretta. Quando si presenta un nuovo requisito, è spesso molto più semplice gestire la gestione in uno script Python che farlo in C ++ (che potrebbe richiedere la ricerca o la lettura di nuove API di libreria, ecc.).

Per quanto riguarda i vantaggi che elenchi per C ++:

  • L'aggiunta di una singola dipendenza (Python) non dovrebbe complicare significativamente la tua build. È già standard sulla maggior parte delle installazioni Linux, ad esempio. Grazie alle librerie "batterie incluse" di Python, potrebbe persino essere più facile da gestire rispetto alle librerie C ++ da cui dipenderebbero gli script di compilazione.
  • La sicurezza del tipo fornita da C ++ è molto utile per progetti di grandi dimensioni, non per piccoli script.
  • Python integra molto bene il C ++ (di alto livello rispetto al livello inferiore, digitato in modo dinamico rispetto a quello statico, ecc.) E può persino integrarsi molto bene con C ++ (grazie a SWIG e Boost.Python) se in seguito lo desideri, quindi è vale la pena imparare per un programmatore C ++.
  • Come hai detto, la velocità di esecuzione dovrebbe essere un problema.

Lo abbiamo fatto (build in python) dopo un anno di lotte con cmake in un progetto cross paltform. Alla fine non ci siamo nemmeno preoccupati di provare a fare il controllo della dipendenza (la parte più complessa di una build). Poiché per le build automatizzate vuoi comunque ricostruire tutto e in C ++ ci sono così tante dipendenze complesse
Martin Beckett

1

Credo che questa sia una domanda specifica per ogni caso. Direi che non esiste una risposta corretta se abbia senso usare o meno C ++ per creare script, l'unico modo per capirlo è provarlo in pratica.

Personalmente vedrei Python superiore al C ++ a causa della migliore espressività del linguaggio e degli strumenti di libreria standard più semplici (opinione personale, ovviamente) per gestire il compito di manipolare i file binari e generare codice. Naturalmente, potrebbero essere disponibili librerie sofisticate sviluppate per l'attività, ma in caso contrario, scommetterei personalmente che Python sia la risposta "più spesso corretta", in generale.


1

Non scrivere script da soli, stai duplicando lo sforzo e reinventando le ruote.

Usa qualcosa come SCONS o anche Maven 3 che supporta i sistemi di build C ++ .

Un buon sistema di compilazione, indipendentemente dal linguaggio, non dovrebbe richiedere una logica personalizzata sotto forma di script per creare un artefatto eseguibile funzionante.

Se devi scrivere script per un sistema di build per personalizzarlo, non è un buon sistema di build. Scrivere un plugin per un sistema di compilazione è una storia diversa, ma dovrebbe comunque essere molto particolare per un ambiente / hardware, e dovrebbe essere qualcosa a cui raramente si ricorre.


1
Come ho spiegato, sto già usando cmake ma ho ancora bisogno di script personalizzati da fare. Sto parlando di quegli script personalizzati, non del processo di compilazione stesso.
Klaim

1
Adoro Maven: la sceneggiatura necessaria per costruire un programma C "Hell World" è più lunga del programma!
quant_dev,

@quant_dev, ricordo la prima volta che ho esaminato l'utilizzo di Maven, sulla loro stessa pagina web, mi consigliano di iniziare con qualcuno che conosce già Maven, poiché è difficile da configurare la prima volta. Questo è stato il primo segnale che non volevo assolutamente avere nulla a che fare con questo!
Brady,

Mi è piaciuto SCons, è un po 'lento ma molto facile da usare.
quant_dev,

1
@JarrodRoberson Ho usato gli "script" in modo troppo libero. Intendo i suoi file di configurazione. Non sono sicuro che essere dichiarativi renda Maven automagicamente più portatile e più facile da mantenere. Lo rende tuttavia meno flessibile, il che può essere una seccatura in grandi progetti.
quant_dev,

0

Per concentrarsi sulla domanda:

Ha senso scrivere script di compilazione in C ++?

La risposta è un semplice no .

La risposta attualmente accettata viene ingrandita in Python ed elenca tutta una serie di validi dubbi, ma vorrei aggiungere un motivo indipendente dalla lingua:

Davvero non si vuole lo script qualsiasi cosa in qualsiasi linguaggio compilato se si può farne a meno:

  • Avrai bisogno di uno script per avviare lo script!
  • Oppure avresti bisogno di controllare lo script compilato nel controllo del codice sorgente (e tenerlo sincronizzato con il codice sorgente archiviato!)
  • Lo script ha improvvisamente anche una configurazione di build per lo script allegato. (Questo deve essere mantenuto!)

Inoltre, andando con l'altra risposta:

Probabilmente anche tu non vuoi usare un linguaggio di scripting "grezzo" per creare i tuoi script di build (ho capito che le complessità del C ++ sarebbero gestite da CMake).

Quello che probabilmente dovresti fare è scegliere una delle Build . Sistemi . fuori . . e vedere se uno si adatta al tuo conto. programmabilità / estensibilità / play-nice-with-CMake / crossplatformness.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.