Paradigmi di programmazione Flashcards

1
Q

Differenza tra un sistema di tipi e il type checking

A

Il sistema di tipi specifica il comportamento i/o delle funzioni mentre il type cheching verifica l’adeguatezza del comportamento i/o

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Quali sono le componenti di una macchina astratta?

A

Interprete, controllo, operazioni primitive e memoria

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Definizione di interprete

A

L’interprete è quel programma che prende in input il programma da eseguire e ispeziona la sua struttura per capire che cosa c’è da fare (A partire dal testo genera l’albero di sintassi astratta)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Che cos’è il RTS?

A

Il run time support sono una serie di strutture dati e sottoprogrammi che devono essere caricati sulla macchina host per permettere l’esecuzione del codice generato dal compilatore

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Come si dividono le fasi del compilatore?

A

Front end (Scanner, Parser, Type checker) e Back end

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Parla della structural Operational Semantics

A

E’ la relazione di transizione per descrivere il comportamento dei programmi, si divide in 3 parti:
1) Semantica -> descrizione del significato del linguaggio
2) Operazioni -> descrive il comportamento del programma attraverso i passi di valutazione
3) Strutturale -> definisce la relazione di transizione usando regole di inferenza strutturali

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Small-step e Big-step

A

Small-step esegue ogni singola operazione mentre il Big-step descrive in un unico passo l’intera computazione

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Come si possono memorizzare i campi nei record?

A

Allineamento dei campi alla parola (ovvero un campo per ogni parola) o memorizzazione in un packet record

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Che cosa significa polimorfismo per sottotipo?

A

Il polimorfismo per sottotipo si basa sul fatto che un dato di tipo t1 possa essere usato al posto di un dato di tipo t2 secondo questa regola:
- se S<:T allora ogni valore di tipo S può anche essere di tipo T

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Qual è la differenza tra covariante e contravariante?

A

Nel subtyping delle funzioni la relazione di tipo è contravariante inverte la relazione d’ordine mentre covariante la rispetta

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Cos’è un ADT e quali sono le sue caratteristiche

A

Un ADT consiste in un insieme di dati e una collezione di operazioni per operare su questi dati
Abbiamo tre caratteristiche principali:
-Estendibili
-Astratti
-Incapsulati

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Da che cosa sono caratterizzati gli oggetti?

A

Da uno stato (proprietà), funzionalità (metodi), identità, ciclo di vita e locazione di memoria

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Quali sono i concetti fondamentali dell’OOP?

A

Incapsulamento, Astrazione, Interfaccia, Ereditarietà, Principio di sostituzione e polimorfismo

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Quali sono le principali differenze tra Object based e Class based?

A

Object based: permette di creare e manipolare oggetti senza implementare classi, rende difficile determinare il tipo dell’oggetto a tempo di esecuzione, ogni oggetto mantiene una lista di prototipi e structural subtyping
Class based: si devono implementare le classi prima di creare gli oggetti ma gli oggetti hanno il tipo denominato dalla classe, permette di definire estensioni di classi e superclassi e subtyping nominale

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Cosa si intende per type Weakening e come si può risolvere?

A

il tipo della variabile non è chiaro al momento della dichiarazione e il type checker indebolisce temporaneamente il tipo inferito che viene ricalcolato appena possibile a tempo di esecuzione e si risolve facendo una type annotation ovvero una forzatura del tipo che preferiamo

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Cosa si intende per type coercion?

A

Si esegue una forzatura di tipo e si tratta l’espressione come se fosse di quel tipo

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Cosa si intende per composizionalità in Java?

A

Quando possiamo modificare la classe senza compromettere il resto del programma e l’interfaccia pubblica della classe

18
Q

Qual è la differenza tra membri statici e d’istanza?

A

I membri statici codificano informazioni di classe ovvero variabili condivise tra tutti gli oggetti che sono istanze di quella classe, è presente una sola volta in memoria e può accedere solo a variabili statiche
I membri d’istanza codificano lo stato di ogni singolo oggetto e creano metodi che lavorano su di esso, esiste una variabile d’istanza in memoria quanti sono gli oggetti

19
Q

Che cos’è un interfaccia in java?

A

Un interfaccia in java contiene una specifica astratta della classe ovvero i membri pubblici della classe

20
Q

Com’è suddivisa la memoria?

A

Ambiente delle classi, Stack e Heap

21
Q

Descrivi il fenomeno dell’aliasing

A

Stesse celle di memoria sono associate a nomi simbolici diversi nel codice

22
Q

Descrivi l’overriding e l’overloading

A

L’overriding si ha quando si vanno a sovrascrivere i metodi di una superclasse mentre l’overloading si ha quando si definiscono due metodi con lo stesso nome ma firme diverse

23
Q

Parla del dynamic dispatch e della sua implementazione

A

Il dynamic dispatch è la regola che si usa per ricercare un metodo: partendo dalla classe corrente e risalendo la gerarchia, fino ad arrivare ad Object. Si implementa con:
-tabelle di metodi (dispatch vector)
-sharing strutturale
I passi della sua esecuzione sono i seguenti:
-Il compilatore determina l’offset del metodo nella tabella (corrisponde alla posizione in tabella)
-L’offset è determinato sul tipo apparente dell’oggetto
-A tempo di esecuzione la JVM accede alla tabella della classe che è tipo effettivo usando quell’offset
-Anche se il tipo effettivo dovesse essere diverso da quello apparente, corrisponderà comunque ad una sua
sottoclasse, e grazie allo sharing strutturale la JVM accederà comunque al metodo giusto
-Se la sottoclasse ha fatto overriding del metodo, il puntatore che si troverà in tabella riferirà alla nuova versione del metodo

