- Programmazione » Programmazione » Guida C - Manuale programmazione con articoli e risorse interessanti
La produzione dei programmi C: sviluppare software
Linguaggi interpretati e compilati
Si è detto che il linguaggio di programmazioneconsente di esprimere gli algoritmi in modo "umano", incomprensibile alla macchina, la quale è in gradodi eseguire esclusivamente istruzioni codificate in modobinario, cioè con una sequenza di 1 e 0 (cherappresentano, a loro volta, la presenza o l'assenza diuna tensione elettrica).
E' perciò indispensabile che il sorgente delprogramma (cioè il file contenente il testo scrittodal programmatore in un dato linguaggio di programmazione)venga elaborato e trasformato in una sequenza di codicibinari significativi per l'elaboratore.
Gli strumenti generalmente utilizzati allo scopo rientrano indue categorie: interpreti e compilatori.
L'Interprete
L'interprete è un programma in grado di leggere unsorgente in un certo linguaggio e, istruzione per istruzione,verificarne la sintassi, effettuarne la traduzione inlinguaggio macchina e far eseguire al microprocessore dellamacchina il codice binario generato. La logica con cuil'interprete lavora è proprio quella di un...interprete: se la medesima istruzione viene eseguitapiù volte (ad esempio perché si trovaall'interno di un ciclo), ad ogni iterazione ne vieneverificata la correttezza sintattica, ne è effettuatala traduzione, e così via. L'esecuzione delprogramma può essere interrotta in qualunque momentoed è possibile modificarne una parte, per poiriprendere l'esecuzione dal punto di interruzione.L'interprete è inoltre in grado di interromperespontaneamente l'esecuzione quando rilevi un errore disintassi, consentire al programmatore la correzionedell'errore e riprendere l'esecuzionedall'istruzione appena modificata.
E' facile intuire che la programmazione interpretatafacilita enormemente le varie fasi di sviluppo e correzionedel programma; tuttavia essa presenta alcuni pesantisvantaggi: il programma "gira" lentamente(perché ogni istruzione deve essere sempre verificatae tradotta, anche più volte nella medesima sessione dilavoro, prima di essere eseguita) ed inoltre puòessere eseguito solo ed esclusivamente attraversol'interprete.
Un esempio classico di linguaggio interpretato (nonostante vene siano in commercio versioni compilate o miste) è ilBasic.
Il Compilatore
Anche in questo caso l'obiettivo di fondo ètradurre in linguaggio macchina un sorgente scritto in unlinguaggio di programmazione perché l'elaboratoresia in grado di eseguirlo; tuttavia l'approccio alproblema è sostanzialmente diverso.
Il sorgente viene letto dal compilatore, che effettua ilcontrollo sintattico sulle istruzioni e le traduce inlinguaggio macchina. Il risultato della traduzione èscritto in un secondo file, detto object file. Questonon è ancora eseguibile dal microprocessore, in quantonon incorpora il codice binario delle funzioni esterne allinguaggio: è dunque necessaria una fase ulteriore dielaborazione, alla quale provvede il linker, cheincorpora nell'object file gli object file contenenti lefunzioni esterne, già compilate in precedenza,solitamente raccolti in "contenitori" dettilibrerie. Il linker produce in output un terzo file, ilprogramma vero e proprio, direttamente eseguibile dalmicroprocessore con la sola intermediazione del sistemaoperativo.
Per eseguire il programma, dunque, non servono nécompilatore o linker, né, tantomeno, il file sorgente.
I vantaggi rispetto all'interprete, in termini divelocità e semplicità di esecuzione, sonoevidenti, a fronte di una maggiore complessità delciclo di sviluppo. Infatti il compilatore, nel caso in cuirilevi errori nel sorgente, li segnala e non produce alcunobject file. Il programmatore deve analizzare il sorgente,correggere gli errori e ritentare la compilazione: dettasequenza va ripetuta sino a quando, in assenza disegnalazioni d'errore da parte del compilatore, vieneprodotto un object file pronto per l'operazione dilinking. Anche in questa fase potranno verificarsierrori: il caso classico è quello della funzioneesterna non trovata nella libreria. Anche questa voltaoccorre analizzare il sorgente, correggere l'errore (ilnome della funzione potrebbe essere stato digitato inmodo errato[1]) e ripetere non solo il linking, ma anche lacompilazione.
Solo in assenza di errori tanto nella fase di compilazionequanto in quella di linking si può ottenere un fileeseguibile; in altre parole: il programma funzionante[2].
Il C rientra a pieno titolo nella folta schiera deilinguaggi compilati (insieme a Cobol e Fortran, per fareun paio di esempi).
Quale dei due?
Come si vede, sia il compilatore che l'interprete portanocon sé vantaggi e svantaggi peculiari. Quale delle duetecniche utilizzare, allora?
Al riguardo si può osservare che la finalità diun programma non è "essere sviluppato" , maservire "bene" allo scopo per il quale vienecreato; in altre parole esso deve essere semplice dautilizzare e, soprattutto, efficiente. La scelta delcompilatore è quindi d'obbligo per chi intendarealizzare applicazioni commerciali o, comunque, di un certopregio.
L'interprete si pone quale utile strumento didattico peri principianti: l'interattività nello sviluppo deiprogrammi facilita enormemente l'apprendimento dellinguaggio.
In molti casi, comunque, la scelta è obbligata: perquel che riguarda il C, non esistono in commerciointerpreti in grado di offrire un valido supporto alprogrammatore, al di là dell'apprendimento deiprimi rudimenti del linguaggio. L'utilizzo delcompilatore è imprescindibile anche per larealizzazione di programmi semplici e "senza troppepretese"; va osservato, in ogni caso, che compilatore elinker sono strumenti con i quali è possibileraggiungere elevati livelli di efficienza eproduttività anche in fase di sviluppo, dopo un breveperiodo di familiarizzazione.
Dall'idea all'applicazione
Vale la pena, a questo punto, di descrivere brevemente levarie fasi attraverso le quali l'idea diventa programmaeseguibile, attraverso un sorgente C.
In primo luogo occorre analizzare il problema e giungere alladefinizione dell'algoritmo, scindendo il problemaoriginale in sottoproblemi di minore complessità.Banale, si tratta dell'unico approccio validoindipendentemente dal linguaggio utilizzato...
A questo punto ci si procura un editor, cioè unprogramma di videoscrittura, piu' o meno sofisticato, ingrado di salvare il testo prodotto in formato ASCIIpuro[3] e si inizia a digitare il programma. "Siinizia" perché può essere utile procedereper piccoli passi, scrivendone alcune parti, compilandole edeseguendole per controllo... insomma, meglio non metteretroppa carne al fuoco.
Dopo avere scritto una parte di programma di "sensocompiuto" , tale, cioè, da poter essere compilatae consolidata[4] onde controllarne il funzionamento, simette da parte l'editor e si dà il file sorgentein pasto (che di solito ha estensione .C) alcompilatore.
In genere il compilatore provvede a tutte le operazioninecessarie: lancia il preprocessore per effettuare lemacrosostituzioni necessarie, compila il sorgente così modificato[5] e, se non vi sono errori, lancia illinker, producendo in output direttamente il file eseguibile.
Nel caso in cui il compilatore segnali errori[6], illinker non viene lanciato e non è prodottol'object file, che in questo caso sarebbe inutilizzabile.Occorre ricaricare il sorgente nell'editor ed effettuarele correzioni necessarie, tenendo presente che a volte icompilatori vengono fuorviati da errori particolari, chedanno origine a molte altre segnalazioni in cascata. E'dunque meglio cominciare a coreggerli a partire dal primosegnalato; è possibile che molti altri scompaiano"da sé". A questo punto può esserenuovamente lanciato il compilatore.
Attenzione, però: il compilatore può segnalaredue tipi di errori: gli error ed i warning. Lapresenza anche di un solo error in compilazione impediscesempre l'invocazione del linker: si tratta per lopiù di problemi nella sintassi o nella gestione deitipi di dato per i quali è necessario l'interventodel programmatore. I warning, al contrario, non arrestano ilprocesso e viene pertanto prodotto comunque un fileeseguibile. Essi riguardano situazioni di ambiguitàche il compilatore può risolvere basandosi sui propristandard, ma che è opportuno segnalare alprogrammatore, in quanto essi potrebbero essere lamanifestazione di situazioni non desiderate, quali, adesempio, errori di logica. E' raro che l'eseguibilegenerato in presenza di warning funzioni correttamente, manon impossibile: alcuni messaggi di warning possono esseretranquillamente ignorati a ragion veduta.
Se gli errori sono segnalati dal linker, è ancoraprobabile che si debba intervenire sul sorgente e quindi
Il file eseguibile prodotto dal linker ha, in ambiente DOS,estensione .EXE o .COM. La scelta tra i duetipi di eseguibile dipende, oltre che dalle caratteristicheintrinseche del programma, anche dalle preferenze delprogrammatore. Avremo occasione di tornare su tali argomenti,esaminando i modelli di memoria e della strutturadegli eseguibili.
Ti potrebbe interessare anche
commenta la notizia
