Linguaggi di programmazione

 

 

 

Linguaggi di programmazione

 

Questo sito utilizza cookie, anche di terze parti. Se vuoi saperne di più leggi la nostra Cookie Policy. Scorrendo questa pagina o cliccando qualunque suo elemento acconsenti all’uso dei cookie.I testi seguenti sono di proprietà dei rispettivi autori che ringraziamo per l'opportunità che ci danno di far conoscere gratuitamente a studenti , docenti e agli utenti del web i loro testi per sole finalità illustrative didattiche e scientifiche.

 

 

 

Le informazioni di medicina e salute contenute nel sito sono di natura generale ed a scopo puramente divulgativo e per questo motivo non possono sostituire in alcun caso il consiglio di un medico (ovvero un soggetto abilitato legalmente alla professione).

 

 

 

 

TEORIE DI BASE DELLA
PROGRAMMAZIONE

Si definisce con il termine programmazione l’intera attività svolta per passare dal problema alla sua soluzione finale mediante un sistema di elaborazione. La risoluzione di un problema, quindi, consiste in un processo lungo, che parte dalla descrizione del problema di partenza fino al programma finale, in cui un utente generico può avere la soluzione solamente inserendo i dati di ingresso.
Visto che il calcolatore capisce univocamente solo una sequenza di variabili binarie, il progettista-programmatore ha a disposizione: alcuni linguaggi di programmazione, i quali dispongono di regole sintattiche e lessicali molto più vicini a quelle umane, e di programmi traduttori capaci di trasformare un linguaggio ad alto livello in linguaggio macchina.
Lo scopo principale del programmatore è generalmente quello di costituire il programma sorgente, cioè un insieme di operazioni scritte in uno specifico linguaggio di programmazione che definiscono come i dati di ingresso devono essere opportunamente elaborati per ottenere i giusti risultati del problema che si vuole risolvere. Però scrivere direttamente il linguaggio di programmazione comporta degli svantaggi ai quali il programmatore deve tener conto: si limitano notevolmente le istruzioni da poter utilizzare, specialmente in progetti complessi, e soprattutto il programma sorgente non può essere compreso da un utente non esperto di informatica (elemento non da trascurare nel mondo del lavoro).
Quindi la programmazione non consiste nella scrittura diretta del problema nel linguaggio sorgente, ma bisogna seguire le seguenti fasi:

  1. ANALISI
  2. PROGETTAZIONE
  3. REALIZZAZIONE
  4. TESTING

 

1. ANALISI
La fase di analisi si svolge principalmente:

  • formulando il problema in modo generale
  • definendo le specifiche concettuali, tecnologiche ed ambientali

►Le specifiche concettuali riguardano la descrizione dei dati di ingresso e di uscita e di descrivere eventuali operazioni particolari da compiere per passare dai dati di ingresso(input) a quelli di uscita(output).
►Le specifiche tecnologiche riguardano la scelta degli strumenti HW/SW (hardware/software) da utilizzare per automatizzare il problema; a volte capita o che il progettista può scegliere gli strumenti più adatti alla realizzazione del programma o che deve utilizzare gli strumenti a propria disposizione.
►Le specifiche ambientali descrivono le caratteristiche della situazione applicativa in cui il progetto sarà inserito.

2. PROGETTAZIONE
La fase di progettazione ha come obiettivo quello di determinare la soluzione del problema senza tener conto delle specifiche tecnologiche, mentre in questo caso intervengono le specifiche concettuali; per questo motivo il progetto derivato è detto astratto ed è definito da: il modello dei dati e l’algoritmo.

►In un modello dei dati si definiscono l’insieme dei dati del problema e le regole per organizzare i dati.
L’algoritmo è una sequenza finita di passi non ambigua, realmente eseguibile da un esecutore in modo ordinato al quale, applicando dei dati in ingresso(input) producono la soluzione(output) di uno o più problemi della stessa classe, trasformando i dati iniziali a disposizione.
Per poter definire un algoritmo bisogna che esso abbia delle caratteristiche oggettive e soggettive. Le caratteristiche oggettive sono: deve essere finito nel tempo e nello spazio, le istruzioni non devono essere ambigue, deve essere realmente eseguibile da un esecutore, è generale, cioè è in grado di risolvere problemi di una determinata classe(problemi simili), deve essere deterministico, cioè applicando in ingresso gli stessi dati devo avere sempre lo stesso output; per quanto riguarda le caratteristiche soggettive non devono essere forzatamente rispettate, ma aiutano l’utente nella lettura dell’algoritmo, anche diverso dal creatore dello stesso. Esse sono la semplicità e la chiarezza, l’ordine e la documentazione; l’ordine è un aspetto da non trascurare ed è imperniata nell’indentazione delle istruzioni, cioè una tecnica di rappresentazione e di organizzazione delle istruzioni scritte che permette al lettore di poter individuare subito ogni singolo gruppo di calcolo; la documentazione consiste invece nella descrizione opportuna delle istruzioni utilizzate dal programmatore utilizzando, ad esempio, alcune righe di commento.
Per poter rappresentare un algoritmo, i metodi più utilizzati sono due: quello grafico e quello informale. Il metodo grafico più utilizzato è il diagramma di flusso (o flow-chart), dove i passi e le istruzioni dell’algoritmo sono tradotti in simboli grafici e in operazioni scritte in essi. Utilizzare metodi informali significa utilizzare un linguaggio regolato da poche regole sintattiche e molto vicino al linguaggio dell’uomo, chiamato pseudolinguaggio o linguaggio di progetto (PDL=Program Design Language), dove le operazioni sono rappresentate mediante parole chiave, sempre però non dimenticando le proprietà degli algoritmi

3. REALIZZAZIONE
La fase di realizzazione consiste principalmente nella codifica del progetto con un linguaggio di programmazione.
Codificare significa tradurre manualmente il modello dei dati e l’algoritmo in un programma sorgente mediante un linguaggio di programmazione.

4. TESTING
Questa fase a volte viene inclusa in quella di realizzazione per far capire come queste due sono strettamente collegate.
In questa fase il progettista-programmatore deve verificare la presenza di errori nel programma finale da un punto di vista sintattico, ricercati nella fase di debugging, e da un punto di vita logico, cioè se il programma soddisfa tutti i requisiti del problema. In questa fase lo scovo degli errori deve essere spietato e bisogna sottoporre il programma a qualunque tipo di sforzo, soprattutto nei punti considerati ‘critici’.

 

La programmazione quindi si divide in varie fasi che le possiamo così riassumere:
►la fase di analisi descrive COSA il programma finale deve fare;
►la fase di progettazione descrive COME deve essere risolto il problema;
►la fase di realizzazione IMPLEMENTA concretamente il progetto che sarà eseguito in un sistema di elaborazione automatico.

 

-LE STRUTTURE FONDAMENTALI DELLA-
------PROGRAMMAZIONE------


Per poter standardizzare il modo in cui venivano scritti gli algoritmi, nacque l’idea di una programmazione strutturata, cioè costituita da tre strutture fondamentali:

  • la sequenza di istruzioni
  • la struttura di selezione
  • la struttura iterativa

Questo permette la costruzione di un algoritmo comprensibile a più persone e di realizzare linguaggi e quindi programmi sorgenti più semplici.
Infatti da queste conseguenze assume particolare significato il teorema di Bohm-Jacopini, il quale afferma che un qualsiasi algoritmo può essere sempre ricostruito in modo equivalente utilizzando solo le tre strutture fondamentali di programmazione.
Il termine equivalente, in questo caso, significa che applicando ai due processi di elaborazione gli stessi input si avranno sempre gli stessi output.

►La sequenza di istruzioni è formata da uno o più comandi e da un insieme di istruzioni che l’esecutore effettua in modo sequenziale, cioè una dopo l’altra senza interruzioni. Essa è racchiusa tra le parole chiave in pseudocodice BEGIN e END.
► La struttura di selezione è composta da una condizione e da uno(selezione semplice) o due (selezione binaria) blocchi di elaborazione. In pseudocodice la condizione è introdotta dalla parola chiave SE, la sequenza o l’istruzione nel caso in cui la condizione sia vera è introdotta dalla parola chiave ALLORA, mente la sequenza o l’istruzione falsa è introdotta dalla parola ALTRIMENTI.
Se si devono effettuare più di due scelte si utilizzano strutture di selezione poste all’interno di altre: quest’ultime si dicono annidate.
►La struttura iterativa (o ciclica) è una sequenza di istruzioni che viene ripetuta un numero n di volte. Se si non si conosce il numero di volte che viene ripetuto il ciclo esso è detto non calcolato, se invece il numero di volte che deve essere ripetuto è definito prima del ciclo (o al massimo dall’utente prima di incominciarlo) esso è detto ciclo calcolato.
Nelle iterazioni calcolate, il progettista-programmatore predispone il ciclo in modo che esso sia ripetuto un numero predefinito di volte o, casomai, un numero di volte definito dall’utente prima di entrare nel ciclo. Un loop calcolato è definito da più elementi: il nucleo del ciclo (che rappresenta il blocco di elaborazione), un indice o contatore del ciclo (cioè una variabile che conta il numero di iterazioni del ciclo), e due variabili o espressioni che sono il valore iniziale e il valore finale, presumendo che il valore dell’incremento sia predefinito. Questi cicli, quindi, sono caratterizzati dall’inizializzazione dell’indice, che avviene sempre prima dell’entrata nel ciclo calcolato; inoltre durante l’esecuzione del ciclo, l’indice non si può mai trovare a sinistra di un’istruzione di assegnazione, altrimenti si commetterebbe un errore di tipo sintattico ed anche grave. L’incremento può essere positivo, e quindi l’indice è incrementato da un valore iniziale ad uno finale, o negativo, e dunque l’indice è decrementato da un valore iniziale ad un valore finale. Per essere eseguito almeno una volta, quindi, l’indice del ciclo deve essere inizializzato con un valore iniziale minore o uguale del valore finale, se l’incremento è positivo, mentre l’indice del ciclo deve essere inizializzato con un valore iniziale maggiore o uguale del valore finale, se l’incremento è negativo(quindi se c’è un decremento). I cicli calcolati possono essere inoltre annidati, cioè contenuti uno nell’altro; se agiscono su un unico nucleo, le iterazioni totali sono dovute dalla moltiplicazione del numero delle iterazione dei due cicli.
Le strutture iterative calcolate sono cicli che hanno la caratteristica

 

--  STRUTTURE DI PROGRAMMAZIONE:  --


--  I SOTTOALGORITMI  --
Durante la stesura di un algoritmo, può succedere di dover ripetere più volte uno stesso blocco di istruzioni con dati di input diversi oppure il problema di partenza è così complesso da doverlo scomporre in parti più semplici. In questi casi ci conviene scrivere dei blocchi di istruzioni separati in modo da doverli richiamare ogniqualvolta ci servono. Si definisce, quindi, sottoalgoritmo (subroutine o routine) un insieme di istruzioni indipendenti richiamabile in un passo di un altro algoritmo. L’algoritmo che richiama in una sua istruzione un sottoalgoritmo si denomina chiamante ed è di solito l’algoritmo principale, ma anche un sottoalgoritmo può richiamare a sua volta un sottoalgoritmo; si parla allora di sottoalgoritmi annidati.
I sottoalgoritmi non sono strutture indispensabili per la risoluzione del problema, ma aiutano enormemente il lavoro di un programmatore perché comporta molti vantaggi:

  • si evita di scrivere ogni volta lo stesso gruppo di istruzioni anche se i dati di input sono diversi
  • è possibile creare una libreria di sottoalgoritmi riusabile per la soluzione di problemi che appartengono ad applicazioni anche diverse tra loro
  • si semplifica molto la comprensione dell’algoritmo principale
  • nel caso si debbano effettuare delle modifiche nel codice si effettuano una sola volta nel sottoalgoritmo e si propagano in tutto il programma principale

Come si può notare, quindi, l’algoritmo principale (main) assurge il ruolo di gestore dei sottoalgoritmi, richiamandoli quando opportuno durante lo svolgimento.
Si definisce quindi procedura la struttura di programmazione che rappresenta un sottoalgoritmo. In una procedura possiamo distinguere alcuni elementi principali: le variabili di ingresso, dette parametri formali di ingresso, le variabili di uscita, dette parametri formali di uscita, e i passi della procedura che arrivano alla soluzione o alle soluzioni prefissate. Queste variabili sono chiamate parametri formali perché sono degli identificatori di appoggio, fittizi, che faranno corrispondere il loro valore ai parametri attuali (o reali) descritti nel main porgram. L’utilizzo di questi parametri quindi riesce a preservare una delle caratteristiche principali dei sottoalgoritmi, cioè quello di essere un modulo indipendente dall’intero progetto e per questo può essere richiamato in altri macroproblemi anche se diversi tra loro dal punto di vista logico e dalla sintassi usata nella progettazione-programmazione.
L’invocazione di una procedura risulta un procedimento abbastanza complesso decritto nelle seguenti fasi:

  • nel programma principale si chiede la chiamata ad una procedura: nel flow-chart esso corrisponde a due rettangoli racchiusi uno dentro l’altro dove viene posto in esso il nome della procedura affiancato dai parametri attuali, invece nello pseudolinguaggio si utilizza di solito la parola riservata CALL seguita sempre dal nome della procedura e dai parametri attuali; come possiamo vedere, i parametri attuali di ingresso devono essere sempre ben definiti prima della chiamata alla procedura e possono essere variabili, costanti o espressioni
  • entriamo nella procedura, sostituendo i parametri reali con i parametri formali utilizzati nella procedura che sono elencati tutti a fianco del nome della procedura nell’intestazione; per poter associare in modo univoco un parametro formale con un parametro reale e viceversa viene imposto un ordine di dichiarazione dei parametri formali e reali, i quali devono coincidere tra loro per direzione dell’elaborazione, in numero e nel tipo di dato: ciò significa che il primo parametro formale dichiarato nell’elenco corrisponde al primo parametro attuale del main program
  • dopo l’esecuzione dei passi della procedura, e quindi dopo aver trovato i risultati che sono conservati nei parametri formali di output, questi ultimi vengono utilizzati dal programma chiamante avendoli così conservati nei parametri attuali di output

 

--TECNICHE DI PROGETTAZIONE—


La progettazione e la programmazione sono delle scienze molto libere e non esistono delle regole su come affrontarle: per questo esse sono molto libere e il progettista può liberare la sua creatività: da questa considerazione nasce l’arte della programmazione. Però, per poter aiutare e favorire il lavoro del progettista-programmatore, sono state create delle tecniche apprezzate universalmente per la semplicità con cui si possono affrontare problemi molto complessi; questi sono alla base della programmazione procedurale; quella più utilizzata è la progettazione top-down associata ad una realizzazione con la tecnica bottom-up.
►La progettazione top-down significa dall’alto verso il basso e consiste nella suddivisione di un problema complesso in un insieme di sottoproblemi; questo frazionamento deve avvenire finché i sottoproblemi non sono sufficientemente semplici da poter realizzare. Dopo aver diviso il problema in questo modo, la soluzione viene costruita con la tecnica bottom-up, cioè dal basso verso l’alto, nella quale i singoli sottoproblemi vengono risolti in modo indipendente l’uno dall’altro e verranno poi richiamati dall’algoritmo principale.
-Quindi possiamo stabilire tre passaggi fondamentali:

  • [Applicazione del metodo top-down], dove il problema viene suddiviso in sottoproblemi più semplici da poter risolvere
  • [Applicazione del metodo bottom-up], risolvendo dapprima tutti i problemi singolarmente, creando per ciascuno di essi il proprio modello dei dati, e dopo creando l’algoritmo principale, dove verranno richiamati i sottoproblemi per la soluzione del problema finale
  • [Codifica parziale e totale], cioè vengono codificati nel corrispondente linguaggio di programmazione tutti i sottoprogrammi  e dopo verrà codificato l’algoritmo principale nel sorgente principale.

-Questa strategia di programmazione è detta modulare ed offre i seguenti vantaggi: semplifica notevolmente l’attività del programmatore, aumenta la comprensione dell’algoritmo ad utenti diversi dagli autori e infine consente anche di poter creare una libreria di sottoproblemi codificati per poter essere riutilizzati in problemi diversi. Per poter aumentare la comprensione del modo in cui è stato suddiviso il problema, viene molto spesso affiancato il diagramma di struttura, un albero dove la radice rappresenta il problema principale, mentre i nodi rappresentano i sottoproblemi: infatti no solo l’algoritmo principale può richiamare dei sottoalgoritmi, ma anche quest’ultimi possono a loro volta contenere altre chiamate a sottoalgoritmi.

►Dopo aver creato il nostro algoritmo principale dobbiamo quindi verificare la sua efficienza e l’eventualità di errori logici presenti. L’efficienza di un algoritmo è misurata dal numero di istruzioni necessarie per passare dei dati di ingresso a quelli di uscita e dalla complessità del modello dei dati, nonché il numero di variabili utilizzate; meno operazioni vengono usate, minore sarà il tempo di esecuzione, mentre minore saranno le variabili utilizzate minore sarà la memoria occupata dal programma nell’elaborazione.
- Per quanto riguarda la verifica dell’algoritmo, come sappiamo, avviene nella fase finale del processo di programmazione, cioè la fase di collaudo (o testing). Qui inoltre viene anche verificata l’eventuale possibilità di una modifica nell’algoritmo non solo per la presenza di errori logici, ma anche per aumentarne l’efficienza e la comprensione. Viene quindi steso il tracciato dell’algoritmo, che ha il compito di segnare in sequenza gli stati(cioè il valore assunto in un preciso momento da tutte le variabili) più importanti dell’algoritmo, per passare dallo stato iniziale(cioè il passo in cui vengono definiti e inizializzati tutti i dati di ingresso con le istruzioni di input) a quello finale (cioè al passo in cui sono stati trovati tutti i risultati). Per facilitarne la stesura, il tracciato viene creato graficamente con una tabella, dove le righe rappresentano gli stati dell’algoritmo, mentre nelle colonne sono riportati i valori delle variabili.
Procedendo con ordine, possiamo organizzare un piano di verifica dell’algoritmo: consideriamo e segniamo i passi più importanti nel processo di calcolo, soprattutto quando sappiamo che il calcolo potrebbe non essere definito (sono questi i punti maggiormente messi sotto stress e bisogna affacciare l’idea di creare un percorso alternativo nel processo elaborativi); quindi si esegue il processo di calcolo con due operazioni parallele, la prima scrivendo il tracciato dell’algoritmo in prova, mentre la seconda risolvendo il problema manualmente (o con un algoritmo già testato); infine i risultati vengono confrontati e si cerca di individuare i possibili errori presenti. Nel caso ci si imbatte in algoritmi complessi, bisogna prima accertare la correttezza di ogni sottoalgoritmo, e poi si può procedere al collaudo del programma principale.

 

Fonte: http://renatoelia.altervista.org/wp-content/uploads/2009/11/TEORIE-DI-BASE-DELLA-PROGRAMMAZIONE.doc

Autore del testo: non indicato nel documento di origine

 

Concetti base programmazione

 

VARIABILI
Una variabile è una porzione di memoria destinata a contenere dati, i quali possono cambiare valore durante l’esecuzione dell’algoritmo o del programma.
Una variabile è di solito, ma non sempre, caratterizzata da un nome per rappresentare l’indirizzo della stessa chiamato identificatore.
Nei linguaggi tipizzati, ciascuna variabile è caratterizzata da un tipo di dato, che specifica come devono essere considerati i dati rappresentati, e possibilmente restringe i valori accettabili. Definendo il tipo e la rappresentazione della variabile oltre al range di valori, vengono definite anche le operazioni possibili con la variabile stessa.
Nei linguaggi compilati, le variabili devono essere dichiarate prima di essere utilizzate. La dichiarazione consente di raggiungere due fondamentali obiettivi. Da un lato, con la dichiarazione si specifica il tipo della variabile, cosicché il compilatore è in grado di verificare eventuali errori semantici presenti all'interno di un programma sintatticamente corretto (ad esempio, non è consentito moltiplicare tra loro una variabile stringa ed una variabile intera). Dall'altro, viene valutata e definita la quantità di memoria destinata, in fase di esecuzione, a contenere i dati a cui la variabile si riferisce.
Col termine variabili globali vengono generalmente indicate quelle variabili dichiarate al di fuori di un sottoblocco di programma, e che sono visibili in uno o più sottoblocchi; le variabili locali sono quelle definite all'interno di un sottoblocco, ad esempio all'interno di una funzione, e quindi visibili solo internamente al sottoblocco stesso.
COSTANTI
Una costante è una porzione di memoria la quale contiene valori che non possono essere alterati durante lo svolgimento di un programma. Anch’essi possono essere comunemente identificati da un nome(identificatore).
I TIPI DI DATO
Un tipo di dato astratto o ADT (Abstract Data Type) è un tipo di dato le cui istanze possono essere manipolate con modalità che dipendono esclusivamente dalla semantica del dato e non dalla sua implementazione, cioè dipendono solo dal significato intrinseco che diamo al dato e non dal modo in cui si conservano le informazioni.
Nei linguaggi di programmazione che consentono la programmazione per tipi di dati astratti, un tipo di dato viene definito distinguendo nettamente la sua interfaccia, ovvero le operazioni che vengono fornite per la manipolazione del dato, e la sua implementazione interna, ovvero il modo in cui le informazioni di stato sono conservate e in cui le operazioni manipolano tali informazioni al fine di esibire, all'interfaccia, il comportamento desiderato. La conseguente inaccessibilità dell'implementazione viene spesso identificata con l'espressione incapsulamento; questa tecnica è utilizzata molto perché consente di nascondere lo strato fisico in cui vengono memorizzati i dati, in modo che, se i dati cambiano, le modifiche si propagano soltanto ad una piccola parte del programma.


Da quanto detto fin qui si ricava che è intrinseca nel concetto di ADT l'idea che la semantica di un dato coincida con le operazioni che si possono eseguire su di esso.