24
Q

Che cos’è il diamond problem e quali sono le principali risoluzioni?

A

Ereditare da due superclassi che hanno una superclasse in comune può portare a variabili d’istanza duplicate e metodi duplicati. Le principali risoluzioni sono: l’ereditarietà multipla (c), interfacce (java), algoritmo C3 (python) e mixin (dart)

25
Che cos'è una itable e quali sono i vantaggi e gli svantaggi di questo approccio?
In java abbiamo ereditarietà singola + interfacce e introduciamo l'itable per gestire interfacce multiple. Di pro ha che questa soluzione è trasparente al programmatore ma java non consente un uso illimitato dei meccanismi di ereditarietà. Se la classe implementa molte interfacce l'efficienza diminuisce
26
Come vengono gestiti il dynamic dispatch e la multipla ereditarietà in python?
In python si utilizza l'algoritmo MRO, methot resolution order, che prevede una linearizzazione della gerarchia della classe. Questo algoritmo si basa su tre principi: -determinismo -conservazione dell'ordine locale -monotonia
27
Come viene gestito il diamond problem in c?
il diamond problem viene gestito attraverso la duplicazione della superclasse con attributo virtual in modo da non avere la doppia istanza
28
Quali sono le fasi di sviluppo di un programma in java?
Definizione della gerarchia, identificazione dei membri pubblici, definizione delle specifiche, implementazione di programmi di testing, definizione dei membri privati e implementazione del codice delle classi
29
Che cosa enuncia il principio di sostituzione di Liskov e perché è diverso dalla subsumption
Il principio enuncia che un oggetto di un sottotipo può sostituire un oggetto del super tipo senza andare a influire sul comportamento dei metodi del supertipo. Il principio di Liskov deve valere per tutti i possibili contesti in cui la sostituzione può avvenire e quindi è un problema indecidibile
30
Quali sono le regole indotte dal principio di Liskov?
Le regole sono 3: 1) Regola della segnatura -> le firme dei metodi del sottotipo devono essere compatibili con le firme dei metodi del supertipo e gli oggetti del sottotipo devono avere tutti i metodi del supertipo 2) Regola dei Metodi -> le chiamate ai metodi del sottotipo devono comportarsi come le chiamate a i metodi del supertipo 3) Regola delle proprietà -> le proprietà devono essere mantenute tra sottotipo e supertipo
31
Qual è la differenza tra il controllo di un array e quello di una generics?
negli array si utilizza un controllo dinamico perché ogni array ha nel proprio descrittore il tipo dinamico, mentre nelle generics il controllo è statico poiché, non valendo al covarianza, l'errore viene dato a causa dei tipi statici diversi.
32
Che cos'è una wildcard in java?
Una wildcard è una variabile di tipo anonimo, infatti se abbiamo garantita l'unicità del tipo possiamo parametrizzare il tipo con ? e utilizzare qualunque tipo
33
Cos'è il type erasure e che cosa comporta?
Tutti i tipi generici sono trasformati in object a tempo di compilazione e questo porta alla perdita del tipo effettivo a run time
34
Che cos'è JCF e quali sono i principali vantaggi
Il java collection framework definisce una gerarchia di di interfacce e classi che utilizzano collezioni. I vantaggi principali sono: -Uso di strutture standard con algoritmi testati -Efficienza implementazioni -Interoperabilità -Riuso del software
35
Che cos'è un iteratore e come si possono implementare in java?
Un iteratore è un astrazione che permette di estrarre uno alla volta gli elementi delle collezione senza esporne la rappresentazione. Può essere implementato così: public interface Iterator { boolean hasNext(); E next(); void remove(); }
36
Com'è suddivisa la memoria?
Static area, heap e stack
37
Quel è la differenza tra allocazione statica e dinamica?
Quando alloco staticamente do un indirizzo assoluto che viene mantenuto per tutta l'esecuzione del programma come per le variabili globali mentre con allocazione dinamica ogni istanza di funzione a run time ha un record di attivazione che contiene le sue informazioni
38
Che cos'è l'Heap? enuncia qualche sua caratteristica
L'heap è una regione di memoria nella quale i blocchi possono essere allocati e deallocati in qualunque momento. Con dimensione dei blocchi fissa l'heap è suddiviso in parti grandi quanto la dimensione del blocco e quando la memoria viene deallocata viene restituita alla lista libera, mentre se i blocchi hanno dimensione variabile, inizialmente l'heap è un unico grande blocco e si vanno ad inserire i vari blocchi secondo una politica first fit o best fit
39
Cos'è il garbage collector e qual è il problema da risolvere?
Il garbage collector è una componente della macchina virtuale che permette di individuare le celle garbage e di restituirle alla lista libera. Il problema da risolvere è quello del trovare le celle garbage sia in linguaggi con deallocazione esplicita sia in linguaggi con deallocazione implicita
40
Quali sono i principali algoritmi di GC?
Reference Counting, Tracing (mark and sweep e copy collection) e Generational GC
41
Qual è la differenza tra coarse grained e fine grained?
in coarse grained si usa un mutex per tutte le locazioni mentre con fine grained un mutex per ogni locazione