Compilare... uno script Bash?

Ciao a tutti,

so che gli script Bash vengono “interpretati” dal sistema e non compilati (nel senso classico del termine, come si fa cioè ad esempio con il C o il C++). Tuttavia il sistema stesso, nel momento in cui esegue lo script, deve comunque tradurlo, in definitiva, in lunguaggio macchina. La domanda è:

esiste un “tool” o una utility che faccia questo in “differita” anziché “al volo”? Cioè che crei una sorta di eseguibile dello script come accade quando un codice sorgente viene compilato? In parole povere: esiste un modo per avere uno script bash già “tradotto” in codice macchina e solo a quel punto eseguirlo? Lo scopo è provare a vedere se migliora l’efficienza.

Grazie, spero di essere stato chiaro…

non puoi compilarlo, nel senso classico.

esiste shc, che in realta’ non fa altro che fare l’encrypt, creando un wrapper in C.

Ovviamente non c’è nemmeno aumento di prestazioni

Peccato… in Python sembrerebbe possibile creare degli eseguibili, mi chiedevo se si poteva fare anche per Bash.
Evidentemente no.

Peccato perché “qualcuno” o “qualcosa” questo lavoro di “traduzione” script–>codice macchina lo deve comunque fare, solo che lo fa soltanto “al volo”, cioè al momento dell’esecuzione dello script stesso.

Ciao

Direi che la cosa ha poco senso.

Di per se la shell bash fa poco o nulla, per lavorare gli script devono sempre appoggiarsi su comandi esterni composti da eseguibili binari o da altri script in altri linguaggi, persino il banalissimo comando echo è un binario.

Anche incorporando questi numerosi comandi in un unico enorme file non si avrebbe alcun vantaggio dato che comunque i comandi andrebbero caricati in memoria ad ogni esecuzione e successivamente scaricati al loro termine.
Si avrebbe invece l’enorme svantaggio di dover ricompilare gli script ogni volta che uno dei comandi utilizzati cambia di versione / release.

Per l’efficienza occorre sempre orientarsi su linguaggi che mettano a disposizione librerie complete che evitino di dovere appoggiarsi pesantemente all’esterno.

Ciao Ciao, Moreno

Ho capito… Beh pensavo che anche questi richiami “esterni” potessero essere inglobati in un tutt’uno… e che questo aiutasse l’efficienza.

Comunque sei stato chiarissimo, grazie.

[quote]
Beh pensavo che anche questi richiami “esterni” potessero essere inglobati in un tutt’uno[/quote]
Allora non avrebbe senso “programmare” in bash, ci sono altri strumenti (C per esempio o altro).

Ogni linguaggio di programmazione ha una suo specifico ambito di utilizzo e oserei dire una sua filosofia di esecuzione, tentare di forzarlo per ottenere dell’altro sarebbe andare contro la natura del linguaggio stesso. Ne esistono altri per fare ciò che ti serve.

Sbaglio?

Sì ma non è che un linguaggio di programmazione si impara dall’oggi al domani. Se sapessi programmare in C di certo non mi sarei posto il problema.

Sono d’accordo, ma la sostanza non cambia.

[quote=twsfedora]
Sì ma non è che un linguaggio di programmazione si impara dall’oggi al domani. Se sapessi programmare in C di certo non mi sarei posto il problema.[/quote]

hum … non ho capito cosa intendi :slight_smile:

di certo non puoi pretendere che uno script di shell sia intercambiabile con un programma C

La shell è lo strumento con il quale l’operatore umano comunica istruzioni al kernel ad un livello di astrazione molto alto.

Un programma C è invece uno strumento tramite il quale, utilizzando i costrutti del linguaggio (nello specifico il C) implementi un algoritmo.

Il fatto che puoi fare un “Hello World” sia con il C che tramite uno script shell non implica che i due strumenti siano intercambiabili.

Ciao

Cominciamo con il dire che scrivere uno script bash ed un programma C hanno più o meno la stessa complessità anzi potrei quasi dire che scrivere uno script bash non banale, almeno per me, è anche più difficile.

Tutti i linguaggi sono estremamente formalizzati ed almeno per quel che riguarda le librerie base, anche molto chiari e dal comportamento ben standardizzato.

La scrittura di uno script bash non banale richiede invece la conoscenza profonda di molti comandi Linux con le loro decine di opzioni con il loro comportamento spesso molto “personale”.

In conclusione per fare un programma in C ci vuole un programmatore mentre per farlo in Bash ci vuole un sistemista, ovviamente io sono un programmatore.

Ciao Ciao, Moreno

in merito a questa affermazione quoto moreno: neanche lo scripting bash lo impari dall’oggi al domani, anzi neanche dopodomani.
Aggiungo solo che lo scripting è una vera arte che si impara con gli anni, e se fatta ad un certo livello unisce la figura e le competenze del sistemista a quelle del programmatore

Io un po’ di anni fa mi sono trovato ad affrontare un problema simile: script bash che stavano diventando troppo complessi e lenti! Mi serviva fare un processing di dati numerici su file. Ero partito con uno script semplice e poi come spesso accade, per non voler abbandonare uno strumento di partenza, mi son trovato a dover gestire calcoli, serie infinite di grep, pipe, cut, column ecc ecc! La soluzione è stata una via di mezzo: ho riscritto in C alcune funzioni, quelle sui calcoli e quelle di manipolazione di stringhe, richiamandole dallo script. Ho ridotto i tempi di elaborazione in maniera vertiginosa! Tieni conto che per manipolare una semplice stringa dovevo fare un serie di parecchi comandi tra pipe, un modo un po’ inefficiente per manipolare una stringa.

AWK, Perl PHP, Sed …
la bravura sta nello scegliere lo strumento giusto. e nel saperlo usare.

[quote=FuThAr]

AWK, Perl PHP, Sed …
la bravura sta nello scegliere lo strumento giusto. e nel saperlo usare.[/quote]

Quoto in pieno. Purtroppo talvolta uno deve fare i conti con solo ciò che ha e conosce :slight_smile: