Paradigmi di programmazione Flashcards

You may prefer our related Brainscape-certified 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
Q

Che cos’è una itable e quali sono i vantaggi e gli svantaggi di questo approccio?

A

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
Q

Come vengono gestiti il dynamic dispatch e la multipla ereditarietà in python?

A

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
Q

Come viene gestito il diamond problem in c?

A

il diamond problem viene gestito attraverso la duplicazione della superclasse con attributo virtual in modo da non avere la doppia istanza

28
Q

Quali sono le fasi di sviluppo di un programma in java?

A

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
Q

Che cosa enuncia il principio di sostituzione di Liskov e perché è diverso dalla subsumption

A

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
Q

Quali sono le regole indotte dal principio di Liskov?

A

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
Q

Qual è la differenza tra il controllo di un array e quello di una generics?

A

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
Q

Che cos’è una wildcard in java?

A

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
Q

Cos’è il type erasure e che cosa comporta?

A

Tutti i tipi generici sono trasformati in object a tempo di compilazione e questo porta alla perdita del tipo effettivo a run time

34
Q

Che cos’è JCF e quali sono i principali vantaggi

A

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
Q

Che cos’è un iteratore e come si possono implementare in java?

A

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<E> {
boolean hasNext();
E next();
void remove();
}</E>

36
Q

Com’è suddivisa la memoria?

A

Static area, heap e stack

37
Q

Quel è la differenza tra allocazione statica e dinamica?

A

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
Q

Che cos’è l’Heap? enuncia qualche sua caratteristica

A

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
Q

Cos’è il garbage collector e qual è il problema da risolvere?

A

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
Q

Quali sono i principali algoritmi di GC?

A

Reference Counting, Tracing (mark and sweep e copy collection) e Generational GC

41
Q

Qual è la differenza tra coarse grained e fine grained?

A

in coarse grained si usa un mutex per tutte le locazioni mentre con fine grained un mutex per ogni locazione