Realizzato dalla classe 3B 2012/2013
1. Linguaggio macchina
Il linguaggio macchina è il codice con cui sono scritti i programmi direttamente eseguibili dai microprosessori ed è costituito dall'insieme delle istruzioni fondamentali che la CPU di un microprocessore è in grado di eseguire (instruction set). Non è un vero linguaggio di programmazione, classificazione associata ai linguaggi di livello superiore (più familiari all'uomo), che generano programmi non direttamente eseguibili e richiedono una traduzione in linguaggio macchina, per esempio per mezzo di un compilatore.
L' alfabeto del linguaggio macchina è formato da due soli simboli, i bit 0 e 1.
Questi simboli, come le lettere di un normale alfabeto, formano parole che a loro volta costituiscono frasi, le istruzioni del linguaggio macchina. Ad ogni istruzione corrisponde un'azione elementare del microprocessore, come la lettura o la scrittura di una locazione di memoria, oppure il confronto tra due valori, oppure il calcolo della loro somma e poco altro ancora.
Le istruzioni sono generalmente costituite da una parola iniziale, il codice operativo, che indica il tipo di azione da eseguire ( somma, salto, confronto...), seguita da altre parole che specificano gli eventuali dati ai quali, e come, l'azione deve essere applicata.
Processori compatibili rispondono allo stesso linguaggio macchina anche se il loro hardware è completamente diverso come nel caso dei processori Intel e AMD x86.
La programmazione diretta in linguaggio macchina è praticamente non realizzabile per diversi motivi:
la scrittura dei programmi è estremamente sconveniente: una semplice operazione, ad es. una moltiplicazione, può richiedere diverse istruzioni e anche i più semplici programmi richiedono parecchio codice.
la scrittura in codice binario comporta elevata probabilità di commettere errori e di non riuscire ad individuarli.
è necessario conoscere molto bene le caratteristiche hardware della macchina in cui si programma, dagli indirizzi dei registri del processore, alla funzione svolta da ogni loro singolo bit (e sono tanti!), per non parlare della gestione della memoria e delle variabili.
il linguaggio macchina è diverso da processore a processore. Un programma, per essere eseguito su un'altra piattaforma deve essere interamente riscritto.
2. Algoritmo
Il termine algoritmo deriva dalla trascrizione latina del nome del matematico persiano Al-Khwarizmi che, oltre ad introdurre lo zero, propose uno dei primi algoritmi, quello per effettuare la somma di due numeri in colonna.
Si definisce algoritmo una sequenza ordinata e finita di passi elementari (operazioni o istruzioni) che conduce ad un ben definito risultato (determinismo) in un tempo finito: affinché l'algoritmo sia utile, il numero delle operazioni svolte deve essere limitato e, ad ogni ripetizione, il risultato deve essere sempre lo stesso.
L'argomento è importante ed esiste la teoria degli algoritmi.
In Informatica viene descritto come "procedimento di risoluzione di un problema".
È possibile rappresentare un algoritmo graficamente attraverso il diagramma di flusso.
3. Programma
Il programma, o codice sorgente, è una rappresentazione di un algoritmo; è una sequenza ordinata di istruzioni eseguibili, direttamente o dopo una decodifica, da un elaboratore.
4. Linguaggio di programmazione
Un linguaggio di programmazione consente di scrivere un programma.
Rispetto al linguaggio macchina consente di esprimere un programma secondo rigide regole formali senza incorrere in ambiguità, con istruzioni più sintetiche, complesse, potenti (ogni singola istruzione raggruppa diverse istruzioni in linguaggio macchina) e vicine alla logica del pensiero umano.
Consente una relativa indipendenza dal tipo di processore, una più agevole realizzazione dell'algoritmo (facilità e velocità), una migliore leggibilità da parte di altri programmatori per eventuali ampliamenti o manutenzione del SW, una più semplice ricerca degli errori. Il tutto, teoricamente, a scapito dell'efficienza del programma, supponendo che l'aumento dell'astrazione del linguaggio peggiori l'efficienza di conversione in linguaggio macchina.
Al pari di tutti i linguaggi, come quelli naturali o quelli della matematica, anche I linguaggi di programmazione sono dotati di:
un lessico, insieme di simboli che formano parole e locuzioni (alfabeto e vocabolario). I simboli sono le lettere dell'alfabeto inglese e alcuni segni usati dai linguaggi matematici (il tutto all'interno del codice ASCII e basta un semplice editor, tipo Notepad, per scrivere un programma). Le parole possono essere riservate, con un significato ben preciso e non modificabili, o definite dall'utente.
una sintassi, insieme delle regole per la formazione delle istruzioni (branca della linguistica che studia i diversi modi in cui le parole si uniscono tra loro per formare una proposizione, ed i vari modi in cui le proposizioni si collegano per formare un periodo). Ad es. la scrittura A=2*B+1 necessita di una regola sintattica per stabilire la priorità delle operazioni.
una semantica, significato delle singole istruzioni (è quella parte della linguistica che studia il significato delle parole, delle frasi e dei testi). Ad es. per applicare l'istruzione while è necessario conoscere la sua semantica.
Tutti linguaggi di programmazione prevedono i concetti fondamentali di variabile e di istruzione.
La variabile è una parola definita dall'utente a cui corrisponde
un insieme di indirizzi di memoria a lei riservati (allocati), cioè non utilizzabili per altri scopi;
un valore che è il contenuto delle locazioni di memoria indirizzate, che può essere un numero, un carattere, una serie di numeri, ecc.
Molti linguaggi prevedono una fase iniziale di dichiarazione che assegna l'indirizzo in memoria in funzione del tipo di variabile (la quantità di byte assegnati cambia in funzione del tipo, se stringhe di testo o numeri interi, ecc) e diverse fasi di definizione cioè di assegnazione o attribuzione del valore. La variabile non definita ha un valore casuale.
L'istruzione, azione svolta dal processore ed identificata da sigle in genere tratte dal linguaggio parlato (if, while...), può essere:
di ingresso, per l'acquisizione dei dati;
di uscita per fornire i risultati
di assegnazione ad una variabile
di confronto tra due dati
di operazioni logico matematiche tra i dati
di salto ad istruzioni non consecutive dato che l'esecuzione è consecutiva se non altrimenti specificato.
La scelta del linguaggio di programmazione dipende dalla tipologia del problema:
• Calcolo Scientifico: Fortran, C
• Intelligenza Artificiale: Prolog, Lisp
• Sistemi embedded: Assembler, C
• Sistemi di misura e di controllo: Labview
• Applicazioni gestionali: SQL, C
• Applicazioni client visuali: C++, Java, Visual Basic
• Applicazioni Web: PHP, Perl, ASP, Java
• Applicazioni distribuite: Java, C, C++
5. Linguaggi a basso livello, Assembly
I linguaggi a basso livello sono linguaggi di programmazione che richiedono un processo di traduzione molto semplice, univoco, per la conversione in linguaggio macchina. Il più famoso, l’Assembly, nasce intorno agli anni 50. L’Assembly è una rappresentazione simbolica del linguaggio macchina, che ad ogni sequenza binaria fa corrisponde un'istruzione sotto forma di codice letterale, riferito alla funzione svolta dall'istruzione, per rendere più semplice al programmatore umano lo sviluppo e il debug dei programmi. Per esempio, per la famiglia di microcontrollori PIC16f87X, al codice macchina
00 0001 0xxx xxxx (per ogni istruzione 14 bit) corrisponde il comando di azzerare il particolare registro W, mentre in linguaggio assembly lo stesso ordine si scrive CLRW, molto più semplice da ricordare.
6. Linguaggi a medio/alto livello
7. Flusso di un programma: istruzione goto e “codice spaghetti"; programmazione strutturata
8. Linguaggi interpretati e interprete
I linguaggi interpretati, come il basic, utilizzano un sw detto interprete che traduce ed esegue le istruzioni una per volta. Se il flusso del programma ritorna su un'istruzione già utilizzata, l'interprete la traduce di nuovo, prima di eseguirla.L'esecuzione risulta lenta.
9. Linguaggi compilati e compilatore;
In un linguaggio compilato, invece, la traduzione viene fatta una sola volta.
10. Java: la via di mezzo, linguaggio multipiattaforma
11. Pregi e difetti dei linguaggi compilati e interpretati. Warning ed errori.
12. Il linguaggio C e le sue novità
È considerato un linguaggio di alto livello ma non troppo, nel senso che fornisce un insieme ristretto di costrutti di controllo (istruzioni) e di parole chiave, ma un insieme ricco di operatori e funzioni che arrivano a gestire sia i bit che le strutture dati avanzate. Alcuni operatori corrispondono direttamente a istruzioni macchina e il compilatore produce un codice ottimizzato.
Ad es. agli operatori di autoincremento e autodecremento (i++; i--;) corrispondono le istruzioni assembler INC e DEC; se si usa l'istruzione i=i+1; il codice macchina risulta meno compatto e veloce.
• Offre al programmatore potenza e flessibilità
• Può essere descritto in uno spazio limitato e appreso velocemente
• I principali vantaggi sono l'efficienza, la sinteticità e la portabilità
. L’assenza di alcune funzionalità di alto livello consente di mantenere il linguaggio di dimensioni ridotte
• Il linguaggio non prevede funzionalità esplicite di I/O, non esistono funzioni READ e WRITE (devono essere incluse tramite specifiche chiamate a funzioni di libreria)
• Lo standard ANSI ha definito una libreria standard associata al C la quale specifica le funzioni per l’accesso al sistema operativo (es: leggere e scrivere su file), l’allocazione di memoria, il trattamento delle stringhe.
13. Versalità del C.
14. C++
15. Programmazione orientata agli oggetti
16. Strumenti necessari per la programmazione
17. File sorgente
18. Direttive al preprocessore, file header e direttiva #include.
Le direttive del processore permettono di includere porzioni di codice sorgente esterne ad un dato file
– Tipicamente si includono librerie i cui nomi terminano con l’estensione .h
20. Compilazione e file oggetto
21. Linking.
Edit
Preprocess
Compilazione
Link
Load
Esecuzione
Norme di una buona programmazione
• scrivere istruzioni chiare, una per riga
• evidenziare blocchi di istruzioni con le parentesi graffe anche se il blocco consiste di un solo comando
• utilizzare l’indentazione dei diversi blocchi del programma per una più facile lettura del codice stesso.