






Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Sono una studentessa del primo anno del corso di Sicurezza dei Sistemi e delle Refi Informatiche in Statale a Milano. Questa è la dispensa completa di Programmazione del primo anno (sia materiali del docente che appunti presi a lezione, riordinati e utilizzati all’esame con esito 30 e lode)
Tipologia: Dispense
1 / 12
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!







Il programma deve risolvere il problema ed è scritto per un esecutore che lo comprende. Bisogna trovare lo strumento giusto per farlo.devo adattare il problema allo strumento che ho. Il programmatore di un tempo si occupava di tutto: soluzione, programmazione, uso. SDK, tool, AI automatizzano ma servono comunque competenze di sviluppo e di inventiva. Non è più considerato factotum ma parte di un team, è uno specialista verticale. —> silos di competenze del waterfall e processi DevOps. FORMALIZZAZIONE DLE LINGUAGGIO: Quando si vuole scrivere un programma si deve usare un linguaggio formale , ovvero, parlando informalmente, un insieme di simboli convenzionare di regole per combinare questi simboli in degli enunciati. Possiamo distinguere queste regole su 3 livelli:
corretto.
alfabeto : viene definito come un insieme finito e non vuoto di simboli o caratteri. Volendo proporre un esempio di un alfabeto, potremmo portare il binario. in cui abbiamo un alfabeto = (0, 1), dalla quale posso generare una stringa (o parola). Esiste la possibilità di generare una stringa che non na nessun carattere: questa si chiama stringa vuota e si indica con E. La stringa è quindi una sequenza finita di simboli. Posso parlare di nozioni di lunghezza (cardinalità di |s|). Si parla di concatenazione ovvero l’unire una stringa a ad una stringa b per ottenere ab. la Star di Kleene (o anche chiusura di Kleene ) che viene indicata con * è l'insieme di tutte le possibili stringhe generabili all'interno di un alfabeto. Comprende anche E. la Chiusura positiva che viene indicata, in maniera piuttosto intuitiva, con + è l'insieme di tutte le possibili stringhe generabili all’interno di un alfabeto , eccezion fatta per E. Quindi un linguaggio formale L si definisce come un sottoinsieme di stringhe generate su un alfabeto L’’obiettivo è trovare le regole necessarie:
I Simboli (terminali) o Token (anche se quest'ultima espressione ha un'accezione più pratica) si definiscono come gli atomi che costituiscono un enunciato in un linguaggio.
un codice è un linguaggio in cui ogni parola generata è univocamente interpretabile (è solo quella sequenza di parole che genera quella frase). Se rendiamo ad esempio un linguaggio C = (1, 10) si tratta di un codice: in qualunque modo disponiamo i simboli, possiamo interpretarli univocamente, “11010110”, per esempio, viene interpretato come “1”, “10”, “10”, “1”, “10”. C' = (bab, aba, ab) invece non è un codice. Questo perché se, ad esempio, prendiamo la stringa “abababab” può essere interpretata come “ab”, “ab”, “ab”, “ab”, sia come “ab”, “aba”, “bab”. Prendendo una generica parola w e * e un linguaggio L, esistono due possibilità:
Per capire se appartiene o no esistono due metodi:
questo si sfrutta un automa a stati finiti (o macchina a stati).
farlo, allora la parola è parte del linguaggio, altrimenti no. —> proprietà del programma:
È importante tenere conto anche del contesto. AUTOMI A STATI FINITI Si tratta di modelli matematici che dato un ingresso, producono un’uscita. È importante evidenziare che il numero di input e di output sono discreti. Il sistema si trova in uno stato che può cambiare con l’ingresso di un input passando dallo stato iniziale allo stato corrente e il passaggio si chiama transizione. È importante perchè modella sistemi complessi. Riconosce un linguaggio come una black box (ingresso = parole, uscite = valore tra o e 1) ovvero se viene accettata o no). Si muove di stato in stato per capire. In una parola ogni lettera è un input, riconosco la parola grazie alla sequenza di lettere.
Di solito un automa a stati finiti viene rappresentato o con una tabella o, in alternativa. con un grafo e queste macchine sono molo frequenti. Prendiamo l'esempio di una macchinetta che richiede 50c per una bibita, che accetti monete da 20c e 10c e non :dia resto. Possiamo costruire la seguente macchina a stati (avendo come stati il totale delle monetine inserite fino a quel momento). Non è completamente specificato. —> enigma del barcarolo. Un automa a stati finiti viene caratterizzato dalle seguenti proprietà:
Gli automi a stati finiti si dividono in:
sempre lo stesso.
assumere un certo stato e un altro anche con lo stesso input. —> MACCHINA DI TURING = macchina teorica equivalente ad un calcolatore e si basa sugli automi a stati finiti. Permette di analizzare e definire il concetto di algoritmo ed è in grado di spostarsi da uno stato all’altro in maniera automatica. Serve per calcolare la calcolabilità/risolubilità , la complessità e l’equivalenza di algoritmi. È un automa a stati finiti avente nastro potenzialmente ed è infatti più potente di un elaboratore che ha memoria finita. L’automa definisce quello che si chiama dispositivo di controllo. Il nastro è formato da una sequenza di celle e ogni cella contiene un elemento dell’alfabeto che legge (possono anche essere vuote). Sul nastro agisce una testina che può muoversi in entrambe le direzioni sul nastro partendo da un contenuto iniziale e può leggere e scrivere in ogni cella del nastro. La testina di lettura-scrittura:
Calcola una funzione, prende lo stato iniziale del nastro e crea un output y = F(x)
Non sempre esiste un un algoritmo che consenta, a partire dai dati di ingresso, di ottenere i risultati come per il problema dell’arresto (indecidibilità). Il problema dell'arresto chiede se sia sempre possibile, dato un algoritmo e un determinato ingresso finito, stabilire se l'algoritmo in questione termina o continua la sua esecuzione all'infinito. È stato dimostrato che non può esistere un algoritmo generale in grado di risolvere il problema per tutti i possibili ingressi. —> dimostrazione: Supponiamo per assurdo che sia possibile scrivere un programma T che accetti in ingresso la coppia < P, x>, formata da un qualsiasi programma P e dal suo ingresso x, e restituisca in uscita ⊤ , se P(x) termina in un tempo finito, e ⊥ altrimenti. Consideriamo il programma P∗ che realizza il seguente algoritmo, per ogni ingresso x:
Appartenenza di una stringa ad un linguaggio
Nella descrizione dell’algoritmo esistono dei modi per controllare il flusso delle operazioni da eseguire. Alcune operazioni sono soggette a particolari condizioni per essere eseguite, altre essendo ripetitive vanno eseguite più volte Nell’algoritmo di Euclide (MCD) si vedono chiaramente:
contiene il valore dell’oggetto. Il rapporto tra identificatore e valore è dinamico mentre quello tra identificatore e l’area di memoria è statico. L’identificatore di un variabile dovrebbe essere auto- documentante. Attraverso l’identificatore è riferibile una locazione di memoria che ha una dimensione associata. È un contenitore di valori che possono variare durante il tempo di esecuzione.
Il tipo di una variabile specifica:
Un calcolatore secondo l’architettura di von Neumann è in un certo senso la realizzazione concreta di una MdTU
Un linguaggio di programmazione è quasi sempre descritto da una sintassi formale e da una semantica informale Esempio:
deterministici
Tra le quattro tipologie quelle di terzo tipo sono le più semplici, quest'ultime generano linguaggi regolari riconosciuti dagli automi a stai finiti BNF: Formalismo utilizzato nell’informatica
Le regole di produzione hanno la forma nella grammatica di tipo 3 : Destra-regolare: A - aB oppure B —> b Sinistra-regolare: A -› Ba oppure A —> a con A,B ∈ N e a,b ∈ Σ Un linguaggio regolare è un linguaggio le cui stringhe sono implicate da un’ espressione regolare Grammatiche di tipo 3 sono adatte a rappresentare un ristrettissimo insieme di linguaggi formali Le espressioni regolari vengono utilizzate come linguaggio di input per vari sistemi che trattano stringhe Sono utilizzate nei comandi UNIX (grep) per la ricerca di stringhe e per i generatori di analizzatori lessicali tipo Lex e Flex. Utilizzano le operazioni tipiche di un linguaggio formale L
Partendo da un linguaggio formato da stringhe di lunghezza unitaria se ne creano altri di lunghezza 2, 3, ... Espressione regolare r ,definita su Σ e su un insieme di metasimboli +,∗,(,),·,∅ non appartenenti a Σ, è una stringa r appartenente all'alfabeto ( Σ ∪+ , *, (, ), · ,∅) tale che valga una delle seguenti condizioni:
LINGUAGGIO C
switch: L'istruzione switch consente di separare blocchi alternativi che corrispondono ai singoli valori possibili per un'espressione.
ciclo for Un ciclo per cui ho un numero fissato di iterazioni note a priori (Il while si usa quando non si sa a priori quante volte si ciclerà) for (; ; )
Equivale (logicamente ma non di fatto) a espr-iniz; while (espr-cond) { istruzione espr-incr; }