Documento sulla programmazione modulare, macchine astratte e gestione dei sottoprogrammi. Il Pdf, adatto per lo studio universitario in Informatica, esplora concetti come sottoproblemi, algoritmi coordinatori e la visibilità delle variabili, offrendo una panoramica completa sull'argomento.
Mostra di più9 pagine


Visualizza gratis il Pdf completo
Registrati per accedere all’intero documento e trasformarlo con l’AI.
La programmazione modulare significa suddividere problemi principali in sottoproblemi indipendenti tra loro.
Un problema caratterizzato da:
viene suddiviso in un insieme finito di n sottoproblemi a differenti livelli caratterizzati dalla tripla formula:
(Di,A¡Ri)
Differenziamo gli algoritmi per garantire la comprensione del nostro programma, avendo:
Si costruisce una gerarchia di macchine astratte, ove ciascuna delle quali realizza un compito specifico in modo autonomo, con le proprie variabili ed istruzioni, il quale compito sarà di utilitaria importanza per i livelli soprastanti. La macchina astratta si appoggia su un livello di macchina inferiore se esiste.
La MACCHINA INFERIORE rispetto a quella astratta è la base concreta su cui la macchina astratta si baserà. E' reindirizzabile al linguaggio macchina o assembly che viene eseguito dal processore del computer.
Anche chiamato Notional Machine:
La MACCHINA CONCETTUALE è un computer idealizzato e concettuale le cui proprietà sono implicate dai costrutti nel linguaggio di programmazione utilizzato.
La macchina concettuale è l'insieme delle regole e dei meccanismi che definiscono il funzionamento interno di un linguaggio.
Ogni volta che si crea un programma si genera una macchina virtuale/astratta/concettuale, la quale dipende dal linguaggio utilizzato e definisce come la macchina utilizzerà i dati presenti nel codice, poiché ogni linguaggio di programmazione ha una propria Macchina Concettuale. Questo ci fa comprende come è fondamentale comprendere che linguaggio utilizzare a seconda del problema che bisognerà risolvere.
1/ 9PROGRAMMAZIONE MODULARE Il programma viene visto come un nuovo operatore, il quale può gestire i dati. L'astrazione funzionale è la tecnica che permette di ampliare il repertorio di operatori disponibili.
Le astrazioni funzionali sono fornite dal linguaggio di programmazione ad alto livello e prendono nomi differenti a seconda del linguaggio usato.
Il loro scopo è creare diverse macchine astratte, dando un nome ad un gruppo di istruzioni e stabilendo il metodo per comunicare tra la macchina astratta e il resto del programma. Esse sono paragonabili a nuove istruzioni definite dall'utente per determinate esigenze; sono più complesse delle istruzioni base e ciascuna risolve uno specifico compito.
Sono basate sul metodo di soluzione dei problemi affrontati nella lezione 4 PROBLEMI COMPLESSI:
Corrisponde ad un algoritmo secondario che risolve un sottoproblema.
Il sottoprogramma è individuato da un nome (identificatore) e concorre alla risoluzione di un problema minore il quale è di supporto per la risoluzione di problemi più complessi, ben definito e non necessariamente fine a se stesso.
Il sottoprogramma rappresenta una unità concettuale con significato più ampio.
Il sottoprogramma:
Un programma viene diviso in sottoprogrammi, per rispettare la decomposizione creata nella fase di progettazione dell'algoritmo, ma specialmente perché lo stesso gruppo di istruzioni che rappresentano il sottoprogramma devono essere ripetute più volte durante il corso del programma, per questo si definiscono anche come blocchi ripetibili.
2/9PROGRAMMAZIONE MODULARE I sottoprogrammi sono fondamentali nella tecnica della programmazione poiché rendono ancora più qualitativo il software, aumentando la sua:
Il SOTTOPROGRAMMA è un'astrazione funzionale che consente di individuare gruppi di istruzioni che possono essere invocate esplicitamente e la cui chiamata garantisce che il flusso di controllo ritorni al punto successivo all'invocazione.
La chiamata di un sottoprogramma provoca l'esecuzione delle istruzioni del sottoprogramma, sarà il programma chiamante ad attivarla.
Chiamata Programma Chiamante Sottoprogramma Terminazione
Le risorse che usa un sottoprogramma, possono includere altri sottoprogrammi. Questo porta alla creazione di una gerarchia tra i programmi, realizzando una struttura ad albero con relazione padre-figlio.
P P1 P2 P3 P1.1 P1.2 P1.3 P 2.1 P 2.2
I sottoprogrammi tra di loro comunicano attraverso lo scambio di dati e può avvenire con:
3/9PROGRAMMAZIONE MODULARE
La comunicazione esplicita avviene sempre per un buon programma.
Chiamata con parametri (dati input) Programma Chiamante Sottoprogramma Terminazione con restituzione di valori di output
Ciascun sottoprogramma può utilizzare le proprie variabili locali (tra cui quelle interne al sottoprogramma e quelle temporanee all'avvio del sottoprogramma, queste ultime saranno distrutte alla fine del sottoprogramma per liberare spazio in memoria), le variabili globali, poiché definiti nel programma principale e le variabili dichiarate dai sottoprogrammi attualmente in esecuzioni, questo fenomeno prende il nome di visiblità dipendente.
La visibilità dipendente può essere di due tipi statico e dinamico:
La variabile statica dipende dalla struttura gerarchica delle dichiarazioni del sottoprogramma, ovvero da dove e come sono dichiarati i sottoprogrammi nel codice sorgente Il compilatore determina quali variabili sono visibili e accessibili in base alla loro posizione nel codice. Avviene in fase di compilazione, per ciò definita statica.
Ex: void funzioneA(){ int x=10; funzioneB(){ printf(x); } funzioneB(); }
In questo caso funzioneB può visualizzare x poiché il sottoprogramma è stato definito all'interno di funzioneA.
4/ 9PROGRAMMAZIONE MODULARE La visibilità dinamica dipende dall'ordine di chiamata dei sottoprogrammi durante l'esecuzione del programma Ovvero, le variabili accessibili dipendono da quali sottoprogrammi sono stati chiamati e in che ordine. Ciò viene determinato durante la fase di esecuzione, per ciò definita dinamica.
Ex: void funzioneB(int y) { printf(y); } void funzioneA(){ int x=10; funzioneB(x); } int main(){ funzioneA(); }
In output riceveremo il valore 10, poiché il programma funzionaA è stato chiamato prima di funzioneB, inoltre funzioneA passa come argomento x, in modo tale che sia visibile anche a funzioneB.
Come si evince anche i sottoprogrammi restituiscono un risultato e se ne deve specificare il tipo richiesto, il più comune e presente negli esempi precedenti è la procedura VOID.
== La procedura VOID è un valore di un sottoprgromma in cui non esiste area di memoria in cui sarà restituito un risultato, non è presente un allocazione di memoria per essa. ==
Diversi sottoprogrammi possono dichiarare risorse aventi lo stesso nome ma totalmente scorrelati tra loro, potendo avere anche tipo differente.
E' necessario verificare determinare quale variabile con lo stesso nome si sta facendo riferimento in un dato momento. La variabile considerata quindi sarà quella che è più vicina nel contesto di dichiarazione, ovvero la variabile dichiarata nel contesto più interno nella gerarchia dei sottoprogrammi sarà quella accessibile per il sottoprogramma; un altro fattore che determina la scelta della variabile considerata sarà l'ordine in cui i sottoprogrammi vengono chiamati.
Regole per la visibilità dei sottoprogrammi:
5/9PROGRAMMAZIONE MODULARE
Verifichiamo secondo questo esempio:
Vista di un Sottoprogramma Esempio Programma P x e y sono variabli globali . a-d sono varibili locali a S P x, y . x, w, a sono locali a U · x-a sono ridefinite in U . c, d, y, z sono locali a V . y è ridefinita in V · f - g sono variabil locali a T Q a, b S a, d T f, g · S può usare x, y, a, d · U può usare x(locale), y, w, a (locale) · V? R e, f U x, w, a V c, d, y, z
La risposta per V sarà:
Si dividono in due tipi di delimitatori: