Note ipersintetiche di LPC: il linguaggio C, la rappresentazione, il fixed point, il floating point.
Note:
Il seguente file presenta gli appunti personali, al momento non rivisitati od ampliati, della prima lezione di Laboratorio di Programmazione e Calcolo. Potrebbero esser presenti refusi od affermazioni incorrette.
-Tra i separatori [-x——-x-] ci sono aggiunte personali, tratte dal web, inserite per chiarire alcune definizioni a livello tecnico.
Poiché l’aritmetica di macchina presenta un “leggero” errore, è doveroso evitare in qualsiasi modo possibile un arrotondamento troppo grossolano.
La complessità dell’algoritmo corrisponde al costo computazionale.
-x——x-
Costo computazionale: Il costo computazionale di una funzione/programma è un costo definito in termini di risorse di calcolo. Le risorse di calcolo fondamentali sono due: quantità di tempo necessario alla computazione, tempo, quantità di memoria utilizzata, spazio.
-x——x-
Il pre-processore agisce sul codice sorgente, mentre il compilatore rende il codice sorgente eseguibile.
-x——x-
Pre-processore: processore di testo che modifica il testo di un file di origine durante la prima fase di traslazione. Il pre-processore non analizza il testo di origine, ma lo suddivide in token per individuare le chiamate di macro.
Codice sorgente: ciò che viene scritto dallo sviluppatore tramite un qualsiasi linguaggio di programmazione.
Codice eseguibile: Il codice eseguibile è un file o un programma che indica le attività in base alle istruzioni codificate. La CPU può eseguire direttamente un file eseguibile per attività definite. In altre parole, sono istruzioni del codice macchina per una CPU fisica.
-x——x-
Il linguaggio C costituisce il nucleo del linguaggio C++, esso è stato ideato inizialmente per sistemi UNIX da Dennis Ritchie, persona alla quale risulta dedicato un asteroide, e Brian Kernigham nel 1978. Il danese Bjarne Stroustrup è l’inventore di C++.
Vantaggi principali del linguaggio C:
-funziona in molti ambienti ed è gratuito;
-risulta essere più vicino al linguaggio macchina in confronto ad altri linguaggi come Python o Matlab. (livello intermedio).
Il sistema UNIX è scritto prevalentemente in C.
I compilatori più utilizzati sono g++ e gcc $rightarrow$ il file risulta dunque possedere l’estensione .cpp . L’editor che verrà utilizzato in laboratorio sarà EMACS.
-x——x-
Linguaggio di programmazione: Un linguaggio di programmazione è una lingua formale pensata per realizzare set di istruzioni, input, con cui si producono dati in uscita, output. Fondamentalmente i linguaggi di sviluppo convertono i concetti astratti dell’uomo in codice macchina, ovvero la lingua con cui opera il computer.
UNIX: è un sistema operativo utilizzato su computer e server.
Ambiente: Di solito, la configurazione collettiva di software e hardware è l’ambiente. Ad esempio, il sistema operativo Windows che funziona su un’architettura a 32 bit è un ambiente. (credo intenda questo, altrimenti: https://it.wikipedia.org/wiki/Ambiente_(programmazione)#:~:text=Insieme%20di%20associazioni%20che%20vengono,di%20ogni%20sottoprogramma%20o%20sottoblocco. )
-x——x-
Sintassi:
Blocco commento:
“//” indica un commento di una riga;
“/*” si utilizza per aggiungere altre righe al commento;
“#” indica le istruzioni/direttive;
Istruzioni:
“#define” definisce qualcosa: ad esempio #define factor 150 sostituisce tutto ciò nominato factor nel codice con il numero 150. [è una direttiva del pre-processore che sostituisce tutte le occorrenze di “factor” nel codice con il valore 150, migliorando la leggibilità e la manutenzione.]
“#include” permette l’utilizzo delle librerie per utilizzare funzioni già definite e facilitare la programmazione.
Librerie utili:
#include <stdio.h> [abbreviazione di standard input-output, il .h indica l’header file associato alla libreria, permette l’utilizzo di funzioni input-output]
#include <stdlib.h> [libreria standard del C]
#include <math.h> [libreria di funzioni matematiche]
-x——x-
Macro: è un’istruzione di pre-processore che sostituisce un identificatore con un testo definito, facilitando la scrittura e manutenzione del codice.
-x——x-
La funzione main è presente in tutti i codici e non necessita prototipi.
Esempio:
// Blocco commenti
/* Il codice stampa “Hello World!” */
// Blocco commenti per il processore
#include <stdio.h>
int main() [oppure main(void)]
{
printf (“Hello World! n”) [Nota: n indica una riga di spazio, printf è una funzione della libreria stdio.h]
return();
}
!!!ATTENZIONE!!! è obbligatorio inserire alla fine del codice return(0) o return() [0 significa che tutto è andato liscio nell’esecuzione, mentre 1 l’opposto]. La mancanza di ciò all’esame sarà valutata come errore. !!!ATTENZIONE!!!
Rappresentazione:
Nota: l’insieme N indica $N_0$.
La calcolatrice mostra un numero limitato di cifre dipendente dallo spazio di memoria dedicato.
Esempio: ” 1/3=0.33333… ” non possiede un numero infinito di 3 per una calcolatrice causa il suddetto motivo.
Numeri reali:
Le x nella seguente formula indicano la posizione della cifra, non sono prodotti:
$x=pm (x_n . x_{n-1} … x_0 x_{-1} …)$, ove x∈R , n∈N (*)
ESEMPIO: base-10: x=0.1, n=0 $rightarrow$ $x_0=0, x_{-1}=1, x_k=0 forall k leq -2$
La base in generale si indica con β, ove $βinN β geq 2$
La formula (*) in β=10:
$x=pm (x_n cdot 10^n + (x_{n-1}cdot 10^{n-1} +…+x_1 cdot 10 +x_0+x_{-1} cdot 10^{-1})$ [per β=β sostituire il 10 con β]
Basi utilizzate spesso: decimale β=10, binaria β=2, esadecimale β=16
Notazione: la base si indica tra parentesi quadre come pedice: $(0.1)_{[2]}=(0.5)_{[10]}.
Base binaria:
Nota: lo zero non può essere in posizione iniziale.
n caselle: numeri possibili da inserire
[]: 0,1
[] []: 10, 11
[] [] []: 100, 101, 111
n[]: $2^n$
Memoria:
Il bit [binary digit] rappresenta l’unità elementare di informazione contenuta in un chip di memoria.
8bit contigui di memoria rappresentano 1byte.
$1kb=2^{10} bytes$
Approssimazione:
flow: prima precisione
double: seconda precisione, più accurata della prima.
Rappresentazione in virgola fissa (fixed point):
N=posizioni di memoria
t= posizioni cifre dopo la virgola (arbitrario)
s= segno (0 positivo, 1 negativo)
N-t-1=posizioni cifre intere
$x=(-1)^s (sum_{i=-t}{N-t-2}x_iβ^h)$
Esempio:
β=10, t=4 $x_{[10]}=0.0001234 approx 0.0001$
Rappresentazione in virgola mobile (floating point):
È utilizzata maggiormente.
N=posizioni di memoria
t= posizioni cifre dopo la virgola (arbitrario)
s= segno (0 positivo, 1 negativo)
N-t-1=posizione per l’esponente ( $e in Z$ di β)
m=mantissa= $(a_1a_2…a_t)_{[β]}$ [In matematica, parte decimale di un numero reale qualsiasi, ottenuta facendo la differenza tra il numero e la sua parte intera.]
$x=(-1)^s(0.a_1a_2…a_t)_{[β]}cdot β^e = (-1)^s cdot m cdot β^{e-t}$
$0 leq a_i leq β-1$
$0 leq m leq β^t -1$