Title: Linguaggi di Programmazione Secondo Semestre / 05 - Type / 05.1 - Tipi Primitivi

Q: tipi primitivi/simple/scalar
A: Normalmente sono int,float,char.
Sono dei tipi base che il linguaggio vi dispone come base, è devono essere rappresentabili fisicamente dalla macchina (devono essere denotabili)
char type: valori di solito ASCII o UNICODE (uno utilizza un byte e l'altro due byte), le operazioni sono il ugualianza e l'ordine
Integer type: operazioni come i char ma anche quelle aritmetiche
Real type: fixet point, e floating poing,  stesse operazione degli integer

Q: Unit, void
A: Unit (principalmente nei linguaggi funzionali) è un singoletto con dentro unit (definizione ricorsiva) (serve per dare alle funzioni un argomento inutile) (non ci sono delle operazioni se non l'identità)
Void, (più utilizzato nei linguaggi procedurali), void invece potremmo associarlo meglio all'insieme vuoto

Q: Boolean Type
A: Prende i valori Vero e falso. E si possono applicare diverse operazioni come conguzione, disgunzione, negazione, uguaglianza, xor etc..

Q: Enumeration types
A: Enum, è un primo esempio di "construttore di tipo". nell'implementazione dell'enum viene assegnato un intero ad ogni tipo aggiunto, ma questa implementazione è nasconsta al programmatore, che non può applicare le operazione aritmetiche degli interi alle enum.

Q: Rappresentazione Extensional e Intensional
A: la definizione "Extensional" è quella fatta elemecando tutte i possibili valori che un tipo può avere ( come nelle enum).
La definizione "Intensionally" è fatta dando dei predicati (delle regole)

Q: Array
A: array: denotano una collezzione degli elementi, indicizzati da una chiave (di solito un intero ma non sempre)(quindi serve un mapping tra chiave e "cella")
L'operazione principale è l'accesso ad un elemento
Gli array possono essere row-major o column-major order
Un aspetto importante dei linguaggi è decidere quando e come  fissare la dimensione degli array, che può essere determinata a compilation e a runtime (per esempio in c puoi farlo in ambi i modi  "int a[4]" oppure "int a[n]" )( il secondo metotodo è ben diverso da un array dinamico)
Gli array di cui si sa la dimensione a compile time vengono allocati attraverso la "static form" che signica che vengono messi nello stack frame del blocco che contiene la definizione.
Se decidiamo di definire la size quando processiamo la dichiarazione (ancora fixed shape), possiamo allocare l'array nello stack frame.
Quando le dimensioni non sono note in fase di compilazione si possono utilizzare array dinamici (solitamente nella heap la loro dimensione può variare nel corso dell'esecuzione) o dope vector

Q: Set type
A: Set type: sono dei dati senza ordine con dei valori univoci dello stesso tipo.
Le operazioni sono di solito guardare se un elemento è nel set, aggiungere un elemento nel set, e rimuovere un elemento nel set
Un implementazione dei set può essere fatta creando un array di cardinalità del tipo del set e mettere un uno/zero se l'elemento è nel set o no.

Q: Reference type
A: Reference type, sono dei tipi che danno indirettamente l'accesso ad un altro valore. le operazioni sono di solito la creazione, l'uguaglianza e dereferencing (ottenere il valore puntato).
In alcuni linguaggio si possono creare puntatori solo alla heap e in altri sia heap che stack.
Nella maggior parte dei linguaggi i pointer vengono definiti a null finchè non vengono assegnati.
Useremo il "\*" per indicare la definizione di un puntatore e "\*" per il dereferencing dell'reference, mentre "&" sarà utilizzata per avere la locazione di memoria di una variabile
Implicit deallocation: è quando non si hanno più reference ad una determinata area di memoria che dovrebbe quindi essere liberata (alcuni linguaggi utilizzano un garbage collector e altri il type system previene questo comportamento come in rust)
Explicit deallocation: come il free in c
Linguaggi come Java tutte le variabili sono reference implicite.

Power set Axiom

Q: Def: Product Type
A: "Product" per il cartesian product. Servono per combinare due o più tipi, in una struttura fissa.
Gli elementi dei product type possono essere accessi tramite indice (come le truple in rust) o per nome come i record (struct in rust e c) che vengono chiamati fields.
Pattern Matching: Sapendo l'insieme dei tipi, il nostro sistema di tipi ci può garantire l'implmentazione dell'pattern matching esautivo (che elimina errori come esculdere dei casi, casi impossibili o rindondanti), il pattern matching può essere utilizzato anche per fare il decostructing dei record o in generale dei product type come in rust
Recursive types (as a concept) are useful to define data structures, such as Lists and Trees, that can dynamically grow. Product types are one way to express recursive types.

Q: Sum Type (union)
A: In alcuni linguaggi i tipo sum è già incluso dentro le enum.
Per esempio le unioni in c come implementazione, allocano in memoria la più grande porzione del tipo di dato che devono supportare (pultroppo c non gestisce i metodi d'accesso al tipo, infatti non da errori o warining quando gli si accede in più modi)
Con i sum type possiamo dichiarare anche i tipi recursive, così da dover gesitre sempre il caso null.

Notazione: Relazioni, e Funzioni