|
Appunti informatica |
|
Visite: 1735 | Gradito: | [ Picolo appunti ] |
Leggi anche appunti:Le funzioniLe funzioni La funzione è l'unità elaborativa fondamentale dei programmi C. Disinstallare i tsrDisinstallare i TSR Sappiamo che, per un programma TSR, la capacità di disinstallarsi (liberando Gli interrupt: utilizzoGli interrupt: utilizzo Gli interrupt sono routine, normalmente operanti a livello |
Si è detto che il linguaggio di programmazione consente di esprimere gli algoritmi in modo 'umano', incomprensibile alla macchina, la quale è in grado di eseguire esclusivamente istruzioni codificate in modo binario, cioè con una sequenza di 1 e 0 (che rappresentano, a loro volta, la presenza o l'assenza di una tensione elettrica).
E' perciò indispensabile che il sorgente del programma (cioè il file contenente il testo scritto dal programmatore in un dato linguaggio di programmazione) venga elaborato e trasformato in una sequenza di codici binari significativi per l'elaboratore.
Gli strumenti generalmente utilizzati allo scopo rientrano in due categorie: interpreti e compilatori.
L'interprete è un programma in grado di leggere un sorgente in un certo linguaggio e, istruzione per istruzione, verificarne la sintassi, effettuarne la traduzione in linguaggio macchina e far eseguire al microprocessore della macchina il codice binario generato. La logica con cui l'interprete lavora è proprio quella di un interprete: se la medesima istruzione viene eseguita più volte (ad esempio perché si trova all'interno di un ciclo), ad ogni iterazione ne viene verificata la correttezza sintattica, ne è effettuata la traduzione, e così via. L'esecuzione del programma può essere interrotta in qualunque momento ed è possibile modificarne una parte, per poi riprendere l'esecuzione dal punto di interruzione. L'interprete è inoltre in grado di interrompere spontaneamente l'esecuzione quando rilevi un errore di sintassi, consentire al programmatore la correzione dell'errore e riprendere l'esecuzione dall'istruzione appena modificata.
E' facile intuire che la programmazione interpretata facilita enormemente le varie fasi di sviluppo e correzione del programma; tuttavia essa presenta alcuni pesanti svantaggi: il programma 'gira' lentamente (perché ogni istruzione deve essere sempre verificata e tradotta, anche più volte nella medesima sessione di lavoro, prima di essere eseguita) ed inoltre può essere eseguito solo ed esclusivamente attraverso l'interprete.
Un esempio classico di linguaggio interpretato (nonostante ve ne siano in commercio versioni compilate o miste) è il Basic.
Anche in questo caso l'obiettivo di fondo è tradurre in linguaggio macchina un sorgente scritto in un linguaggio di programmazione perché l'elaboratore sia in grado di eseguirlo; tuttavia l'approccio al problema è sostanzialmente diverso.
Il sorgente viene letto dal compilatore, che effettua il controllo sintattico sulle istruzioni e le traduce in linguaggio macchina. Il risultato della traduzione è scritto in un secondo file, detto object file. Questo non è ancora eseguibile dal microprocessore, in quanto non incorpora il codice binario delle funzioni esterne al linguaggio: è dunque necessaria una fase ulteriore di elaborazione, alla quale provvede il linker, che incorpora nell'object file gli object file contenenti le funzioni esterne, già compilate in precedenza, solitamente raccolti in 'contenitori' detti librerie. Il linker produce in output un terzo file, il programma vero e proprio, direttamente eseguibile dal microprocessore con la sola intermediazione del sistema operativo.
Per eseguire il programma, dunque, non servono né compilatore o linker, né, tantomeno, il file sorgente.
I vantaggi rispetto all'interprete, in termini di velocità e semplicità di esecuzione, sono evidenti, a fronte di una maggiore complessità del ciclo di sviluppo. Infatti il compilatore, nel caso in cui rilevi errori nel sorgente, li segnala e non produce alcun object file. Il programmatore deve analizzare il sorgente, correggere gli errori e ritentare la compilazione: detta sequenza va ripetuta sino a quando, in assenza di segnalazioni d'errore da parte del compilatore, viene prodotto un object file pronto per l'operazione di linking. Anche in questa fase potranno verificarsi errori: il caso classico è quello della funzione esterna non trovata nella libreria. Anche questa volta occorre analizzare il sorgente, correggere l'errore (il nome della funzione potrebbe essere stato digitato in modo errato ) e ripetere non solo il linking, ma anche la compilazione.
Solo in assenza di errori tanto nella fase di compilazione quanto in quella di linking si può ottenere un file eseguibile; in altre parole: il programma funzionante
Il C rientra a pieno titolo nella folta schiera dei linguaggi compilati (insieme a Cobol e Fortran, per fare un paio di esempi).
Come si vede, sia il compilatore che l'interprete portano con sé vantaggi e svantaggi peculiari. Quale delle due tecniche utilizzare, allora?
Al riguardo si può osservare che la finalità di un programma non è 'essere sviluppato', ma servire 'bene' allo scopo per il quale viene creato; in altre parole esso deve essere semplice da utilizzare e, soprattutto, efficiente. La scelta del compilatore è quindi d'obbligo per chi intenda realizzare applicazioni commerciali o, comunque, di un certo pregio.
L'interprete si pone quale utile strumento didattico per i principianti: l'interattività nello sviluppo dei programmi facilita enormemente l'apprendimento del linguaggio.
In molti casi, comunque, la scelta è obbligata: per quel che riguarda il C, non esistono in commercio interpreti in grado di offrire un valido supporto al programmatore, al di là dell'apprendimento dei primi rudimenti del linguaggio. L'utilizzo del compilatore è imprescindibile anche per la realizzazione di programmi semplici e 'senza troppe pretese'; va osservato, in ogni caso, che compilatore e linker sono strumenti con i quali è possibile raggiungere elevati livelli di efficienza e produttività anche in fase di sviluppo, dopo un breve periodo di familiarizzazione.
Un errore di tale genere non può essere individuato dal compilatore, proprio perché si tratta di una funzione esterna al linguaggio, e come tale sconosciuta al compilatore, il quale non può fare altro che segnalarne all'interno dell'object file il nome e il punto di chiamata e scaricare il barile al linker.
Appunti su: |
|