Slide di Università su Introduzione ai Linguaggi di Programmazione. Il Pdf, utile per lo studio universitario di Informatica, esplora l'Algebra di Boole, i diagrammi di flusso e la distinzione tra linguaggi di basso e alto livello, con esempi pratici in C++.
Mostra di più19 pagine


Visualizza gratis il Pdf completo
Registrati per accedere all’intero documento e trasformarlo con l’AI.
a cura di Francesco Galgani www.galgani.it
Con la presente pubblicazione, mi limiterò a introdurre sinteticamente alcuni concetti fondamentali e di base per la programmazione, mediante esempi tratti dal C++. Per chi volesse approfondire l'argomento e cimentarsi nello studio di un linguaggio, può trovare nei seguenti siti alcune buone guide, dalle quali ho anche tratto parte degli esempi qui proposti:
Un linguaggio di programmazione è uno mezzo per poter scrivere "programmi", allo scopo di controllare il computer, facendogli eseguire determinati compiti.
Voglio che tu scriva sul monitor: "Ciao a tutti!"
I linguaggi del computer, allo stesso modo delle lingue umane, hanno un loro "lessico" (insieme di parole) e una loro "sintassi" (modo con cui le parole sono messe insieme).
PRINT "Ciao a tutti" lingua italiana linguaggio BASIC
Così come le persone possono comunicare usando tante lingue diverse, anche i computer possono essere istruiti mediante tanti linguaggi diversi.
A parte qualche rara eccezione, tutti i linguaggi di programmazione si basano su strutture simili: imparare uno dei linguaggi significa avere gli strumenti giusti per impararli tutti.
ASSEMBLER, FORTRAN, ALGOL, COBOL, BASIC, PASCAL, C, C++, LISP, ADA, SMALLTALK, LOGO, JAVA, ASP, PHP, PERL, DELPHI, DBASE, MODULA, MATLAB, SQL, MUMPS, PYTHON, OBERON, OCTAVE, EIFFEL, PARADOX, ecc.
Pieter Bruegel, La Torre di Babele, 1563
Ogni linguaggio è stato creato e ottimizzato per certi tipi di applicazioni. Anche se nei nostri esempi useremo il C++, i concetti basilari di programmazione sono perlopiù comuni a tutti i linguaggi.
In sintesi:
?
Le istruzioni sono contenute in un file di testo, ad esempio:
/ / il mio primo programma in C++ #include <iostream.h> void main () { cout << "Ciao a tutti!"; }
CODICE SORGENTE DI UN PROGRAMMA
COMPILAZIONE
Prompt dei comandi Microsoft Windows 2000 [Versione 5.00.21 (C) Copyright 1985-2000 Microsoft Corp. G:\>esempio_01. exe Ciao a tutti! G:\>
PROGRAMMA ESEGUIBILE
Ogni linguaggio, così come ogni lingua umana, è formato da "parole" che devono essere messe insieme secondo determinate regole (sintassi) al fine di ottenere un significato (semantica).
Disporre le parole rispettando una regola non è sufficiente per dare loro un significato:
regola: soggetto + verbo + complemento
es. 1: Il mio cane corre sul prato (sintassi corretta, significato valido)
es. 2: Il tuo gatto salta sulla macchina (sintassi corretta, significato valido)
es. 3: Il fiume beve sul mio cane (sintassi corretta ma priva di significato)
es. 4: Il prato corre nella mia macchina (sintassi corretta ma priva di significato)
Allo stesso modo, dobbiamo stare attenti a NON SCRIVERE programmi "formalmente corretti" ma senza senso!
Semplice diagramma di flusso
INIZIO Scrivi sul monitor: "Ciao a tutti!" FINE
Innanzitutto il computer è una macchina stupida: può soltanto fare ciò che gli comandiamo, senza capire il significato di ciò che sta facendo (esulano da questa affermazione e dagli argomenti qui trattati i problemi di intelligenza artificiale).
L'abilità del programmatore è quella di risolvere determinati problemi con un numero finito di operazioni (algoritmo) e far fare al computer tali operazioni in maniera corretta, usando un linguaggio di programmazione.
Un algoritmo può essere rappresentato con un diagramma di flusso.
I due strumenti che ci vengono in soccorso sono l'Algebra di Boole (utile per le operazioni sui dati) ed i diagrammi di flusso (utili per rappresentare in maniera ordinata i processi logici).
rappresentazione delle informazioni: bit: "0" o "1", "falso" o "vero" operazioni fondamentali: AND, OR, NOT
esempi: - Se piove non esco, altrimenti esco (NOT) - Se ho soldi e se è bel tempo, vado al mercato (AND) - Se piove o se sono raffreddato, sto a casa (OR)
START no SÌ NOT Piove = 1 ? esco = 1 esco = 0
START SÌ . no Piove = 1 ? OR sì Raffreddore = 1 ? stare a casa = 1 .
Per scrivere dei buoni programmi è quantomeno necessaria una mentalità logico-matematica. Affronteremo i principali elementi di base mediante esempi in C++.
In sintesi, ci occuperemo di:
Un linguaggio di "basso livello" è più comprensibile (vicino) alla macchina che al programmatore, viceversa, uno di "alto livello" è più intuitivo e comprensibile per il programmatore.
Linguaggi di basso livello: - diversi per ogni processore - più complessi da usare
Linguaggi di alto livello: - lessico e sintassi elementari - descrizione dei problemi semplificata - migliore approccio a problemi specifici - livello di astrazione più alto
Esempio: sommare i numeri naturali da 1 a 20 e memorizzare il risultato nella variabile "somma" Assembler ST6* (linguaggio di basso livello) C++ (linguaggio di alto livello) a . def 0 f fh somma . def 084h main ldi wdog, 0ffh clr a ldi somma, 20 op add a, somma dec somma jrz exit jp op exit ld somma, a void main () { int somma=0; for (int i=1; i <= 20; i++) somma+=i; }
Ci sono casi particolari in cui la programmazione di basso livello viene ancora usata perché offre la possibilità di creare programmi con velocità di esecuzione e utilizzo di memoria migliori.
* "ST6" è un microprocessore, prodotto dalla SGS-THOMSON, in commercio dal 1988 e tuttora in uso, 17 anni dopo, per l'elettronica hobbistica e professionale. Se volete saperne di più, potete trovare una miriade di siti Internet dedicati al ST6.
I linguaggi di programmazione, soprattutto quelli di alto livello, ci permettono di usare forme espressive "umanamente" comprensibili. Il computer, invece, "capisce" un suo linguaggio, detto "linguaggio macchina", composto da sequenze di cifre binarie:
10010111011100011101110010110001001111110010111101000101
Tutti i linguaggi di programmazione hanno lo scopo di convertire le istruzioni in linguaggio macchina e, a seconda del metodo utilizzato, si dividono in due categorie: compilati (usano un compilatore) e interpretati (usano un interprete).
Linguaggi interpretati (il programma funzionerà con "codice sorgente + interprete"): l'interprete legge una riga del codice sorgente > controlla lessico e sintassi > traduce > esegue
Linguaggi compilati (il programma funzionerà mediante un "file eseguibile", indipendente dal codice) il compilatore legge tutto il codice > controlla lessico e sintassi > traduce > crea eseguibile
Esempio reale di compilazione di una riga di codice Assembler: Idi somma,20 > lessico e sintassi OK > OD rr nn (3 byte) > > OD 84 14 > 00001101 10000100 00010100
Non tutte le righe di un programma denotano un'azione: vi sono righe che contengono soltanto commenti, righe che contengono istruzioni per il precompilatore, righe che iniziano la dichiarazione di una funzione e infine righe che contengono istruzioni eseguibili, contenute nel corpo della funzione.
COMMENTO / / il mio primo programma in C++ #include <iostream.h> ISTRUZIONE PER IL PRECOMPILATORE FUNZIONE void main () { cout << "Ciao a tutti!"; } DICHIARAZIONE DI UNA FUNZIONE ISTRUZIONE ESEGUIBILE
In matematica, una funzione ci permette di ricavare il valore di una variabile dipendente da quello di una indipendente; nella programmazione accade la stessa cosa: una funzione è un blocco di istruzioni che, accettando in input dei parametri (costituiti da variabili), "restituisce" (return) un valore in uscita.
Esempio: f(z)=a+b // esempio di funzione #include <iostream.h> int somma (int a, int b) { int r; r=a+b; return r; } int main () { int z; z = somma (5,3); cout << "Il risultato e' " << Z; return 0; } tipo di valore restituito dalla funz. nome funz. parametri int somma (int a, int b) { blocco di istruzioni }
Le "parole chiave" sono quei termini che, in base al linguaggio scelto, hanno funzioni precise: il compito del programmatore è quello di impararle ed usarle in maniera appropriata. Qui di seguito riportiamo, come esempio, le parole chiave del C++, molte delle quali vengono usate anche in altri linguaggi:
asm auto break case catch char class const continue default delete do double else enum extern float for friend goto if inline int long new operator private protected public register return short signed sizeof static struct switch template this throw try typedef union unsigned virtual void volatile while
Gli "operatori" sono caratteri speciali per controllare il flusso delle operazioni che dobbiamo eseguire (operazioni aritmetiche, operazioni logiche, trasferimento dati, ecc.).
I "separatori" sono invece simboli di interpunzione che permettono di chiudere un'istruzione o di raggruppare degli elementi.
operatori: + - * / % ^ & ~ ! : < > += - : '= %= ^= &= = << >> <<= >>= : ! = <= >= && ++ > * : : () [] ?: separatori : ( ) , ; : { }
Riferendoci al precedente esempio, osserviamo questa semplice funzione: int somma (int a, int b) { int r; r=a+b; return r; }
5 parole chiave (evidenziate in rosso) 2 operatori (evidenziati in verde) 8 separatori (evidenziati in blu)