Un tipo di dato (o semplicemente tipo) è un nome che indica l'insieme di valori che una variabile, o il risultato di un'espressione, possono assumere e le operazioni che su tali valori si possono effettuare.
Quindi, se definiamo il tipo, ad esempio, di una variabile, già sappiamo automaticamente quali valori essa può assumere e quali operatori le possiamo applicare.
Nei linguaggi tipizzati è necessario associare ai termini del programma(variabili, ecc…) delle dichiarazioni di tipo che, a secondo del linguaggio utilizzato, sono implicite nel traduttore o devono essere esplicitate dal programmatore. Ciò permette al traduttore di risolvere le ambiguità, perché se si combinano tipi tra loro diversi si otterrebbe normalmente una violazione di tipo. Infatti vengono eseguiti dei controlli sui tipi (type checking) che può avvenire durante la compilazione (static checking) o quando viene eseguito il programma (dynamic checking).
I tipi di dato possono essere divisi in primitivi (detti anche atomici) e in derivati. I tipi di dati primitivi sono essenzialmente quelli che non possono essere decomposti, mentre quelli derivati sono quelli ottenuti dai tipi atomici con opportuni operatori messi a disposizione del linguaggio.
Inoltre i tipi di dato si possono suddividere in predefiniti e definiti dall’utente. Bisogna far attenzione a non confondere, ma, soprattutto, a non uguagliare tipi di dato primitivi con i predefiniti e tipi di dato derivati con quelli predefiniti dall’utente: ad esempio in Pascal una variabile ‘string’ è un tipo di dato predefinito ma derivato(dal tipo ‘char’).
I tipi di dato primitivi sono principalmente 3: quello numerico, quello booleano e carattere. Il tipo numerico comprende tutti i numeri in matematica, in cui gli operatori sono quelli tradizionali dell’algebra; a sua volta questo tipo si divide in numerico intero e reale, anche se gli operatori sono sempre gli stessi. Il tipo di dato carattere è un elemento che può assumere come valore una lettera dell’alfabeto, i caratteri e i simboli speciali e una cifra decimale(intesa come simbolo), che deve essere scritto sempre tra apici. Infine il carattere di tipo booleano può assumere solo due valori( vero o falso) in quanto è definito dalle regole dell’algebra di Boole; gli operatori inoltre corrispondono di solito agli operatori logici fondamentali(AND, OR, NOT).
ESPRESSIONI
Una espressione è una combinazione di elementi(detti operandi) collegati tra loro mediante operatori, la quale fornisce come risultato un unico valore di un tipo di dato valutando l’espressione stessa secondo alcune regole. Gli operatori possono essere aritmetici, booleani o relazionali, cioè di confronto tra due o più elementi; inoltre possono essere unari se agiscono su un unico elemento o binari se agiscono su due elementi.
ISTRUZIONI
Le istruzioni sono dei comandi che codificano le operazioni nell’algoritmo. Esse possono essere dichiarative o eseguibili, che si dividono in istruzioni di assegnazione, di input/output e di controllo.
Le istruzioni dichiarative non sono delle vere e proprie operazioni da compiere dall’esecutore, al contrario delle istruzioni eseguibili, ma servono a descrivere alcune caratteristiche dell’algoritmo, come l’inizio o la fine dello stesso.
Le istruzioni di assegnazione definiscono il valore di un elemento. Nello pseudocodice l’operatore di assegnazione è rappresentato dal simbolo ‘ß’. L’assegnazione non intende un’uguaglianza in senso strettamente matematico, ma significa sostituire il valore che si trova a destra dell’operatore con quello che si trova a sinistra; per questo motivo un elemento che si può trovare a sinistra di un operatore di assegnazione si indica col termine l-value (contrazione di left-value) come le variabili, mentre gli elementi che si possono trovare solo a destra di un operatore di assegnazione sono detti  r-value (contrazione di right-value) come le costanti o un’intera espressione.
Inoltre ricordiamoci che per effettuare un’assegnazione i due elementi devono essere dello stesso tipo.
Le istruzioni di input invece hanno il compito di dare alle variabili i dati di ingresso del problema, mentre le istruzioni di output permettono di far visualizzare il valore di uno o più elementi, tra i quali vi è la soluzione del problema.
Le istruzioni di controllo consentono di variare l’ordine di esecuzione dei passi dell’algoritmo con o senza una condizione iniziale che si può verificare o meno.

 

 

 

INSIEMI
Il concetto di insieme è sia uno dei concetti base della matematica, ma in informatica può essere considerato un aggregato di oggetti che sono legati tra loro da proprietà comuni. In informatica, un insieme può essere semplicemente definito per enumerazione, cioè elencando tutti gli elementi dell’insieme, o anche definendolo come sottoinsieme finito di un insieme finito. Sugli insiemi si possono effettuare le operazioni come intersezione, unione, differenza, complementazione ed appartenenza. Quindi l’insieme è un ADT semplice, statico o dinamico definito dagli oggetti che lo compongono e da tutte le operazioni che su di esso si possono effettuare.
In Pascal il tipo insieme è predefinito nel linguaggio ed è implementato dalla parola chiave ‘set’. I tipi set indicano un gruppo di valori, dove la lista dei valori disponibili e' indicata dal tipo ordinale su cui il tipo set e' basato; se si prende il subrange 1..3, i possibili valori del set basato su esso includono solo 1, solo 2, solo 3, sia 1 che 3, sia 2 che 3, tutti i tre valori, o nessuno di essi.
Per indicare i valori in un set, si puo' scrivere un elenco separato da virgole, racchiuso tra parentesi quadre. (es.--> Letters1 := ['A', 'B', 'C']; ). Anche se abbiamo detto che un insieme si può definire come sottoinsieme di un altro infinito, in Pascal questa funzione è implementata dalla parola riservata ‘subrange’ ed è diversa dal tipo set: infatti ad una variabile di questo tipo, una volta definito un subrange, si puo' legalmente assegnare ad esso un solo valore compreso in questo intervallo. Nella definizione di un subrange, non serve specificare il nome del tipo di base. Bisogna solo specificare due costanti di questo tipo. Il tipo originale deve essere un tipo ordinale e il tipo risultante deve essere ancora un tipo ordinale. 

