Pro: flessibile
o Contro: si deve eseguire il codice prima di scoprire gli errori e resta il dubbio
o che ci siano errori non scoperti perchè non sono stati effettivamente eseguiti.
Strong – Type System:
- Strong : rende difficile che errori di tipo di verifichino. Effettua un controllo rigoroso,
garantendo maggiore sicurezza ed affidabilità. Può essere statico o dinamico.
- Weak : non viene effettuato il controllo ditipo, il comportamento è ambiguo e non
segnala errori se vengono eseguite operazioni errate. Il comportamento risulta più
flessibile e tollerante agli errori ma una scarsa garanzia sui tipi.
Enumerazione : definizione di un nuovo tipo di dato con una serie di elementi predefiniti e
limitati. Questo permette di eseguire un type checking (limita I valori accettabili) e rende il
programma più leggibile.
Dope Vector : contiene informazioni sui vettori che sono allocati non statisticamente. Info come
primo elemento del vettore, lunghezza e altro. È memorizzato nella pate fissa dell’RdA.
Inferenza di tipo : meccanismo che permette di derivarte ilò tipo di un’espressione complessa,
a partire dal tipo dei suoi elementi elementari.
Equivalenza Tra tipi : Determina se due variabili hanno lo stesso tipo. Allora ogni variabile di
tipo T è anche una variabile di tipo S e viceversa e i due tipi sono perfettamente intercambiabili.
- Per nome : la più rigida. Gli deve essere stato assegnato lo stesso identificatore di tipo
- Per nome LASCA : meno rigida
- Strutturale : Se un tipo T definito come type T = espressione allora T è equivalente ad
espressione.
Conversione di tipo:
- Coercizione : implicita, eseguita automaticamente dal compilatore
- Casting : esplicita, rendono il comportamento del programma più chiaro. È da preferirsi
alla coercizione.
Polimorfismo: Una espressione può avere tipi diversi a seconda del contesto. Dunque si rende
una certa espressione indipendente dal tipo:
- Ad hoc, overloading : stesso simbolo può avere significati diversi e quello corretto viene
dedotto dal contesto.
Overloading dei metodi (java) : Si hanno più definizioni dello stesso metodi con
o significato diverso. La scelta viene fatta in base al numero e tipo degli
artgomenti.
- Universale (parametrico) : lo stesso codice può funzionare su tipi diversi. Favorisce il
riuso del codice, rendendolo indipendente dal tipo. In Java questo è possibile tramite
l’utilizzo dei generics <T>.
- Usando il modello a riferimento posso creare codice generico.
- La funzione map in scheme è un altro esempio di polimorfismo.
- Polimorfismo di sottotipo. T sottotipo di S, in ogni contesto, che accetta un oggetto di
tipo S, posso inserire un oggetto di tipo T.
PRO: Favorisce il riuso del codice e lo rende generale. Sicuro, type checking efficiente
Ereditarietà singola : una classe può ereditare soltanto da una classe base
Ereditarietà multipla : la classe può avere più superclassi dirette
Contro : problema del diamante : se due classi B, C ereditano da una classe A e D eredita
da B e C, se D chiama un metodo di A, da quale classe viene ereditato ?
Incapsulamento: Implementazione dell’information Hiding. Una classe non espone la struttura
interna ma unicamente l’interfaccia che permette di accedere in modo controllato agli attributi
interni (getter/setter).
Pro :
- favorisce la manutenzione interna del codice. Infatti la struttura interna del codice può
cambiare, a patto che la sua interfaccia resti invariata.
- Protegge i dati sensibili, favorisce la manutenibilità e la riusabilità (agevolando lo
sviluppo di software complessi)
- Fondamentale l’utilizzo delle clausole Private, Public.
Canali : nella programmazione concorrente, sono dei controllori di dispositivi che consentono
l’esecuzione concorrente di operazioni di I/O.
Che tipo di dati vengono memorizzati nell’Heap? Dati che necessitano di essere allocati e
deallocati dinamicamente (free, malloc), come oggetti di classi oppure oggetti di dimenisione
variabile. In tal caso la struttura a pila non sarebbe idonea ad ospitare tali tipologie di valori.
Perchè nella gestione dello heap esiste un problema di frammentazione? Perchè deallocando i
blocchi di memoria si creano dei vuoti. Inoltre, quando vengono assegnati, la dimensione dei
blocchi è standard e non calza perfettamente con quella richiesta, lasciando dei frammenti
inutilizzati. Alcuni sistemi come Buddy System cercano di risolvere questo problema. In
generale si ha una riduzione dell’efficienza della memoria.
Nello scoping statico, come si determina il binding valido? Viene basato sulla struttura del
codice sorgente, il che rende il comportamento del programma più prevedibile. Per accedere a
variabili non locali sarà sufficiente seguire il link statico che mi porterà all’ambiente della
procedura padre (chiamante).
Cosa si intende per scoping statico ? è un metodo di risoluzione per accedere a variabili non
locali che viene determinato dalla struttura del sorgente.
Quali sono i vantaggi dello scoping statico rispetto a quello dinamico? È prevedibile e
comprensibile. La visibilità delle variabili è determinata dalla struttura del codice e non dipende
dal contesto di utilizzo (dinamico). Più facile scoprire errori.
Cosa distingue un linguaggio funzionale puro da uno che non lo è? Non ha uno stato e non
prevede degli effetti collaterali (Haskel). Inotre I dati sono immutabili, il che significa che una
volta creati, questi non possono essere modificati.
Che cos’è una race condition ? Si verificano quqndo più processi tentano di accedere
contemporaneamente ad una risorsa condivisa.
Descrivere brevemente la notazione polacca diretta : + a b = a + b
Come viene definita la notazione polacca inversa? a b + = a + b
Nella programmazione concorrente, cosa sono le porte ? sono meccanismi di comunicazione
che consentono ai processi di scambiarsi informazioni in modo sicuro e coordinato. Infatti le
porte facilitano la sincronizzazione.
Cosa si intende per memorizzazione per colonne di una matrice? È uno dei due modi di
memorizzare nella memoria principale una matrice. In questo caso la colonna viene
memorizzata consecutivamente in memoria. Presenta vantaggi in operazioni in cui si necessita
di accedere ai valori per colonne.
Cosa si intende per memorizzazione per righe di una matrice? È uno dei due modi per
memorizzare in memoria una matrice. Le righe vengono memorizzate consecutivamente in
memoria. Viene considerato più efficente (e più diffuso).
Elencare alcuni meccanismi di sincronizzazione nella programmazione concorrente : Barriere,
Semafori, Mutua Esclusione, Monitor.
Quali sono I vantaggi della valutazione Eagar rispetto alla Lazy? Debugging semplice (le
espressioni vengono valutate immediatamente, dunque non ci sono dubbi). Utilizzo della
memoria prevedibile. Prestazioni prevedibili. In generale, il comportamento è più prevedibile.
Quali sono i vantaggi della valutazione Lazy rispetto alla Eagar? La valutazione lazy evita
valutazioni e calcoli inutili, esegue solo le espressioni necessarie. Dunque ha maggiore
efficienza computazionale. Poi presenta una migliore gestione della memoria e miglioramento
delle performance in alcuni casi.
Che tipo di Linguaggi vengono riconosciuti dagli analizzatori lessicali? Riconosce un qualsiasi
linguaggio che segue una grammatica formale, quali linguaggi di programmazione e linguaggi
di espressioni regolari.
Perché un comando "case" può essere più efficiente rispetto ad una serie di comandi if then
else ? Perchè la struttura è ottimizzata per garantire un accesso diretto al blocco di codice
opportuno, senza dover valutare ogni singola espressione dell’if-else. Valutazione in tempo
costante.
Il codice inotre tende ad essere più leggibile, scalabile e manutenibile.
Cosa si intende per mutua esclusione? È una condizione che garantisce che non si possano
verificare race conditions, ovvero se un processo sta accedendo ad una risorsa, nessun’altro
processo potrà accedervi contemporanemamente.
Descrivere in quali situazioni si verifica un deadlock. Situazione in cui due o più processi
rimangono bloccati in attesa l’uno dell’altro, bloccandone l’esecuzione reciproca. Si verifica
quando un processo detiene una risorsa e attende una risorsa che detiene un’altro processo.
Che cos’è una macchina virtuale? è un software che emula un computer, fornendo
un’astrazione dell’HW e SW. All’interno dell’ambiente virtuale è possibile eseguire più sistemi
operativi contemporanemante, dando l’illusione ad ognuso di loro di essere gli unici in
esecuzione nel sistema.
Cosa si intende per Slicing di un array ? Selezione di parti continue di un array in modo
efficiente e flessibile.
Che cos’è un blocco protetto? Porzione di codice all’interno della quale può essere invocatoa
un’eccezione. Generalmente è identificata dalle clausole Try-Catch.
Elencare le differenze tra la programmazione funzionale e quella imperativa.
- Una prevede effetti collaterali, l’altra no
- Una utilizza cicli, l’altra ricorsione
- Una esegue comandi, l’altra valuta espressioni.
Che cos’è un linguaggio regolare ? è un insieme di stringhe definite su un alfabeto; deve poter
essere definito tramite espressione regolare e riconosciuto da un automa a stati finiti. Vengono
utilizzati nel Pattern Matching, validazione di input e nel parsing dei linguaggi di
programmazione.
Nella gestione dello scoping dinamico, cosa si intende per CRT (tabella centrale
dell’ambiente)? Tabella a cui associo ad ogni variabile una pila, contenente tutte le
dichiarazionie attive in quel momento (variabili).
Quali sono le principali caratteristiche della programmazione orientata agli oggetti ?
L’incapsulamento, il polimorfismo e la possibilità di definire nuovi tipi di dato mediante le
classi.
Che tipo di linguaggi vengono riconosciuti dagli analizzatori sintattici ? Linguaggi regolari
(riconosciuti da analizzatori lessicali) e Linguaggi liberi dal contesto.
Che cos’è la chiusura di Kleene? È un’operazione sui linguaggi, che permette la
concatenazione di 0 o più istanze della stringa selezionata. Si esprime con il simbolo *
Come si distingue una comunicazione sincrona da una asincrona? Nella c. sincrona, il mittente
attende un feedback di ricezione del messaggio dal destinatario prima di proseguire con la
computazione (bloccante). Nella c. asincrona il mittende prosegue la computazione
indipendentemente.
Cosa si intende per PRAGMATICA di un linguaggio di programmazione ? chiarisce a cosa
serve un certo costrutto co
-
Appunti di Linguaggi di programmazione
-
Linguaggi di Programmazione - Appunti
-
Linguaggi di Programmazione - Appunti in LaTeX
-
Programmazione I - Appunti