Programmazione Modulare: concetti e tecniche per l'informatica universitaria

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

PROGRAMMAZIONE MODULARE
La programmazione modulare significa suddividere problemi principali in sottoproblemi
indipendenti tra loro.
Un problema caratterizzato da:
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.
MACCHINA CONCETTUALE
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.
ASTRAZIONE FUNZIONALE
Algoritmo
Dati di partenza
Risultati
viene suddiviso in un insieme finito di n sottoproblemi a differenti livelli caratterizzati
dalla tripla formula:
(D
i
,A
i
R
i
)
Differenziamo gli algoritmi per garantire la comprensione del nostro programma,
avendo:
Algoritmo coordinatore: il main
Algoritmi secondari: i sottoprogrammi, essi possono avere a loro volta livelli inferiori
e/o paralleli.
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.
PROGRAMMAZIONE MODULARE
1 / 9
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.
TECNICHE PER INDIVIDUARE I SOTTOPROBLEMI
Sono basate sul metodo di soluzione dei problemi affrontati
nella lezione 4 PROBLEMI COMPLESSI:
SOTTOPROGRAMMA
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:
UTILITA' DEI SOTTOPROGRAMMI
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.
Sviluppo top-down:
Metodo trial and error: Provare costantemente fino alla ricerca della
scomposizione ottimale.
Bottom-up:
Usato soprattutto nell'adattamento di algoritmi codificati già esistenti a nuove
situazioni
Sandwitch: Basato sulla cooperazione tra top-down e bottom-up.
prevede l'uso di risorse come le variabili
è costituito da istruzioni semplici e composte
Specifica come altri pezzi del programma possono utilizzarlo
PROGRAMMAZIONE MODULARE
2 / 9

Visualizza gratis il Pdf completo

Registrati per accedere all’intero documento e trasformarlo con l’AI.

Anteprima

Programmazione Modulare

La programmazione modulare significa suddividere problemi principali in sottoproblemi indipendenti tra loro.

Un problema caratterizzato da:

  • Algoritmo
  • Dati di partenza
  • Risultati

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:

  • Algoritmo coordinatore: il main
  • Algoritmi secondari: i sottoprogrammi, essi possono avere a loro volta livelli inferiori e/o paralleli.

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.

Macchina Concettuale

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.

Astrazione Funzionale

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.

Tecniche per Individuare i Sottoproblemi

Sono basate sul metodo di soluzione dei problemi affrontati nella lezione 4 PROBLEMI COMPLESSI:

  • Sviluppo top-down:
    • Metodo trial and error: Provare costantemente fino alla ricerca della scomposizione ottimale.
  • Bottom-up:
    • Usato soprattutto nell'adattamento di algoritmi codificati già esistenti a nuove situazioni
  • Sandwitch: Basato sulla cooperazione tra top-down e bottom-up.

Sottoprogramma

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:

  • prevede l'uso di risorse come le variabili
  • è costituito da istruzioni semplici e composte
  • Specifica come altri pezzi del programma possono utilizzarlo

Utilità dei Sottoprogrammi

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:

  • Leggibilità
  • Manutenibilità
  • Riuso

Definizione di Sottoprogramma

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.

Chiamata di Sottoprogrammi

La chiamata di un sottoprogramma provoca l'esecuzione delle istruzioni del sottoprogramma, sarà il programma chiamante ad attivarla.

  1. All'atto dell'attivazione dell'unità di programma, ovvero alla sua chiamata nel main o in altro sottoprgramma, viene sospesa l'esecuzione del programma chiamante e il controllo passa all'attività del sottoproblema (unità attivata).
  2. All'atto del completamento della sua esecuzione, l'attività termina portando il flusso di controllo al programma chiamante.

Chiamata Programma Chiamante Sottoprogramma Terminazione

Nidificazione Sottoprogrammi

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

Comunicazione tra Sottoprogrammi

I sottoprogrammi tra di loro comunicano attraverso lo scambio di dati e può avvenire con:

3/9PROGRAMMAZIONE MODULARE

  • L'ambiente esterno (con l'utente in output/input)
  • Con l'ambiente chiamante in modo:
    • Implicito(sconsigliato) -- > attraverso variabili globali
    • Esplicitamente(consigliato) -- > attraverso l'uso dei parametri locali che inserirà in input dal programma chiamante e che verranno tramutate in output dal sottoprogramma.

La comunicazione esplicita avviene sempre per un buon programma.

Chiamata con parametri (dati input) Programma Chiamante Sottoprogramma Terminazione con restituzione di valori di output

Variabili del Sottoprogramma

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:

Visibilità Statica

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.

Visibilità Dinamica

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. ==

Shadowing (Oscuramento)

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.

Visibilità dei Sottoprogrammi

Regole per la visibilità dei sottoprogrammi:

5/9PROGRAMMAZIONE MODULARE

  • Un identificatore è visibile nel sottoprogramma in cui è dichiarato e in tutti i sottoprogrammi locali ad esso nei quali è stato ridichiarato
  • Le risorse di un sottoprogramma devono essere dichiarate prima di essere usate (come un programma normale)
  • Le variabili globali possono essere viste da main e sottoprogrammi
  • Una risorsa (variabile) locale è visibile ad un sottoprogramma P solo dalle istruzioni di P e dagli eventuali sottoprogrammi che sono stati definiti in P

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à:

  • X
  • y locale
  • d locale
  • a tramite eredità di S cez

Delimitatori di un Sottoprogramma

Si dividono in due tipi di delimitatori:

  • DELIMITAZIONE SPAZIALE DI UNA RISORSA: La zona o campo di visibilità di codice in cui nel programma è possibile fare riferimento ad un identificatore è data dalle regole di visibilità
  • DELIMITAZIONE TEMPORALE DI UNA RISORSA: Le regole di visibilità definiscono anche quanto tempo rimane in vita una variabile, ovvero il tempo in cui un area della RAM è allocata per essa. Per questo la fase in cui è definita un'area di memoria per una variabile viene detta FASE DI ALLOCAZIONE. Normalmente il tempo di durata di una variabile è pari alla durata d'esecuzione del 6/9 I

Non hai trovato quello che cercavi?

Esplora altri argomenti nella Algor library o crea direttamente i tuoi materiali con l’AI.