Gli ambienti di sistema

Materie:Appunti
Categoria:Informatica

Voto:

1.5 (2)
Download:87
Data:21.02.2001
Numero di pagine:7
Formato di file:.doc (Microsoft Word)
Download   Anteprima
ambienti-sistema_1.zip (Dimensione: 107 Kb)
trucheck.it_gli-ambienti-di-sistema.doc     157.5 Kb
readme.txt     59 Bytes



Testo

Riassunto
Gli ambienti di sistema.
Il sistema operativo mette a disposizione alcuni ambienti software, detti anche programmi di utilità, concepiti per agevolare l’utente nella sua attività di programmazione. Talvolta l’insieme di moduli del sistema operativo e di questi ambienti software viene genericamente indicato con il termine di software di base.
Gli ambienti software di sistema comprendono:
♣ Editor di testi, che consentono di scrivere e modificare i programmi sorgente, ma anche ogni altro tipo di testo, che possono poi essere memorizzati su file e stampati;
♣ Compilatori, cioè i programmi che trasformano in codice macchina i programmi utente, scritti nei diversi linguaggi disponibili;
♣ Linker (Collegatori), sono programmi che svolgono un compito importante, unendo tra loro i risultati di compilazioni diverse;
♣ Interpreti, per l’esecuzione di programmi scritti in un linguaggio evoluto traducendo ed eseguendo un’istruzione per volta;
♣ Debugger, per l’individuazione degli errori di runtime o bachi (bug). Il programmatore può anche impostare dei breakpoint, in modo che un programma si arresti in corrispondenza dell’esecuzione di una istruzione precisa;
♣ Gestori di maschere per il data entry, che facilitano le operazioni di creazione e modifica degli archivi;
♣ Gestori delle comunicazioni, che riguardano le funzioni connesse con il collegamento tra risorse informatiche di tipo diverso, a piccole o grandi distanze.
1. Compilazione.
I linguaggi evoluti fanno impiego di oggetti identificati da nomi, per consentire una maggiore facilità d’uso. Infatti si possono assegnare nomi a variabili, procedure e funzioni, ed usarli per costruire programmi. È importante poter scrivere un unico programma che possa essere interpretato da varie macchine, anche se esse utilizzano linguaggi differenti, piuttosto che dover scrivere un programma diverso per ogni tipo di macchina.
La compilazione trasforma le istruzioni del linguaggio evoluto in codice macchina. Se le macchine target, dispongono di un compilatore per il linguaggio usato, è sufficiente eseguire la compilazione dello stesso codice sorgente su ciascuna per poter eseguire il codice oggetto che ne deriva. Quindi la compilazione svolge il compito di interfaccia tra l’algoritmo espresso in codice sorgente, e la macchina che comprende solo le istruzioni in codice oggetto. In pratica il compilatore trasforma le istruzioni del codice sorgente, che fanno uso di nomi, in istruzioni di codice oggetto, che possono solo far riferimento alle primitive di sistema e alle posizioni di memoria.
La traduzione del sorgente richiede due attività principali:
♣ Verifica della correttezza del programma, con segnalazione di errore di lessico e di sintassi. Un altro tipo di errore segnalato dal compilatore è l’impiego di un termine che identifica un elemento non dichiarato, per esempio una variabile.
♣ Generazione della versione tradotta del programma, scritta nel formato oggetto collegabile.
L’output della compilazione viene comunemente detto oggetto compilato.
Per programmi più grandi, diverse parti del programma vengono scritte separatamente, risiedono su diversi file e vengono compilate in momenti diversi: si parla allora di compilazione modulare e i diversi programmi sorgente vengono detti moduli.
Ogni compilatore che consenta la compilazione modulare impone delle regole alle quali attenersi nella scrittura del codice sorgente. Per esempio:
♦ si deve indicare esplicitamente quale tra i moduli da compilare contiene la sezione esecutiva del programma, detta main body (corpo principale), questo può avvenire per esempio attraverso una direttiva, cioè un simbolo particolare inserita nel programma sorgente;
♦ in ognuno dei moduli devono essere definiti tutti gli oggetti ai quali ci si riferisce. Le procedure o funzioni che vengono chiamate ma sono contenute in altri moduli devono essere definite attraverso la loro intestazione completa, seguita o preceduta da una parola riservata.
In pratica il compilatore deve essere in grado di capire se il codice sorgente che gli viene sottoposto è corretto.
Una generica istruzione in linguaggio macchina è costituita da:
♦ un codice operativo che identifica il tipo di operazione;
♦ uno o due operandi che indicano gli oggetti coinvolti nell’operazione.

