Paradigmi di programmazione Flashcards
Differenza tra un sistema di tipi e il type checking
Il sistema di tipi specifica il comportamento i/o delle funzioni mentre il type cheching verifica l’adeguatezza del comportamento i/o
Quali sono le componenti di una macchina astratta?
Interprete, controllo, operazioni primitive e memoria
Definizione di interprete
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)
Che cos’è il RTS?
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
Come si dividono le fasi del compilatore?
Front end (Scanner, Parser, Type checker) e Back end
Parla della structural Operational Semantics
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
Small-step e Big-step
Small-step esegue ogni singola operazione mentre il Big-step descrive in un unico passo l’intera computazione
Come si possono memorizzare i campi nei record?
Allineamento dei campi alla parola (ovvero un campo per ogni parola) o memorizzazione in un packet record
Che cosa significa polimorfismo per sottotipo?
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
Qual è la differenza tra covariante e contravariante?
Nel subtyping delle funzioni la relazione di tipo è contravariante inverte la relazione d’ordine mentre covariante la rispetta
Cos’è un ADT e quali sono le sue caratteristiche
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
Da che cosa sono caratterizzati gli oggetti?
Da uno stato (proprietà), funzionalità (metodi), identità, ciclo di vita e locazione di memoria
Quali sono i concetti fondamentali dell’OOP?
Incapsulamento, Astrazione, Interfaccia, Ereditarietà, Principio di sostituzione e polimorfismo
Quali sono le principali differenze tra Object based e Class based?
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
Cosa si intende per type Weakening e come si può risolvere?
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
Cosa si intende per type coercion?
Si esegue una forzatura di tipo e si tratta l’espressione come se fosse di quel tipo
Cosa si intende per composizionalità in Java?
Quando possiamo modificare la classe senza compromettere il resto del programma e l’interfaccia pubblica della classe
Qual è la differenza tra membri statici e d’istanza?
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
Che cos’è un interfaccia in java?
Un interfaccia in java contiene una specifica astratta della classe ovvero i membri pubblici della classe
Com’è suddivisa la memoria?
Ambiente delle classi, Stack e Heap
Descrivi il fenomeno dell’aliasing
Stesse celle di memoria sono associate a nomi simbolici diversi nel codice
Descrivi l’overriding e l’overloading
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
Parla del dynamic dispatch e della sua implementazione
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
Che cos’è il diamond problem e quali sono le principali risoluzioni?
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)