MATRICI & VETTORI
►Una Matrice è un tipo di dato astratto definita da un insieme di elementi dello stesso tipo(gia’ definiti prima di usare la matrice)organizzati in modo ordinato in una struttura a tabella, divisa in righe e colonne, di cui già se ne conosce il numero; ogni elemento è individuato da due indici, di cui il primo indica la riga, mentre il secondo indica la colonna di appartenenza (es. M[2,3]à elemento della matrice M nella seconda riga e nella terza colonna); una matrice generica m x n di dice rettangolare quando m<>n, si dice quadrata quando m=n. Una matrice è un ADT strutturato, statico o dinamico a seconda se il numero di elementi può cambiare durante il corso dell’esecuzione dell’algoritmo. Ovviamente si possono effettuare delle operazioni sulle matrici, di cui le più importanti sono la somma(e quindi la differenza) tra matrici, il prodotto per un numero e il prodotto tra due matrici: la somma avviene tra due matrici m x n, dove gli elementi della matrice risultante S[m,n]  si ottengono sommando quelli corrispondenti delle matrici di partenza (es.--> F[1,2]=3 ; T[1,2]=6 ; R[1,2]=F[1,2]+T[1,2]=9 ); il prodotto di un numero q per una matrice m x n è una nuova matrice i cui elementi si ottengono moltiplicando tutte le componenti della matrice data per il valore q; infine il prodotto tra due matrici generiche A[m’ x n’] e B[m” x n”], dove n’=m”, è una nuova matrice P[m’ x n”], i cui elementi si ottengono effettuando la somma dei prodotti di una riga della prima matrice m e di una colonna della seconda matrice n; il prodotto deve essere effettuato tra gli  elementi che hanno n’ ed m” uguali, dopo di che se ne fa la somma. Il risultato deve essere scritto nella nuova matrice nella posizione m’ x n”.
►Un vettore è un caso particolare di matrice con una sola riga(vettore riga) o una sola colonna (vettore colonna); quindi è un ADT formato da un insieme di elementi dello stesso tipo individuato però solo da un indice con le stesse operazioni dei vettori; ovviamente la dimensione di un vettore indica il numero di elementi presenti nella struttura (ed è uguale ad in ). Le operazioni sono quelli di somma tra due vettori con la stessa dimensione, il prodotto per una costante q e il prodotto tra un vettore riga ed uno colonna con la stessa dimensione, utilizzando la stessa tecnica per il prodotto tra due vettori, il cui risultato è un numero. Un vettore quindi è un tipo di dato astratto strutturato, statico o dinamico e lineare, perché ogni componente, eccetto il primo e l’ultimo, ha un suo predecessore e un suo successore.
►In Pascal queste strutture astratte sono codificate con la struttura dati di tipo array definendo dopo la parola riservata type il tipo di dato degli elementi che formano l’array ed il valore in cui è/sono compreso/i l’/gli indice/i. Nel caso in cui si utilizza un array con un solo indice, esso codifica il modello astratto vettore, se si utilizzano invece array a due indici si codifica il modello astratto matrice, infine se si utilizzano più di due indici esso si chiama array multidimensionale.
-Partiamo dagli array monodimensionali.
Nella definizione dell'array, bisogna passare un tipo subrange nelle parentesi quadre oppure definire un nuovo tipo subrange usando due costanti di un tipo ordinale. Questo subrange specifica gli indici validi dell'array. Siccome si specifica sia l'estremo inferiore che quello superiore, l'indice non deve per forza essere zero-based. Si puo' anche definire un array zero-based , un array con il limite inferiore uguale a zero. Generalmente, l'uso di limiti piu' logici e' un vantaggio, siccome non serve usare l'indice 2 per acceder al terzo elemento, e cosi' via. Windows, tuttavia, usa invariabilmente array zero-based (visto che windows e' basato sul linguaggio C). Se serve lavorare con un array, si puo' comunque testare i limiti con le funzioni standard Low e High, le quali ritornano il limite inferiore e superiore dell'array. Usare Low e High quando si opera su un array e' altamente consigliato, specialmente nei cicli, siccome rende il codice indipendente dall'intervallo dell'array. Successivamente, si puo' cambiare l'intervallo dell'array e il codice che usa Low e High funzionerà ancora. Se si scrive un ciclo con i valori correnti dell'intervallo, bisognerà aggiornare il codice quando la dimensione dell'array cambia. L'uso di Low e High rende il codice facile da mantenere e piu' affidabile. L’uso di una costante per dichiarare gli estremi del subrange consente di scrivere codici leggibili e facilmente adattabili, in quanto se si vuole modificare la dimensione dell’array è sufficiente modificare il valore della costante e non l’intero codice sorgente dove compare il vettore.
-Esempio:
CONST
N=10;
TYPE
Vettore= array [1..N] OF Integer;
VAR
V:Vettore;
Una simile definizione di tipo può essere usate direttamente per definire una variabile senza un esplicito nome di tipo, come nel seguente codice:  VAR V:array [1..10] of Integer; . In generale, bisogna evitare di usare i tipi unnamed come nel codice precedente, visto che non si puo' passarli come parametri alle routine o dichiarare altre variabili dello stesso tipo. Le regole di compatibilità di tipo del Pascal sono basate di fatto sui nomi del tipo, non sulla definizione corrente del tipo. Due variabili di due identici tipi non sono ancora compatibili, a meno che i loro tipi abbiano esattamente lo stesso nome, e ai tipi unnamed viene attribuito un nome interno dal compilatore. Bisogna abituarsi a definire un tipo di dato ogni volta che si ha bisogno di una variabile complessa, e sicuramente non ci si pentirà del tempo speso.
Per identificare un elemento di un array generico V bisogna semplicemente porre tra parentesi quadre dopo il nome dell’array la posizione che occupa nell’array (es.--> V[2]= elemento nella seconda posizione dell’array V ).
In Pascal gli array sono strutture dati statiche, perché i limiti non possono essere modificati durante il corso del programma e devono essere sempre specificati a priori, e ad accesso casuale, perché il tempo per reperire il dato è indipendente dalla posizione dell’elemento all’interno della struttura.
-Un array bidimensionale(matrice) può essere dichiarata in due modi: aggiungendo un altro subrange separato da una virgola all’interno della parentesi quadra che sta per il secondo indice dell’array bidimensionale o può essere considerata come un array monodimenzionale i cui elementi sono ancora array.
-Esempio:
TYPE
Matrice= array [1..10 , 1..5] of Integer;
VAR
M:Matrice;
-Esempio2:
TYPE
V1= array [1..10] of integer;
Matrice=array [1..5] of V1;
VAR
M:Matrice;
Le due matrici sono identiche, solo che se per accedere ad un elemento nel primo esempio si usa la notazione M[i,j] nel secondo esempio si usa invece la notazione M[i][j].
Per poter gestire gli array vettori e matrice si utilizzano prevalentemente i cicli calcolati: per gestire gli array vettore basta usare un ciclo il cui indice viene utilizzato per poter selezionare un elemento nel vettore; per quanto riguarda gli array matrice è sufficiente impiegare due cicli calcolati annidati, dove il primo seleziona le righe mentre il secondo le colonne; questo tipo di analisi è il più usato ed è definito per righe (in quanto il ciclo più esterno seleziona le righe della matrice), ma si potrebbero anche scambiare i cicli ed in questo caso la matrice è elaborata per colonne (in quanto il ciclo più esterno si riferisce alle colonne).
-Infine gli array multidimensionale possono sempre essere dichiarati nei due modi descritti per gli array matrice, cioè usando più indici o considerandolo array di array. Gli array multidimensionale devono essere usati in maniera molto oculata in quanto possono occupare parecchio spazio nella RAM. (es. à un array 10x10x10 di tipo real occupa ben 6Kbyte).

LISTE
Una lista lineare e una struttura dati astratta formata da una sequenza di elementi dello stesso tipo di dato; la rappresentazione può avvenire separando gli elementi con virgole o meno o racchiudendo gli elementi tra parentesi tonde o meno. Un caso particolare di lista è quella che non contiene nessun elemento, cioè una lista vuota(έ, epsilon si legge). A differenza degli insiemi, la lista ha un ordine nella disposizione degli elementi al suo interno ed inoltre gli elementi possono essere anche ripetuti. La lista lineare quindi è un ADT strutturato perché organizzato mediante altri tipi di dato semplice grazie ad altre regole, dinamico e lineare perché ogni elemento ha un suo predecessore ed un suo successore (tranne il primo e l’ultimo). Particolari tipi di lista sono inoltre la pila, la coda e la stringa di caratteri.
-Si definisce testa(head list) della lista il primo elemento della lista (a sinistra) mentre il resto della lista prende il nome di coda(tail); quindi la lunghezza della lista è il numero totale di tutti gli elementi , ognuno dei quali ha una sua posizione: rispetto ad n elemento ai, si definisce il precedente l’elemento ai+1(a destra) mentre si definisce il successore l’elemento in ai-1(a sinistra).
Si definisce occorrenza il numero di volte in cui lo stesso elemento viene ripetuto in una lista; infine una sottolista è una nuova lista ottenuta da un’altra lista estraendo delle componenti in sequenza partendo da una qualsiasi posizione
Le operazioni definite in questo tipo di dato astratto sono l’inserimento, che consiste nell’inserire un nuovo elemento nella generica posizione i spostando tutti gli elementi precedenti verso destra di una posizione(l’inserimento nella testa si chiama push), la cancellazione, dove un elemento viene eliminato in una generica posizione i (la cancellazione alla testa si chiama pop), la lettura, che consiste di leggere solamente un elemento i della lista, la concatenazione, in cui due lista vengono unite in una nuova lista dove la seconda lista viene aggiunta alla prima dopo l’ultimo elemento (es.à L1=’Piano’ L2=’Forte’ Lc=’PianoForte’), l’ordinamento, in cui gli elementi, nel caso esista nella lista una struttura d’ordine, vengono scambiati in modo tale che siano disposti in ordine crescente o decrescente, ed infine la ricerca, andando a trovare la prima posizione in cui si trova un elemento x.

 

PILA
La pila (in inglese Stack) è un particolare tipo di lista in cui le operazioni di inserimento e di cancellazione sono effettuate solo alla testa; in questo caso essa prende il nome di cima o testa (top) dello stack, mentre l’ultimo elemento è chiamato fondo (o bottom). La pila è una struttura di dati astratta dinamica organizzata secondo la tecnica LIFO (Least In First Out): quindi bisogna immaginarla come una pila di piatti appoggiata su un tavolo, dove per aggiungere o levare un piatto lo si può fare solo alla testa, e per accedere agli altri patti più in basso bisogna prima eliminare i precedenti. Quindi si possono effettuare, oltre alle operazioni di pop e push, creazioni di nuove pile vuote(empty)  con le rispettive verifiche dello stack (se è vuoto restituisce il valore TRUE).

CODA
La coda (in inglese queue) è un particolare tipo di lista in cui le operazioni di inserimento avvengono in un’estremità detta retro(rear), mentre le operazioni di cancellazione avvengono dalla parte opposta detta testa (front). La coda è una struttura di dati astratta dinamica organizzata secondo la tecnica FIFO (First In First Out): quindi bisogna immaginarla come una coda di persone allo sportello, dove per inserire una persona bisogna farlo alla fine della coda (rear), mentre per togliere una persona lo si può fare solo alla testa. Quindi si possono effettuare, oltre alle operazioni di inserimento alla coda e cancellazione alla testa, creazioni di nuove code vuote(empty)  con le rispettive verifiche della coda (se è vuoto restituisce il valore TRUE).

STRINGA
Una stringa di caratteri è un particolare tipo di lista lineare di elementi di tipo carattere. Di solito il valore assunto da una variabile di questo tipo è racchiuso tra apici per non confonderlo con l’identificatore. Essendo una lista, la lunghezza della stringa è definita dal numero di caratteri presenti; una sottostringa è una sottolista ottenuta prendendo alcuni caratteri in sequenza partendo da un qualsiasi elemento. In una stringa si possono effettuare le operazioni delle liste, tra i quali ricordiamo la concatenazione tra due stringhe e l’estrazione di una sottostringa  da una stringa di partenza.
-In Pascal questo tipo di dato si potrebbe formare con un vettore di caratteri, ma ha l’inconvenienza di non superare un certo numero di caratteri; dal TP è stato creato un tipo di dato predefinito nel linguaggio chiamato string che è la corrispondente codifica dell’ADT stringa di caratteri. Se nella dichiarazione non si indica la dimensione massima del carattere, il compilatore assegna alle variabili la dimensione massima predefinita (255 caratteri), ma si può rendere più corta aggiungendo tra parentesi quadre la sua lunghezza massima. Il tipo string viene trattato in Pascal in modo dinamico, senza però, mai superare la lunghezza massima dello stesso, è consentita solo l’operazioni di concatenamento (simbolo +) ed altre operazioni di conversione (esàIntToStr oppure StrToInt che convertono una stringa in un numero e viceversa); inoltre, essendo considerato un array di caratteri, è possibile accedere ad un singolo carattere all’interno della stringa con la notazione []. Ricordiamo che è definita una relazione di ordinamento data dalla posizione di ogni singolo carattere nel codice ASCII a 8 bit; nel caso in cui i primi caratteri non coincidano si confrontano i secondi e così via.

RECORD
Nel caso in cui bisogna modellizzare elenchi di dato di tipo diverso si utilizza l’ADT record logico, cioè un insieme di elementi di tipo diverso chiamati campi; questi ultimi (i campi del record) sono variabili che contengono i dati dell’oggetto in questione; ricordiamo che un record logico è un tipo di dato di base mediante il quale si costruiscono altri tipi di strutture ed è denominato logico perché si vuole sottolineare l’analisi della struttura a livello del progetto. Infatti in un record logico è obbligatorio formare un tracciato dello stesso, cioè la descrizione dei suoi campi elencandone per ognuno l’identificatore, il tipo di dato e una breve descrizione.
-In Pascal, viene definita nella sezione TYPE un nuovo tipo strutturato denominato da un identificatore, elencandone poi subito dopo i campi del record e i rispettivi tipi di dato; Nella sezione VAR invece viene creata poi una variabile associato ad esso. Per poter accedere al contenuto in uno dei campi bisogna utilizzare la notazione IdentRecord.NomeCampo, dove IdentRecord è il nome del record mentre NomeCampo è il nome del campo del record separati poi tra loro da un punto; quest’ultimo ha la funzione di operatore di indirizzamento all’interno della struttura record. Per poter abbreviare la notazione in Pascal, si può utilizzare l’istruzione WITH, il quale indica che all’interno del suo blocco di istruzioni si punta ad uno specifico record, quindi dovendo specificare dopo solo il nome del campo. Per utilizzare WITH bisogna utilizzare la seguente sintassi: -WITH- IdentRecord- DO -blocco istruzioni tra Begin e End.

TABELLA
Una tabella è un insieme di record logici organizzati in righe e colonne; le righe corrispondono ai record logici mentre le colonne coincidono ai campi dei record. Ogni record è individuato in modo univoco da un campo(o più di uno) denominato chiave primaria; quindi ogni singolo dato nella tabella è selezionato dalla coppia [chiave primaria]-[nome del campo del record logico]. Schematizzando quindi la tabella è un ADT strutturato, perché formato da un insieme di record, dinamico, in quanto si può aggiornare la tabella, e lineare, perché ogni record ha un suo predecessore ed un suo successore (tranne il 1° e l’ultimo). Se confrontiamo le tabelle con le matrici possiamo notare che sono simili, ma non uguali in quanto le matrici possono queste possono salvare elementi dello stesso tipo di dato ed inoltre gli elementi sono individuati da una coppia di indici (mentre in una tabella non sono necessariamente numeri). Le operazioni che si possono effettuare sono la ricerca, cioè restituisce il contenuto di un insieme di record di cui si conosce il valore di uno o più campi, l’aggiornamento, che riguardano l’inserimento, la cancellazione e la modifica di un record ed infine l’ordinamento, cioè creare una nuova tabella disponendola secondo l’ordine dei valori di uno o più campi (ovviamente si cerca sempre di ordinarla in base alla chiave primaria).
-In Pascal, la tabella è formato da un array di record. Quindi per poter leggere o aggiornare i record di una tabella si utilizza di solito un ciclo for che agisce sull’array(che assume quindi la funzione di chiave primaria), sempre utilizzando la sintassi  IdentRecord[i].NomeCampo .

FILE
Un file logico è una lista di record logici. A livello fisico i file sono la struttura interna principale per archiviare in modo permanente i dati. Un file logico quindi è una tipo di dato astratto strutturato, dinamico e lineare.

 

Fonte: http://renatoelia.altervista.org/wp-content/uploads/2009/11/VARIABILICOSTANTI.doc

Autore del testo: non indicato nel documento di origine

 

Linguaggi di programmazione

 

Introduzione

Un  linguaggio un programmazione consente di esprimere gli algoritmi in modo "umano", incomprensibile alla macchina, la quale è in grado di eseguire esclusivamente istruzioni codificate in modo binario, cioè con una sequenza di 1 e 0 (che rappresentano, a loro volta, la presenza o l'assenza di una tensione elettrica). E' perciò indispensabile che il sorgente del programma (cioè il file contenente il testo scritto dal programmatore in un dato linguaggio di programmazione) venga elaborato e trasformato in una sequenza di codici binari significativi per l'elaboratore. Gli strumenti generalmente utilizzati allo scopo rientrano in due categorie: interpreti e compilatori.

 

Interprete

L'interprete è un programma in grado di leggere un sorgente in un certo linguaggio e, istruzione per istruzione, verificarne la sintassi, effettuarne la traduzione in linguaggio macchina e far eseguire al microprocessore della macchina il codice binario generato. La logica con cui l'interprete lavora è proprio quella di un … interprete: se la medesima istruzione viene eseguita più volte (ad esempio perché si trova all'interno di un ciclo), ad ogni iterazione ne viene verificata la correttezza sintattica, ne è effettuata la traduzione, e così via. L'esecuzione del programma può essere interrotta in qualunque momento ed è possibile modificarne una parte, per poi riprendere l'esecuzione dal punto di interruzione. L'interprete è inoltre in grado di interrompere spontaneamente l'esecuzione quando rilevi un errore di sintassi, consentire al programmatore la correzione dell'errore e riprendere l'esecuzione dall'istruzione appena modificata.
E' facile intuire che la programmazione interpretata facilita enormemente le varie fasi di sviluppo e correzione del programma; tuttavia essa presenta alcuni pesanti svantaggi: il programma "gira" lentamente (perché ogni istruzione deve essere sempre verificata e tradotta, anche più volte nella medesima sessione di lavoro, prima di essere eseguita) ed inoltre può essere eseguito solo ed esclusivamente attraverso l'interprete. Un esempio classico di linguaggio interpretato (nonostante ve ne siano in commercio versioni compilate o miste) è il Basic.

 

Compilatore

Anche in questo caso l'obiettivo di fondo è tradurre in linguaggio macchina un sorgente scritto in un linguaggio di programmazione affinché l'elaboratore sia in grado di eseguirlo; tuttavia l'approccio al problema è sostanzialmente diverso. Il sorgente viene letto dal compilatore, che effettua il controllo sintattico sulle istruzioni e le traduce in linguaggio macchina. Il risultato della traduzione è scritto in un secondo file, detto object file. Questo non è ancora eseguibile dal microprocessore, in quanto non incorpora il codice binario delle funzioni esterne al linguaggio: è dunque necessaria una fase ulteriore di elaborazione, alla quale provvede il linker, che incorpora nell'object file gli object file contenenti le funzioni esterne, già compilate in precedenza, solitamente raccolti in "contenitori" detti librerie. Il linker produce in output un terzo file, il programma vero e proprio, direttamente eseguibile dal microprocessore con la sola intermediazione del sistema operativo. Per eseguire il programma, dunque, non servono né compilatore o linker, né, tantomeno, il file sorgente. I vantaggi rispetto all'interprete, in termini di velocità e semplicità di esecuzione, sono evidenti, a fronte di una maggiore complessità del ciclo di sviluppo. Infatti il compilatore, nel caso in cui rilevi errori nel sorgente, li segnala e non produce alcun object file.
Il programmatore deve analizzare il sorgente, correggere gli errori e ritentare la compilazione: detta sequenza va ripetuta sino a quando, in assenza di segnalazioni d'errore da parte del compilatore, viene prodotto un object file pronto per l'operazione di linking. Anche in questa fase potranno verificarsi errori: il caso classico è quello della funzione esterna non trovata nella libreria. Anche questa volta occorre analizzare il sorgente, correggere l'errore (il nome della funzione potrebbe essere stato digitato in maniera errata) e  ripetere non solo il linking, ma anche la compilazione.
Solo in assenza di errori tanto nella fase di compilazione quanto in quella di linking si può ottenere un file eseguibile; in altre parole: il programma e funzionante.
Il C rientra a pieno titolo nella folta schiera dei linguaggi compilati (insieme a Cobol e Fortran, per fare qualche esempio).

 

Ada

Linguaggio di programmazione ad alto livello con strutture di controllo per la programmazione parallela e delle eccezioni. Creato dal dipartimento della difesa (DOD) degli USA nei primi anni '80, trae origine dal Modula-2 e dal Pascal. Questo linguaggio di programmazione prende il nome da Augusta Ada Byron contessa di Lovelace, figlia del poeta romantico George Byron. All'età di 18 anni conobbe Charles Babbage, matematico inglese inventore e fautore della calcolatrice meccanica denominata "Analytical Engine". Ada Byron scrisse come programmare la macchina per calcolare i numeri di Bernoulli, ma quel che più conta è la sua intuizione, avuta con notevole anticipo sui tempi, riguardo l'utilizzo della Macchina di Babbage nel campo della musica, della grafica e di altre discipline. Per questo Ada Byron viene considerata la prima programmatrice nella storia dell’informatica.

 

Api

Application Program Interface. Interfaccia per programmi applicativi. Struttura fondamentale dei sistemi operativi e dei package per lo sviluppo di applicazioni.

 

Applet

Programma scritto con il linguaggio Java, da eseguire su pagine web con possibilità di interattività per l’utente e che ha quindi bisogno della presenza di un browser per essere eseguito.

 

Asp

Active server pages. Una pagina asp e' un file di testo con l'estensione .asp contenente codice html, più un linguaggio di scripting (vbscript tipicamente). Le pagine asp sono state "create" da microsoft per poter gestire una comunicazione client - server e poter sviluppare pagine attive, cioè il cui contenuto e' calcolato a runtime. Le pagine asp facilitano l'interfacciamento di un sito con un database o con oggetti com (component object model).

 

Assembly language

L'assembly è il linguaggio costituito dai soli numeri 0 e 1 ed è "comprensibile" direttamente dalla CPU. E' il codice che ha le stesse strutture e lo stesso insieme di comandi (pop, push, move, add etc.) del linguaggio macchina. Ogni processore (CPU) ha il proprio assembly language e quindi il proprio linguaggio macchina. Solitamente i programmi scritti direttamente in assembly dal programmatore venivano eseguiti piu' rapidamente di quelli scritti in un linguaggio ad alto livello. I programmi scritti direttamente in assembly potevano essere piu' compatti rispetto all'assembly prodotto da un compilatore, ma questo era vero solo fino allo scadere degli anni '80. L'assembly language spesso viene chiamato soltanto "assembler"; in realtà l'assembler è un'altra cosa, ovvero, e' il programma che trasforma le istruzioni da assembly language (oppure "assembly") in codice macchina.

 

Basic

Beginners All-purpose Symbolic Instruction Code. Fu progettato e realizzato a metà anni '60 al Dartmouth College (Ohio) da John. G. Kemeney e Thomas Kurtz. E' stato un linguaggio di programmazione molto usato anche in ambiente scolastico negli anni '70-80. Oggi esistono numerose implementazioni e nuovi sviluppi di tale linguaggio, per esempio, nel Visual Basic di Microsoft e' stata aggiunta la programmazione ad oggetti.

 

C

Uno dei piu' diffusi linguaggi di programmazione che combina istruzioni di alto livello con controllo di macchina a basso livello. Sviluppato da Dennis M.Ritchie e Brian W.Kernighan nel 1972 come modifica del linguaggio B di Ken Thompson. Originariamente è stato progettato sul sistema operativo Unix. Ritchie e' stato co-designer anche di questo sistema operativo.

 

C++

Estensione del linguaggio di programmazione C che permette la programmazione ad oggetti. Questo linguaggio e' stato realizzato da Bjarne Stroustrup.

 

Cobol

Common Business Oriented Language. Linguaggio di programmazione implementato nel 1959-60, molto diffuso anche oggi in ambiente aziendale. Secondo la classificazione dei linguaggi, il COBOL, come il FORTRAN, e' un linguaggio statico ossia la memoria richiesta per l'esecuzione del programma e' già nota in compilazione. COBOL-85 e' il linguaggio standardizzato, promosso da CODASYL. Nonostante gli aggiornamenti e "tools" di sviluppo, che permettono ai programmi scritti con questo linguaggio di operare con database relazionali e Internet, le applicazioni COBOL vengono definite legacy.
Il COBOL ha introdotto per primo il prodotto cartesiano. I costruttori del prodotto cartesiano per questo linguaggio sono i record. Le n-ple di attributi quali nome, cognome, indirizzo, città, cap, etc. vengono descritte da record.

 

Dhtml

In realtà DHTML non esiste, almeno non nel senso in cui esiste HTML, infatti si basa sulla convergenza di più tecnologie già esistenti:

  • HTML  che definisce la struttura della pagina Web
  • CSS, il foglio di stile di HTML
  • Uno dei linguaggi di script esistenti come Javascript o vbscript (ma in teoria se ne possono usare anche altri, purché il browser sia in grado di interpretarli)

Fortran

Il nome deriva dalla contrazione dei termini FORmula - TRANslation. Realizzato John Backus per l 'Ibm nel 1954, e' un linguaggio di programmazione usato per scopi scientifici e matematici.

 

Html

Hypertext Mark-Up Language. Insieme di marcatori per la formattazione del testo, finalizzata alla costruzione di pagine web.

 

Java

Linguaggio ad oggetti, sviluppato nel 1991 dalla Sun Microsystem (specializzata nella realizzazione di Macchine Unix). E' stato creato inizialmente per realizzare software efficiente ed esportabile su una vasta gamma di elettrodomestici. Solo nel 1994 questo linguaggio ha riscontrato un interesse sia commerciale sia nell'ambito della programmazione, grazie a hotjava, il Browser prodotto dalla Sun. Quello che distingue Java dagli altri linguaggi di programmazione e' la sua portabilità nelle diverse piattaforme (computer) e nei diversi sistemi operativi, (Windows, MacOs, Solaris ecc). Infatti e' trasportabile su altri sistemi operativi non solo il file sorgente (con le librerie di classi fondamentali) ma addirittura il file binario. In altri termini il file sorgente, una volta compilato, ad esempio su un sistema Windows, ed è quindi eseguibile su processore Intel e compatibili, è eseguibile anche su altre architetture. Per esempio, l'applicazione in Java nei PC, può essere eseguita anche nei Macintosh (processori powerpc). Se tutti i programmi fossero scritti in Java, anziché in altri linguaggi, non ci sarebbero piu' problemi di compatibilità tra le diverse piattaforme.
Non abbiamo detto che, essendoci di mezzo l'interprete del bytecode, conosciuto con il nome di Java Virtual Machine (JVM) le applicazioni Java vengono eseguite meno velocemente rispetto a quelle scritte in un linguaggio tradizionale.

 

Jdbc

E' un'interfaccia scritta in linguaggio Java per eseguire comandi SQL (come curiosità JDBC e' un marchio registrato, non un acronimo, tuttavia si pensa che stia per "Java database Connectivity"). Usando JDBC si possono mandare comandi SQL virtualmente a qualsiasi database relazionale. In altre parole non serve scrivere un programma per accedere a "Sybase" e un'altro per "Oracle", ma basterà scrivere un unico programma e trovare un "driver" adatto al proprio database.

 

Jdk

Java Development Kit. Ambiente di sviluppo per programmatori, comprensivo di tutti gli strumenti necessari alla scrittura, alla compilazione ed al debugging di applicazioni in Java.

Linguaggio di alto/basso livello

Per linguaggio a basso livello si intende un linguaggio piu' comprensibile (vicino) alla macchina piuttosto che al programmatore, viceversa, per alto livello si intende tutto ciò che e' piu' intuitivo e comprensibile per il programmatore.

 

Lingo

Con questo termine si intende il linguaggio di programmazione di Director della Macromedia, tramite il quale è possibile creare applicazioni multimediali molto evolute.

 

Pascal

Il linguaggio di programmazione denominato Pascal (per ricordare il noto filosofo e matematico francese Blaise Pascal) e' stato realizzato nel 1971 dal prof. Niklaus Wirth del politecnico di Zurigo. Esso rappresenta lo sforzo di favorire l’attuazione pratica, nel lavoro del computer, della metodologia della programmazione strutturata. Alla sua nascita, dovendo contrastare il predominio del linguaggio Cobol (il più usato allora in ambito gestionale) e del linguaggio Fortran (il più usato in ambito scientifico), il Pascal diventa un linguaggio per specialisti che sono convinti della necessità, allora emergente, di mettere ordine nell’attività di programmazione, e quindi si orienta soprattutto verso ambienti di ricerca. Nel Pascal si evidenzia la facilità nel rappresentare le strutture di controllo della programmazione e le strutture dei dati. Il Pascal, con il passare degli anni, diventa un linguaggio ad alto livello sempre piu' utilizzazto, di cui viene riconosciuta l’importanza per scrivere i programmi in modo ben strutturato e documentato, e la versatilità degli impieghi, non più solo scientifici, ma anche gestionali. Il linguaggio Pascal possiede il compilatore, mediante il quale il testo sorgente del programma deve essere tradotto per effettuarne l’esecuzione.

 

Prolog

Linguaggio di programmazione realizzato a Marsiglia tra il 1972 e il 1973 dal prof. Alain Colmerauer e dal suo gruppo. Il nome di questo linguaggio e' ottenuto dalla contrazione dei due termini PROgramming e LOGic. Tale linguaggio e' nato grazie anche allo sviluppo della programmazione logica durante gli anni '60 negli Stati Uniti per la ricerca nel campo dell'intelligenza Artificiale. Solo nel 1977 si ha il primo compilatore Prolog sviluppato all'università' di Edimburgo.

 

Programmazione ad Oggetti

Si riporta di seguito una raccolta di termini legati alla programmazione ad oggetti.

  • OOA: Object Oriented Analisys. Metodologia per l'analisi e la progettazione che si appoggia sui concetti propri della OOP.
  • OOP: Object Oriented Programming. Paradigma di programmazione orientato agli oggetti, nato nella seconda metà degli anni '70.
  • OO: Object Oriented. Sigla utilizzata per indicare tutto ciò che e' orientato agli oggetti.
  • Oggetto: singola replicazione (in effetti si dice istanza)  di una classe.
  • Classe: identificazione per oggetti che esibiscono all'esterno lo stesso comportamento. Questi hanno la stessa interfaccia e, a parità di stato interno, operazioni identiche sugli oggetti producono i medesimi effetti interni ed esterni. In parole povere una classe la si può considerare come uno "stampino" che si usa per replicare (in gergo, istanziare) a volontà degli oggetti.
  • Sotto-classe: classe derivata da un'altra classe (suo padre, detta anche super-classe) che mantiene inalterati tutti gli attributi della classe superiore e ne può possedere di propri. Dal padre eredita anche i metodi che può, eventualmente, ridefinire o aggiungerne di nuovi.
  • Istanza: vedi oggetto
  • ADT: Abstract Data Type, sigla nata alla fine degli anni '70 per indicare un tipo di dato definibile dall'utente in base a tre assunzioni metodologiche:
    • Assegnazione di un nome per il tipo definito;
    • Definizione di un'interfaccia d'uso;
    • Occultamento della rappresentazione dei dati e dell'implementazione delle operazioni.
  • Metodo: comando od osservatore di un oggetto.
  • Interfaccia: dal punto di vista dell'utente, l'interfaccia rappresenta una visione astratta dell'oggetto. Essa definisce ciò che l'utente può "fare". Idealmente l'interfaccia deve nascondere all'utente il "come".
  • Osservatore: metodo che permette di "leggere" lo stato interno dell'oggetto (che non viene alterato).
  • Comando: metodo con effetti collaterali sullo stato interno dell'oggetto.
  • Stato interno: insieme delle coppie attributo-valore posseduto da un oggetto in un determinato istante.

Sgml

Standard Generalized Markup Language. E’ un sistema per definire tipi di documenti strutturati.

 

Sql

Structured Query Language. Linguaggio di interrogazione strutturato. Questo linguaggio, uno standard per la definizione di database relazionali, e' stato sviluppato nel 1973 dalla Ibm ed inizialmente si chiamava SEQUEL (Structured English query Language).
L' SQL, oltre a creare tabelle bidimensionali permette la formulazione di query (interrogazioni) sulle relazioni (tabelle). Access permette di utilizzare anche una versione grafica di SQL denominata QBE (Query By Example), anche se non sfrutta tutte le potenzialità dell' Sql. Per database complessi e di grandi dimensioni si preferisce utilizzare i sistemi Oracle. Sql e' il linguaggio piu' utilizzato per definire database e permette di ottenere delle risposte precise se le domande vengono ben formulate.

 

Vrml

Virtual Reality Modeling Language. Linguaggio di modellazione per oggetti ed ambienti tridimensionali. Poiché gli spazi tridimensionali creati con VRML risiedono in un modello matematico all’interno di un computer e possono essere rappresentati su di un monitor, vengono chiamati mondi virtuali per distinguerli da quelli reali. L’utente può avere un certo grado di interattività. VRML è tuttora in evoluzione ed alla ricerca di un  suo standard modalità d’uso.

 

Fonte: http://www.satnews.tv.it/tecnica/informatica/IntroduzioneInformatica.doc

sito web: http://www.satnews.tv.it/
Autore: By ZeroByte71

 

 

Linguaggi di programmazione

 

 

Visita la nostra pagina principale

 

Linguaggi di programmazione

 

Termini d' uso e privacy

 

 

 

Linguaggi di programmazione