Gli operandi sono posti in indirizzi di memoria, ai quali ci si riferisce in diversi modi:
♦ l’indirizzo assoluto di una parola di memoria è la posizione che questa occupa in memoria centrale all’istante di esecuzione del programma. In diverse esecuzioni del programma, questo può cambiare. Le istruzioni del programma hanno indirizzi assoluti nella seconda esecuzione maggiori di 500 rispetto alla prima.
♦ l’indirizzo rilocabile è l’indirizzo che una parola avrebbe se il programma fosse impiantato in posizione 0 (zero). In pratica l’indirizzo rilocabile è la distanza di una parola dalla prima parola del programma. Per passare dall’indirizzo rilocabile a quello assoluto basta quindi sommare al primo l’indirizzo di impianto del programma:
Indirizzo assoluto = Indirizzo rilocabile + Indirizzo di impianto.
♦ l’indirizzo autorilocante di un operando è espresso come la sua posizione relativamente all’istruzione che lo contiene. Per passare dall’indirizzo autorilocante a quello assoluto basta sommare all’indirizzo autorilocante l’indirizzo dell’operazione in esecuzione, contenuto nel contatore di programma (program counter):
Indirizzo assoluto = Indirizzo autorilocante + Indirizzo dell’operazione in esecuzione.
È importante osservare che il processore riconosce solo indirizzi assoluti e che quindi prima o poi, questi dovranno essere calcolati.
Se un programma in codice oggetto usa solo indirizzi autorilocanti, si dice costituito da position indipendent code (codice indipendente dalla posizione), perché gli indirizzi assoluti, quando il programma è in esecuzione, si possono calcolare indipendentemente dall’indirizzo di impianto.
Le caratteristiche dei moduli in formato oggetto collegabile sono le seguenti:
♥ le istruzioni sono scritte in linguaggio macchina;
♥ gli indirizzi relativi ad operandi sono in formato rilocabile;
♥ gli indirizzi degli operandi contenuti in altri moduli non sono definiti: essi infatti non possono essere determinati finché tutti i moduli non vengono uniti per formare un unico oggetto;
♥ contengono due tabelle, tabella degli ingressi e tabella degli oggetti esterni, che consentono di unire tra loro i moduli.
La tabella degli ingressi contiene l’elenco degli oggetti definiti entro il modulo e che possono essere usati dagli altri moduli.
Per ciascuno oggetto occorre specificare:
♥ il nome (della procedura o della variabile);
♥ il numero e tipo di parametri formali delle procedure o funzioni;
♥ il loro indirizzo rilocabile (nel caso di una procedura, l’indirizzo rilocabile della prima istruzione).
La tabella degli oggetti esterni contiene l’elenco degli oggetti usati nel modulo ma non definiti. Essa ha lo scopo di assegnare il valore corretto agli indirizzi rimasti indefiniti, una volta che i moduli vengano uniti.
Ogni procedura esterna viene descritta mediante:
♥ il nome;
♥ la lista degli indirizzi rilocabili dove compaiono istruzioni che richiamano la procedura;
♥ il numero ed il tipo dei parametri formali, come appaiono nell’intestazione, per poter effettuare il controllo sul matching (accordo) con i parametri effettivamente richiesti dalla procedura.
2. Linking.
Il linking o (linkage), cioè collegamento, viene eseguito sui file che contengono il programma nel formato oggetto collegabile e genera uno o più file di formato caricabile.
Il programma che esegue questa operazione si chiama linker (collegatore).
Il linker:
♥ verifica che non vi sia nessun mismatch (disaccordo) tra le caratteristiche degli oggetti nelle tabelle degli ingressi e nelle tabelle degli oggetti esterni;
♥ unisce i moduli, uno di seguito all’altro, calcolando i nuovi indirizzi rilocabili che risultano dalla somma dell’indirizzo così come appare nel modulo e nell’indirizzo della prima parola di ciascun modulo dopo il collegamento;
♥ assegna i valori corretti agli indirizzi lasciati indefiniti dal compilatore perché relativi ad oggetti esterni al modulo compilato.
In questo contesto si può esaminare una caratteristica del sistema operativo Windows, denominata con la sigla DLL (Dynamic Link Library, libreria per il collegamento dinamico).
Un programma per Windows non deve preoccuparsi di gestire tutti gli strumenti standard usati per realizzare le interfacce grafiche, in quanto queste sono già disponibili all’interno delle librerie. Usando strumenti di programmazione visuale il programmatore deve limitarsi a scegliere gli strumenti che desidera e collocarli in finestre generate automaticamente. Questo può avvenire grazie al fatto che il codice necessario a definire il comportamento dei tipici oggetti Windows è già disponibile in apposite librerie.
3. Rilocazione.
Il programma in formato caricabile, viene appunto caricato in memoria centrale per essere eseguito. L’indirizzo a partire dal quale esso viene caricato è come già detto, il suo indirizzo di impianto.
La rilocazione trasforma gli indirizzi rilocabili del programma in indirizzi assoluti sommando a ciascuno l’indirizzo di impianto.
Questo può avvenire in tre modi:
♠ se l’indirizzo di impianto è sempre lo stesso, ed è noto al linker, esso può provvedere direttamente alla rilocazione che è detta rilocazione statica. Questo ha però lo svantaggio di non consentire l’esecuzione del programma se per qualche motivo occorre cambiare l’indirizzo di impianto.
♠ se l’indirizzo di impianto può variare o non è noto al linker, la rilocazione può essere effettuata staticamente ogni volta che il programma viene caricato, prima di eseguirlo.
♠ nello stesso caso, si può invece ricorrere alla rilocazione dinamica, che si effettua calcolando gli indirizzi assoluti degli operandi nell’istante in cui l’istruzione che fa riferimento ad essi viene eseguita.
Qualora il compilatore generi codice autorilocante, l’operazione di rilocazione non è strettamente necessaria, in quanto tutti gli indirizzi possono essere calcolati dinamicamente ed in modo indipendente dall’indirizzo di impianto.
4. Esecuzione.
Giunti a questo punto il programma può essere eseguito. Restano da risolvere le indeterminazioni del programma quando esso è suddiviso in più file caricabili.
Quando nel corso dell’esecuzione si trova un riferimento ad un oggetto esterno, deve essere attivato un meccanismo che consenta di caricare in memoria la libreria corretta ed eventualmente rilocata, in modo che l’elaborazione possa proseguire. Un meccanismo adatto, può essere una tabella. Essa dovrà contenere i dati necessari alla corretta esecuzione della chiamata, quindi, il nome della libreria, l’identificativo della procedura richiesta e gli indirizzi dove si trovano i parametri che debbono essere trasmessi e dove si devono scrivere quelli ricevuti.

Esempio