Linguaggio di programmazione e Discussioni utente:Chrisj2: differenze tra le pagine

(Differenze fra le pagine)
Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
 
m rinomina
 
Riga 1:
<!-- inizio template di benvenuto -->
[[File:Listing1.jpg|right|250px|thumb|Codice sorgente di un programma scritto in linguaggio [[BASIC|Basic]].]]
<div style="min-width:15em; max-width:48em; text-align:left; padding:1.5em 1.7em 2em; background:#FFF0D9; border:1px dotted gray; margin:1em auto 2em">
In [[informatica]], un '''linguaggio di programmazione''' è un [[Linguaggio formale (matematica)|linguaggio formale]], dotato di un [[lessico]], una [[sintassi]] e una [[semantica]] ben definite, utilizzabile per il controllo del comportamento di una [[macchina formale]], o di una implementazione di essa (tipicamente, un [[computer]]).
<div style="float:right; margin:0 0 1em 2em;">
<div style="width:280px; padding:5px 5px 1px; background:#FFC184; font-size:90%;">[[File:Firma e data.png|270px|border]]
Firma i tuoi interventi nelle discussioni. Puoi usare il tasto indicato.
</div>
<div style="text-align:right; font-size:95%; margin-top:.5em;">'''''[[Wikipedia:Babel/It-0|Not Italian? It-0?]]'''''</div>
</div>
<div style="font-size:130%; margin:1.7em 0 .55em;">Benvenuto/a su [[Wikipedia]]!</div>
<div style="font-size:95%; line-height:1.3; margin-bottom:1.8em">''Con i tuoi interessi e le tue conoscenze''<br />''puoi far crescere il sapere libero e l'enciclopedia.<br> Scrivi nuove voci, traducile, amplia quelle già esistenti:<br> il tuo contributo è prezioso!''</div>
<div style="margin-bottom:1.5em">Wikipedia ha solo alcune regole inderogabili: <span style="white-space:nowrap">i [[Wikipedia:Cinque pilastri|'''cinque pilastri''']]</span>.<br />Leggili e tienili a mente.</div>
<div style="margin-bottom:1em;">Ricorda di <span style="color:#c33;">'''[[Wikipedia:Copyright|non copiare]] testi né immagini da libri o siti internet</span>'''.<br /><span style="font-size:95%; line-height:1.3;">Se desideri inserire un tuo testo già pubblicato su carta o su web, inviaci prima una comunicazione [[Wikipedia:Copyright#Se concedi l'uso del materiale presente sul tuo sito o su altre fonti|come spiegato qui]].<br />
Ti inviamo inoltre a guardare la '''[[:File:Wikipedia_ridotto.ogv|video WikiGuida]]'''. Dura pochi minuti e può aiutarti nella comprensione delle regole basilari per contribuire a Wikipedia.</span>
</div>
{{Cassetto|titolo=Alcuni suggerimenti per iniziare ad orientarti|testo=
*Per un primo orientamento, puoi consultare il '''[[Aiuto:Guida essenziale|tutorial]]''' e la pagina di [[Aiuto:Aiuto|aiuto]].
*[[Portale:Progetti|Cliccando qui]] troverai un elenco dei [[Aiuto:Progetto|progetti]] diviso per argomenti.<br />Puoi scegliere quelli di tuo interesse e partecipare liberamente o chiedere suggerimenti.
*Identificati nelle discussioni: firma i tuoi interventi nelle [[Aiuto:Pagina di discussione|pagine di discussione]] con il tasto che vedi nell'immagine. Ulteriori indicazioni puoi trovarle in [[Aiuto:Uso della firma|uso della firma]].}}
{{Cassetto|titolo=Cosa inserire su Wikipedia?|testo=Controlla [[Aiuto:Cosa mettere su Wikipedia|cosa mettere]] e [[Aiuto:Cosa non mettere su Wikipedia|cosa non mettere]] su Wikipedia e ricorda:
*<span style="color: #FF0000">'''Non è consentito inserire materiale protetto da [[Wikipedia:Copyright|copyright]]'''</span> - se desideri inserire un tuo testo già pubblicato su carta o su web, inviaci prima una comunicazione [[Wikipedia:Copyright#Se concedi l'uso del materiale presente sul tuo sito o su altre fonti|come spiegato qui]].
*Le voci devono essere in [[lingua italiana]] e rispettare rigorosamente un '''[[Wikipedia:Punto di vista neutrale|punto di vista neutrale]]'''.
*Sono deprecate le [[WP:NRO|ricerche originali]]! Cita le [[WP:FONTI|fonti]] di quanto scrivi nelle voci.}}
{{Cassetto|titolo=Serve aiuto?|testo=
*Se hai problemi chiedi allo [[Aiuto:Sportello informazioni|sportello informazioni]], a un [[Wikipedia:Amministratori#Amministratori_di_it.wiki|amministratore]], in [[Aiuto:Canale IRC|chat]] o a qualsiasi [[Wikipedia:Wikipediani|wikipediano]] vedessi collegato seguendo [[speciale:recentchanges|ultime modifiche]].
*Se lo ritieni utile, puoi anche scegliere di farti affidare ad un tutor, inserendo il tuo nome in coda a [[Progetto:Coordinamento/Accoglienza/Richieste|questo elenco]].}}</div>
Naturalmente un benvenuto anche da parte mia! Se avessi bisogno di qualcosa non esitare a contattarmi. [[User:Sirabder87|<span style="color:steelblue">'''{<span style="color:#2f4f4f">Sirabder87</span>}</span>''']][[User talk:Sirabder87|<sup><span style="color:seagreen">''Static age''</span></sup>]] 19:12, 27 ago 2010 (CEST)
<!-- fine template di benvenuto -->
 
== Test ==
__TOC__
 
{{test|voce=}} [[Utente:Seics|Seics]] ([[Discussioni utente:Seics|msg]]) 19:28, 27 ago 2010 (CEST)
 
== Avviso ==
Il primo linguaggio di programmazione della storia, se si esclude il linguaggio meccanico adoperato da [[Ada Lovelace]] per la programmazione della macchina di [[Charles Babbage]], è a rigor di termini il [[Plankalkül]] di [[Konrad Zuse]], sviluppato da lui nella [[Svizzera]] neutrale durante la [[seconda guerra mondiale]] e pubblicato nel [[1946]]. [[Plankalkül]] non venne mai realmente usato per programmare.
 
Ciao! La voce "[[Dolph Ziggler]]" che avevi creato è stata [[Wikipedia:Cancellazioni_immediate|cancellata in immediata]] perché "pagina di prova". Per evitare in futuro casi del genere ti consiglio di lavorare preventivamente nella tua [[Aiuto:Pagina_delle_prove#Sandbox_personali|personale pagine delle prove]]. Per crearla clicca sul link accanto --> [[Utente:Chrisj2/Sandbox]]. Buon lavoro e se avessi bisogno di qualcosa chiedi pure! '''''[[Utente:Dome|<span style="color:#0000CC;">Dome</span>]]''''' <small><span style="color:#0000CC;">era Cirimbillo</span></small> <small><sup>''[[Discussioni utente:Dome|A disposizione!]] ''</sup></small> 19:31, 27 ago 2010 (CEST)
La programmazione dei primi elaboratori veniva fattare invece in [[short code]]<ref name=Sebesta>Robert W. Sebesta, ''Concepts of Programming languages'', 2006, pp.44. ISBN 0-321-33025-0</ref>, da cui poi si è evoluto l'[[assembly]], che costituisce una rappresentazione simbolica del linguaggio macchina. La sola forma di controllo di flusso è l'istruzione di salto condizionato, che porta a scrivere programmi molto difficili da seguire logicamente per via dei continui salti da un punto all'altro del codice.
{{yc}} '''''[[Utente:Burgundo|<span style="color:#0000CC;">Burgundo</span>]]'''''<sup>([[Discussioni_utente:Burgundo|posta]])</sup> 19:34, 27 ago 2010 (CEST)
 
== Attenzione ==
La maggior parte dei linguaggi di programmazione successivi cercarono di astrarsi da tale livello basilare, dando la possibilità di rappresentare strutture dati e strutture di controllo più generali e più vicine alla maniera (umana) di rappresentare i termini dei problemi per i quali ci si prefigge di scrivere programmi. Tra i primi linguaggi ad alto livello a raggiungere una certa popolarità ci fu il [[Fortran]], creato nel [[1957]] da [[John Backus]], da cui derivò successivamente il [[BASIC]] ([[1964]]): oltre al salto condizionato, reso con l'istruzione IF, questa nuova generazione di linguaggi introduce nuove strutture di controllo di flusso come i cicli WHILE e FOR e le istruzioni CASE e SWITCH: in questo modo diminuisce molto il ricorso alle istruzioni di salto (GOTO), cosa che rende il codice più chiaro ed elegante, e quindi di più facile manutenzione.
 
Leggi per cortesia [[Aiuto:Sandbox]] perché stati creando pagine completamente vuote. --[[Utente:Vituzzu|Vito]] ([[Discussioni utente:Vituzzu|msg]]) 19:35, 27 ago 2010 (CEST)
Dopo la comparsa del Fortran nacquero una serie di altri linguaggi di programmazione storici, che implementarono una serie di idee e [[paradigma di programmazione|paradigmi]] innovativi: i più importanti sono l'[[ALGOL]] ([[1960]]) e il [[Lisp]] ([[1959]]). Tutti i linguaggi di programmazione oggi esistenti possono essere considerati discendenti da uno o più di questi primi linguaggi, di cui mutuano molti concetti di base; l'ultimo grande progenitore dei linguaggi moderni fu il [[Simula]] ([[1967]]), che introdusse per primo il concetto (allora appena abbozzato) di ''oggetto'' software.
 
Nel [[1970]] [[Niklaus Wirth]] pubblica il [[Pascal (linguaggio)|Pascal]], il primo linguaggio strutturato, a scopo didattico; nel [[1972]] dal [[BCPL]] nascono prima il [[B (linguaggio)|B]] (rapidamente dimenticato) e poi il [[C (linguaggio)|C]], che invece fu fin dall'inizio un grande successo. Nello stesso anno compare anche il [[Prolog]], finora il principale esempio di linguaggio logico, che pur non essendo di norma utilizzato per lo sviluppo industriale del software (a causa della sua inefficienza) rappresenta una possibilità teorica estremamente affascinante.
 
Con i primi mini e microcomputer e le ricerche a Palo Alto, nel [[1983]] vede la luce [[Smalltalk]], il primo linguaggio realmente e completamente ad oggetti, che si ispira al Simula e al Lisp: oltre a essere in uso tutt'oggi in determinati settori, Smalltalk viene ricordato per l'influenza enorme che ha esercitato sulla storia dei linguaggi di programmazione, introducendo il paradigma [[object-oriented]] nella sua prima incarnazione ''matura''. Esempi di linguaggi object-oriented odierni sono [[Eiffel (linguaggio)|Eiffel]] ([[1986]]), [[C++]] (che esce nello stesso anno di Eiffel) e successivamente [[Java (linguaggio)|Java]], classe [[1995]].
 
== Concetti base ==
 
Tutti i linguaggi di programmazione esistenti possiedono (almeno) questi due concetti chiave:
*[[variabile (informatica)|Variabile]]: un dato o un insieme di dati, noti o ignoti, già memorizzati o da memorizzare; ad una variabile corrisponde sempre, da qualche parte, un certo numero (fisso o variabile) di locazioni di memoria che vengono ''allocate'', cioè riservate, per contenere i dati stessi. Molti linguaggi inoltre attribuiscono alle variabili un [[tipo di dato|tipo]], con differenti proprietà (stringhe di testo, numeri, liste, ''atomi'' ecc.).
*[[istruzione (informatica)|Istruzione]]: un comando, una funzione, oppure una regola descrittiva: anche il concetto di istruzione è molto variabile fra i vari linguaggi. A prescindere dal particolare linguaggio però, ogni volta che un'istruzione viene eseguita, lo stato interno del calcolatore (che sia lo stato reale della macchina oppure un ambiente virtuale, teorico, creato dal linguaggio) cambia.
 
Alcuni concetti sono poi presenti nella gran parte dei linguaggi:
*[[espressione (informatica)|Espressione]]: una combinazione di variabili e [[costante (informatica)|costanti]], unite da [[operatore (informatica)|operatori]]; le espressioni sono state introdotte inizialmente per rappresentare le espressioni matematiche, ma in seguito la loro funzionalità si è estesa. Una espressione viene '''valutata''' per produrre un valore, e la sua valutazione può produrre "effetti collaterali" sul sistema e/o sugli oggetti che vi partecipano.
*[[struttura di controllo|Strutture di controllo]], che permettono di governare il flusso dell'esecuzione del programma, alterandolo in base al risultato di una espressione (che può ridursi al contenuto di una variabile, o essere anche molto complessa).
*[[subroutine|Sottoprogramma]]: un blocco di codice che può essere richiamato da qualsiasi altro punto del programma.
*[[struttura dati|Strutture dati]], meccanismi che permettono di organizzare e gestire dati complessi.
 
== Il codice sorgente ==
 
Programmare in un dato linguaggio di programmazione significa generalmente scrivere uno o più semplici file di testo ASCII, chiamato '''[[codice sorgente]]'''. I font, i colori e in generale l'aspetto grafico sono irrilevanti ai fini della programmazione in sé: per questo i programmatori non usano programmi di videoscrittura ma degli ''[[editor]]'' di testo (come ''[[emacs]]'' e ''brief'') che invece offrono funzioni avanzate di trattamento testi (espressioni regolari, sostituzioni condizionali e ricerche su file multipli, possibilità di richiamare strumenti esterni ecc). Se un dato editor è in grado di lavorare a stretto contatto con gli altri strumenti di lavoro (compilatore, linker, interprete ecc.: vedi più avanti) allora più che di semplice editor si parla di '''[[Integrated development environment|IDE]]''' o ambiente di sviluppo integrato. Va notato che alcuni linguaggi di programmazione recenti consentono anche una forma mista di programmazione, in cui alla stesura di codice sorgente ASCII si associano anche operazioni di [[programmazione visuale]], attraverso le quali il programmatore descrive alcuni aspetti del programma ''disegnando'' a video attraverso il [[mouse]]; un'applicazione tipica di quest'ultima forma di programmazione è il disegno interattivo della [[Interfaccia grafica|GUI]] del programma (finestre, menù, e così via).
 
== Compilazione e interpretazione ==
 
Il codice sorgente, contenente le istruzioni da eseguire e (spesso) alcuni dati noti e costanti, può essere poi eseguito passandolo ad un [[interprete (informatica)|interprete]] che eseguirà le istruzioni in esso contenute, il che è la prassi normale per i [[Linguaggio di programmazione#Linguaggi di scripting|linguaggi di scripting]]; oppure può venire compilato, cioè tradotto in istruzioni di linguaggio macchina da un programma [[compilatore]]: il risultato è un file binario 'eseguibile' (codice eseguibile) che non ha bisogno di altri programmi per andare in esecuzione, ed è anche molto più veloce di un programma interpretato.
 
In passato, la compilazione è stata la norma per tutti i linguaggi di programmazione di uso generale; attualmente vi sono numerosi linguaggi interpretati e di uso generale, come il linguaggio [[Java (linguaggio)|Java]] o quelli della piattaforma [[Microsoft .NET|.NET]], che applicano un approccio ibrido fra le due soluzioni, utilizzando un compilatore per produrre del codice in un linguaggio ''intermedio'' (detto [[bytecode]]) che viene successivamente interpretato.
La differenza di prestazioni tra i linguaggi interpretati e quelli compilati è stata ridotta con tecniche di [[compilatore just-in-time|compilazione just-in-time]], sebbene si continui ad utilizzare i linguaggi compilati (se non addirittura l'[[assembly]]) per le applicazioni che richiedono le massime prestazioni possibili.
 
=== La compilazione ===
 
La compilazione è il processo per cui il programma, scritto in un linguaggio di programmazione ad alto livello, viene tradotto in un [[Codice macchina|codice eseguibile]] per mezzo di un altro programma detto appunto [[compilatore]].
 
La compilazione offre numerosi vantaggi, primo fra tutti il fatto di ottenere eseguibili velocissimi nella fase di run (esecuzione) adattando vari parametri di questa fase all'hardware a disposizione; ma ha lo svantaggio principale nel fatto che è necessario compilare un eseguibile diverso per ogni sistema operativo o hardware sul quale si desidera rendere disponibile l'esecuzione.
 
==== Il collegamento (linking) ====
{{vedi anche|Linking}}
 
Se il programma, come spesso accade, usa delle [[libreria software|librerie]], o è composto da più [[moduli software]], questi devono essere 'collegati' tra loro. Lo strumento che effettua questa operazione è detto appunto [[linker]] ("collegatore"), e si occupa principalmente di risolvere le interconnessioni tra i diversi moduli.
 
Esistono principalmente due tipi differenti di collegamento: '''dinamico''' e '''statico'''.
 
===== Collegamento statico =====
Tutti i moduli del programma e le librerie utilizzate vengono incluse nell'eseguibile, che risulta grande, ma contiene tutto quanto necessario per la sua esecuzione. Se si rende necessaria una modifica ad una delle librerie, per correggere un errore o un problema di [[sicurezza informatica|sicurezza]], tutti i programmi che le usano con collegamento statico devono essere ricollegati con le nuove versioni delle librerie.
 
===== Collegamento dinamico =====
Le librerie utilizzate sono caricate dal [[sistema operativo]] quando necessario (''linking dinamico''; le librerie esterne sono chiamate "DLL", ''[[Dynamic-link library|Dynamic-link libraries]]'' nei sistemi [[Microsoft Windows]], mentre "SO" ''[[Shared Object]]'' nei sistemi [[Unix-like]]). L'eseguibile risultante è più compatto, ma dipende dalla presenza delle librerie utilizzate nel sistema operativo per poter essere eseguito.
 
In questo modo, le librerie possono essere aggiornate una sola volta a livello di sistema operativo, senza necessità di ricollegare i programmi. Diventa anche possibile usare diverse versioni della stessa libreria, o usare librerie personalizzate con caratteristiche specifiche per il particolare host.
 
Nella realizzazione di un progetto software complesso, può succedere che alcune parti del programma vengano realizzate come librerie, per comodità di manutenzione o per poterle usare in diversi programmi che fanno parte dello stesso progetto.
 
La complicazione aggiunta è che quando si installa un programma con collegamento dinamico è necessario verificare la presenza delle librerie che utilizza, ed eventualmente installare anche queste. I sistemi di package management, che si occupano di installare i programmi su un sistema operativo, di solito tengono traccia automaticamente di queste dipendenze.
 
In genere si preferisce il collegamento dinamico, in modo da creare programmi piccoli e in generale ridurre la memoria [[RAM]] occupata, assumendo che le librerie necessarie siano già presenti nel sistema, o talvolta distribuendole insieme al programma.
 
=== L'interpretazione ===
 
[[File:Python script.svg|300px|thumb|left|Un codice [[python]]]]
{{Citazione necessaria|Per cercare di eliminare il problema della portabilità (la dipendenza o meno del linguaggio dalla piattaforma) si è tentato di creare altri linguaggi che si potessero basare soltanto su librerie compilate (componenti) ad hoc per ogni piattaforma, mentre il loro codice viene interpretato, e quindi non c'è la necessità di una compilazione su ogni tipologia di macchina su cui viene eseguito.}} Il grosso difetto di questi linguaggi è la lentezza dell'esecuzione; però hanno il grosso pregio di permettere di usare lo stesso programma senza modifica su più piattaforme. Si dice in questo caso che il programma è [[portabilità|portabile]].
 
La perdita di prestazioni che è alla base dei linguaggi interpretati è il doppio lavoro che è affidato alla macchina che si accinge ad elaborare tale programma. Al contrario di un programma compilato, infatti, ogni istruzione viene controllata e interpretata ad ogni esecuzione da un [[interprete (informatica)|interprete]].
 
Si usano linguaggi interpretati nella fase di messa a punto di un [[Programma (informatica)|programma]] per evitare di effettuare numerose compilazioni o invece quando si vuole creare software che svolgono operazioni non critiche che non necessitano di ottimizzazioni riguardanti velocità o dimensioni, ma che traggono più vantaggio dalla portabilità.
I linguaggi di [[scripting]] e tutti quelli orientati al [[Web]] sono quasi sempre interpretati.
[[PHP]], [[Perl]], [[Tcl/Tk]], [[Java (linguaggio)|Java]] volendo, e [[JavaScript]], [[Python]] e molti altri sono esempi concreti di interazione non vincolata alla piattaforma.
 
Ci sono vari tentativi per rendere i compilatori multipiattaforma creando un livello intermedio, una sorta di semi-interpretazione, come nel caso sopra menzionato di [[Java (linguaggio)|Java]]; d'altro canto per i linguaggi interpretati ci sono tentativi per generare delle compilazioni (o semi-compilazioni) automatiche specifiche per la macchina su cui sono eseguiti.
 
Esistono anche strumenti per automatizzare per quanto possibile la compilazione di uno stesso programma su diverse piattaforme, ad esempio [[GNU]] [[autoconf]]/[[automake]], che permette di realizzare una distribuzione del codice sorgente che può essere configurata e compilata automaticamente su diverse piattaforme, in genere almeno tutti gli [[Unix]].
 
=== Confronto tra compilazione e interpretazione ===
 
[[File:Python_add5_syntax.svg|350px|right|thumb|Un esempio di codice sorgente in [[Python]]. L'[[Syntax highlighting|evidenziatura]] di alcune parti di codice è uno strumento comune fra i programmatori per orientarsi fra il codice.]]
Questi due metodi di creazione ed esecuzione di un programma presentano entrambi vantaggi e svantaggi: il maggior vantaggio della compilazione è senz'altro l'efficienza nettamente superiore in termini di prestazioni, al prezzo del restare vincolati ad una '''piattaforma''' (combinazione di architettura hardware e sistema operativo) particolare; un linguaggio interpretato invece non ha, in linea di massima, questa dipendenza ma è più lento e richiede più memoria in fase di esecuzione.
 
=== Il Caso reale e la macchina intermedia ===
 
Le implementazioni compilative pure o interpretative pure sono in realtà solo gli estremi di una soluzione implementativa di un linguaggio di programmazione, infatti in quasi tutti i linguaggi di programmazione coesistono queste due tecniche, in modo tale da limitarne gli svantaggi e sfruttarne i vantaggi. Quindi in un caso reale i passaggio sono i seguenti: il codice sorgente viene prima compilato in un codice intermedio e poi interpretato. C'è da aggiungere che l'interprete utilizzato sfrutta un supporto run-time che in pratica consente di adattarlo alle esigenze implementative, in pratica può accadere che non è necessario realizzare interamente l'interprete, in quanto il linguaggio intermedio generato dalla compilazione non è molto diverso dal linguaggio finale (quindi la macchina intermedia e simile alla macchina ospite), basta quindi l'interprete della macchina ospite, esteso da opportuni programmi detti, appunto, supporto a run-time.
Inoltre esistono vari meccanismi che tendono ad ottimizzare il codice prima della compilazione stessa, allo scopo di migliorarne l'efficienza. La [[Valutazione parziale]] è una di queste tecniche e consiste nel valutare un programma del quale sia nota una parte degli input. Conoscendo questa informazione si tende a specializzare tale programma in modo tale da risultare più efficiente con quegli input, ottenendo come risultato un programma più efficiente di quello originale.
 
== Classi di linguaggi ==
Ad oggi (2007) esistono circa 2500 linguaggi di programmazione più o meno noti e diffusi: questi vengono normalmente classificati in tre grandi famiglie basate sul [[paradigma di programmazione|paradigmi di programmazione]] di riferimento: i linguaggi '''imperativi''', quelli '''funzionali''' e quelli '''logici'''.
 
=== Imperativi ===
{{vedi anche|Programmazione imperativa}}
Nei linguaggi imperativi l'istruzione è un comando esplicito, che opera su una o più variabili oppure sullo stato interno della macchina, e le istruzioni vengono eseguite in un ordine prestabilito. Scrivere un programma in un linguaggio imperativo significa essenzialmente occuparsi di cosa la macchina deve fare per ottenere il risultato che si vuole, e il programmatore è impegnato nel mettere a punto gli algoritmi necessari a manipolare i dati.
 
Le strutture di controllo assumono la forma di ''istruzioni di flusso'' (GOTO, FOR, IF/THEN/ELSE ecc.) e il calcolo procede per iterazione piuttosto che per ricorsione. I valori delle variabili sono spesso assegnati a partire da costanti o da altre variabili (assegnamento) e raramente per passaggio di parametri (istanziazione).
 
Tipici linguaggi imperativi:
{{Div col|cols=3}}
* [[Assembly]]
* [[ALGOL]]
* [[B (linguaggio)|B]]
* [[BASIC]]
* [[BCPL]]
* [[COBOL]]
* [[Fortran]]
* [[Forth]]
* [[Hot soup processor|Hot Soup Processor]]
* [[PL/I]]
* [[Package for Online Programing|POP]]
{{Div col end}}
 
==== Strutturati ====
{{vedi anche|Programmazione strutturata}}
La programmazione strutturata è una tecnica il cui scopo è di limitare la complessità della struttura del controllo dei programmi. Il programmatore è vincolato ad usare solo le strutture di controllo canoniche definite dal [[Teorema di Böhm-Jacopini]], ovvero la ''sequenza'', la ''selezione'' e il ''ciclo'', evitando le istruzioni di salto incondizionato.
{{Div col|cols=3}}
* [[Ada (linguaggio)|Ada]]
* [[C (linguaggio)|C]]
* [[Modula-2]]
* [[Oberon (linguaggio)|Oberon]]
* [[Pascal (linguaggio)|Pascal]]
{{Div col end}}
 
==== Orientati ad oggetti ====
{{vedi anche|Programmazione orientata agli oggetti}}
La programmazione a oggetti è basata su una evoluzione del concetto di [[tipo di dato astratto]] caratterizzata da [[Incapsulamento (informatica)|incapsulamento]], [[Ereditarietà (informatica)|ereditarietà]], [[Polimorfismo (informatica)|polimorfismo]]. Oltre a linguaggi specializzati che implementano completamente i principi di tale metodologia (come Smalltalk o Java), molti linguaggi moderni incorporano alcuni concetti della programmazione a oggetti.
 
{{Div col|cols=3}}
* [[Ada95]]
* [[Attack]]
* [[BETA]]
* [[Clarion]]
* [[CLOS]]
* [[C++]]
* [[C sharp|C#]]
* [[D (linguaggio di programmazione)|D]]
* [[DataFlex]]
* [[Delphi (linguaggio di programmazione)|Delphi]]
* [[Eiffel (linguaggio)|Eiffel]]
* [[Java (linguaggio)|Java]]
* [[Modula-3]]
* [[mShell]]
* [[Objective C]]
* [[OCaml]]
* [[OpenGenera]]
* [[Python]]
* [[PowerBuilder]]
* [[REALbasic]]
* [[REBOL]]
* [[Ruby]]
* [[Scala (linguaggio di programmazione)|Scala]]
* [[Scriptol]]
* [[Simula]]
* [[Smalltalk]]
* [[Visual Basic]]
* [[Visual Basic .NET]]
{{Div col end}}
 
=== Funzionali ===
{{vedi anche|Programmazione funzionale}}
I linguaggi funzionali sono basati sul concetto matematico di funzione. In un linguaggio funzionale puro l'assegnazione esplicita risulta addirittura completamente assente (si utilizza soltanto il passaggio dei parametri). In tale modello rivestono particolare importanza la [[ricorsione]], e, come struttura dati, la lista (sequenza ordinata di elementi). Il più importante rappresentante di questa categoria è senz'altro il Lisp (LISt Processing).
{{Div col|cols=3}}
* [[Clarion]]
* [[Clean]]
* [[Haskell]]
* [[Lisp]]
* [[Logo (informatica)|Logo]]
* [[Scala (linguaggio di programmazione)|Scala]]
* [[Scheme]]
* [[Standard ML]]
* [[Caml]]
* [[OCaml]]
{{Div col end}}
 
=== Dichiarativi (o logici) ===
{{vedi anche|Programmazione logica}}
Nei linguaggi logici l'istruzione è una ''clausola'' che descrive una relazione fra i dati: programmare in un linguaggio logico significa descrivere l'insieme delle relazioni esistenti fra i dati e il risultato voluto, e il programmatore è impegnato nello stabilire in che modo i dati devono evolvere durante il calcolo. Non c'è un ordine prestabilito di esecuzione delle varie clausole, ma è compito dell'interprete trovare l'ordine giusto.
 
La struttura di controllo principale è rappresentata dal '''cut''', che è detto ''rosso'' se modifica il comportamento del programma o ''verde'' se rende solo più efficiente il calcolo, che procede per ricorsione e non per iterazione. Le variabili ricevono il loro valore per istanziazione o da altre variabili già assegnate nella clausola (''unificazione'') e quasi mai per assegnamento, che è usato solo in caso di calcolo diretto di espressioni numeriche.
 
Affinché sia possibile usarli in un programma dichiarativo, tutti i normali algoritmi devono essere riformulati in termini ricorsivi e di ''backtracking''; questo rende la programmazione con questi linguaggi una esperienza del tutto nuova e richiede di assumere un modo di pensare radicalmente diverso, perché più che calcolare un risultato si richiede di dimostrarne il valore esatto. A fronte di queste richieste, i linguaggi dichiarativi consentono di raggiungere risultati eccezionali quando si tratta di manipolare gruppi di enti in relazione fra loro.
 
* [[Mercury (linguaggio)|Mercury]]
* [[Prolog]]
 
== Linguaggi esoterici ==
{{Div col|cols=3}}
* [[Befunge]]
* [[Brainfuck]]
* [[COW (linguaggio di programmazione)|COW]]
* [[Hq9plus|HQ9+]]
* [[HQ9++]]
* [[INTERCAL]]
* [[Malbolge]]
* [[Whitespace]]
* [[LOLCODE]]
{{Div col end}}
 
== Linguaggi paralleli ==
I moderni [[supercomputer]] e - ormai - tutti i calcolatori di fascia alta e media sono equipaggiati con più [[CPU]]. Come ovvia conseguenza, questo richiede la capacità di sfruttarle; per questo sono stati sviluppati dapprima il [[multithreading]], cioè la capacità di lanciare più parti dello stesso programma contemporaneamente su CPU diverse, e in seguito alcuni linguaggi studiati in modo tale da poter individuare da soli, in fase di compilazione, le parti di codice da lanciare in parallelo.
* [[Occam (linguaggio)|Occam]]
* [[Linda (linguaggio)|Linda]]
 
== Linguaggi di scripting ==
I linguaggi di questo tipo nacquero come ''linguaggi batch'': vale a dire liste di comandi di programmi interattivi che invece di venire digitati uno ad uno su una linea di comando, potevano essere salvati in un file, che diventava così una specie di comando composto che si poteva eseguire in [[Batch|modalità batch]] per automatizzare compiti lunghi e ripetitivi. I primi linguaggi di scripting sono stati quelli delle [[Shell (informatica)|shell]] [[Unix]]; successivamente, vista l'utilità del concetto molti altri programmi interattivi iniziarono a permettere il salvataggio e l'esecuzione di file contenenti liste di comandi, oppure il salvataggio di registrazioni di comandi visuali (le cosiddette '''Macro''' dei programmi di videoscrittura, per esempio).
 
Il passo successivo fu quello di far accettare a questi programmi anche dei comandi di salto condizionato e delle istruzioni di ciclo, regolati da simboli associati ad un certo valore: in pratica implementare cioè l'uso di variabili. Ormai molti programmi nati per tutt'altro scopo offrono agli utenti la possibilità di programmarli in modo autonomo tramite linguaggi di scripting più o meno proprietari. Molti di questi linguaggi hanno finito per adottare una sintassi molto simile a quella del C: altri invece, come il Perl e il Python, sono stati sviluppati ex novo allo scopo. Visto che nascono tutti come ''feature'' di altri programmi, tutti i linguaggi di scripting hanno in comune il fatto di essere [[Linguaggio interpretato|Linguaggi interpretati]], cioè eseguiti da un altro programma (il programma madre o un suo modulo).
{{Div col|cols=3}}
* [[AutoIt]]
* [[Applescript]]
* [[ActionScript]]
* [[Game Maker Language]] (vedi [[Game Maker]])
* [[HyperTalk]]
* [[JavaScript]]
* [[JScript]] (Implementazione [[Microsoft]] di [[Javascript]])
* [[mIRC scripting]]
* [[Lua]]
* [[Perl]]
* [[PHP]]
* [[Python]]
* [[QBasic]]
* [[Rexx]]
* [[Ruby]]
* [[Tcl]]
* [[thinBasic]]
* [[Visual Basic for Applications]] (VBA)
* [[VBScript]]
{{Div col end}}
 
== Valutare un linguaggio di programmazione ==
Non ha senso, in generale, parlare di linguaggi migliori o peggiori, o di linguaggi migliori in assoluto: ogni linguaggio nasce per affrontare una classe di problemi più o meno ampia, in un certo modo e in un certo ambito. Però, dovendo dire se un dato linguaggio sia adatto o no per un certo uso, è necessario valutare le caratteristiche dei vari linguaggi.
=== Caratteristiche intrinseche ===
Sono le qualità del linguaggio in sé, determinate dalla sua sintassi e dalla sua architettura interna. Influenzano direttamente il lavoro del programmatore, condizionandolo. Non dipendono né dagli strumenti usati (compilatore/interprete, IDE, linker) né dal sistema operativo o dal tipo di macchina.
 
*'''Espressività''': la facilità e la semplicità con cui si può scrivere un dato algoritmo in un dato linguaggio; può dipendere dal tipo di algoritmo, se il linguaggio in questione è nato per affrontare certe particolari classi di problemi. In generale se un certo linguaggio consente di scrivere algoritmi con poche istruzioni, in modo chiaro e leggibile, la sua espressività è buona.
 
*'''Didattica''': la semplicità del linguaggio e la rapidità con cui lo si può imparare. Il BASIC, per esempio, è un linguaggio facile da imparare: poche regole, una sintassi molto chiara e limiti ben definiti fra quello che è permesso e quello che non lo è. Il Pascal non solo ha i pregi del BASIC ma educa anche il neo-programmatore ad adottare uno stile corretto che evita molti errori e porta a scrivere codice migliore. Al contrario, il C non è un linguaggio didattico perché pur avendo poche regole ha una semantica molto complessa, a volte oscura, che lo rende molto efficiente ed espressivo ma richiede tempo per essere padroneggiata.
 
*'''Leggibilità''': la facilità con cui, leggendo un codice sorgente, si può capire cosa fa e come funziona. La leggibilità dipende non solo dal linguaggio ma anche dallo stile di programmazione di chi ha creato il programma: tuttavia la sintassi di un linguaggio può facilitare o meno il compito. Non è detto che un linguaggio leggibile per un profano lo sia anche per un esperto: in generale le abbreviazioni e la concisione consentono a chi già conosce un linguaggio di concentrarsi meglio sulla logica del codice senza perdere tempo a leggere, mentre per un profano è più leggibile un linguaggio molto prolisso.
A volte, un programma molto complesso e poco leggibile in un dato linguaggio può diventare assolutamente semplice e lineare se riscritto in un linguaggio di classe differente, più adatta.
 
*'''Robustezza''': è la capacità del linguaggio di prevenire, nei limiti del possibile, gli errori di programmazione. Di solito un linguaggio robusto si ottiene adottando un controllo molto stretto sui tipi di dati e una sintassi chiara e molto rigida; altri sistemi sono l'implementare un garbage collector, limitando (a prezzo di una certa perdita di efficienza) la creazione autonoma di nuove entità di dati e quindi l'uso dei puntatori, che possono introdurre bug molto difficili da scoprire.
 
L'esempio più comune di linguaggio robusto è il Pascal, che essendo nato a scopo didattico presuppone sempre che una irregolarità nel codice sia frutto di un errore del programmatore; mentre l'assembly è l'esempio per antonomasia di linguaggio totalmente libero, in cui niente vincola il programmatore (e se scrive codice pericoloso o errato, non c'è niente che lo avverta).
 
*'''Modularità''': quando un linguaggio facilita la scrittura di parti di programma indipendenti (moduli) viene definito ''modulare''. I moduli semplificano la ricerca e la correzione degli errori, permettendo di isolare rapidamente la parte di programma che mostra il comportamento errato e modificarla senza timore di introdurre conseguenze in altre parti del programma stesso. Questo si ripercuote positivamente sulla '''manutenibilità''' del codice; inoltre permette di riutilizzare il codice scritto in passato per nuovi programmi, apportando poche modifiche. In genere la modularità si ottiene con l'uso di sottoprogrammi (subroutine, procedure, funzioni) e con la programmazione ad oggetti.
 
*'''Flessibilità''': la possibilità di adattare il linguaggio, estendendolo con la definizione di nuovi comandi e nuovi operatori. I linguaggi classici come il BASIC, il Pascal e il Fortran non hanno questa capacità, che invece è presente nei linguaggi dichiarativi, in quelli funzionali e nei linguaggi imperativi ad oggetti più recenti come il C++ e Java.
 
*'''Generalità''': la facilità con cui il linguaggio si presta a codificare algoritmi e soluzioni di problemi in campi diversi. Di solito un linguaggio molto generale, per esempio il C, risulta meno espressivo e meno potente in una certa classe di problemi di quanto non sia un linguaggio specializzato in quella particolare nicchia, che in genere è perciò una scelta migliore finché il problema da risolvere non esce da quei confini.
 
*'''Efficienza''': la velocità di esecuzione e l'uso oculato delle risorse del sistema su cui il programma finito gira. In genere i programmi scritti in linguaggi molto astratti tendono ad essere lenti e voraci di risorse, perché lavorano entro un modello che non riflette la reale struttura dell'hardware ma è una cornice concettuale, che deve essere ricreata artificialmente; in compenso facilitano molto la vita del programmatore poiché lo sollevano dalla gestione di numerosi dettagli, accelerando lo sviluppo di nuovi programmi ed eliminando intere classi di errori di programmazione possibili. Viceversa un linguaggio meno astratto ma più vicino alla reale struttura di un computer genererà programmi molto piccoli e veloci ma a costo di uno sviluppo più lungo e difficoltoso.
 
*'''Coerenza''': l'applicazione dei principi base di un linguaggio in modo uniforme in tutte le sue parti. Un linguaggio coerente è un linguaggio facile da prevedere e da imparare, perché una volta appresi i principi base questi sono validi sempre e senza (o con poche) eccezioni.
 
=== Caratteristiche esterne ===
Oltre alle accennate qualità dei linguaggi, possono essere esaminate quelle degli ambienti in cui operano. Un programmatore lavora con strumenti software, la cui qualità e produttività dipende da un insieme di fattori che vanno pesati anch'essi in funzione del tipo di programmi che si intende scrivere.
 
*'''Diffusione''': il numero di programmatori nel mondo che usa il tale linguaggio. Ovviamente più è numerosa la comunità dei programmatori tanto più è facile trovare materiale, aiuto, librerie di funzioni, documentazione, consigli. Inoltre ci sono un maggior numero di software house che producono strumenti di sviluppo per quel linguaggio, e di qualità migliore.
 
*'''Standardizzazione''': un produttore di strumenti di sviluppo sente sempre la tentazione di introdurre delle variazioni sintattiche o delle migliorie più o meno grandi ad un linguaggio, originando un ''dialetto'' del linguaggio in questione e fidelizzando così i programmatori al suo prodotto: ma più dialetti esistono, più la comunità di programmatori si frammenta in sottocomunità più piccole e quindi meno utili. Per questo è importante l'esistenza di uno [[standard]] per un dato linguaggio che ne garantisca certe caratteristiche, in modo da evitarne la dispersione. Quando si parla di ''Fortran 77'', ''Fortran 90'', ''C 99'' ecc. si intende lo standard sintattico e semantico del tale linguaggio approvato nel tale anno, in genere dall'[[ANSI]] o dall'[[ISO]].
 
*'''Integrabilità''': dovendo scrivere programmi di una certa dimensione, è molto facile trovarsi a dover integrare parti di codice precedente scritte in altri linguaggi: se un dato linguaggio di programmazione consente di farlo facilmente, magari attraverso delle procedure standard, questo è decisamente un punto a suo favore. In genere tutti i linguaggi "storici" sono bene integrabili, con l'eccezione di alcuni, come lo Smalltalk, creati più per studio teorico che per il lavoro reale di programmazione.
 
*'''Portabilità''': la possibilità che portando il codice scritto su una certa '''piattaforma''' (CPU + architettura + sistema operativo) su un'altra, questo funzioni subito, senza doverlo modificare. A questo scopo è molto importante l'esistenza di uno standard del linguaggio, anche se a volte si può contare su degli standard ''de facto'' come il C ''K&R'' o il Delphi.
 
== Note ==
<references />
 
== Voci correlate ==
* [[Programmazione (informatica)|Programmazione]]
 
== Collegamenti esterni ==
*[http://www.methack.it/devblog/2008/06/30/la-popolarita-dei-linguaggi-di-programmazione/ La popolarità dei linguaggi di programmazione]
*[http://www.booksopen.org/index.php?option=com_content&view=section&id=9&Itemid=56 Raccolta di manuali sui linguaggi di programmazione in pdf.] Licenze copyleft.
 
== Altri progetti ==
{{interprogetto|commons=Category:Algorithms}}
{{Link AdQ|he}}
{{Link AdQ|vi}}
 
[[Categoria:Linguaggi di programmazione]]
[[Categoria:Programmazione]]
 
[[af:Programmeertaal]]
[[als:Programmiersprache]]
[[am:የፕሮግራም ቋንቋ]]
[[an:Luengache de programazión]]
[[ar:لغة برمجة]]
[[arz:لغة برمجه]]
[[ast:Llinguaxe de programación]]
[[bat-smg:Pruogramavėma kalba]]
[[be:Мова праграмавання]]
[[bg:Език за програмиране]]
[[bn:প্রোগ্রামিং ভাষা]]
[[br:Areg]]
[[bs:Programski jezik]]
[[bug:ᨅᨔ ᨀᨚᨇᨘᨈᨛᨑᨛ]]
[[ca:Llenguatge de programació]]
[[cs:Programovací jazyk]]
[[cv:Компьютер чĕлхи]]
[[da:Programmeringssprog]]
[[de:Programmiersprache]]
[[el:Γλώσσα προγραμματισμού]]
[[en:Programming language]]
[[eo:Programlingvo]]
[[es:Lenguaje de programación]]
[[et:Programmeerimiskeel]]
[[eu:Programazio-lengoaia]]
[[fa:زبان‌های برنامه‌نویسی]]
[[fi:Ohjelmointikieli]]
[[fr:Langage de programmation]]
[[gl:Linguaxe de programación]]
[[he:שפת תכנות]]
[[hi:प्रोग्रामिंग भाषा]]
[[hr:Programski jezik]]
[[hsb:Programěrowanske rěče]]
[[hu:Programozási nyelv]]
[[ia:Linguage de programmation]]
[[id:Bahasa pemrograman]]
[[ilo:Lengguahe ti panangprograma]]
[[is:Forritunarmál]]
[[ja:プログラミング言語]]
[[jbo:samplabau]]
[[ka:პროგრამირების ენა]]
[[kab:Timeslayin n usihel]]
[[ko:프로그래밍 언어]]
[[la:Lingua programmandi]]
[[lb:Programméiersprooch]]
[[lt:Programavimo kalba]]
[[lv:Programmēšanas valoda]]
[[mk:Програмски јазик]]
[[ml:പ്രോഗ്രാമിംഗ് ഭാഷ]]
[[mn:Программчлалын хэл]]
[[mr:प्रोग्रॅमिंग भाषा]]
[[ms:Bahasa pengaturcaraan]]
[[nl:Programmeertaal]]
[[nn:Programmeringsspråk]]
[[no:Programmeringsspråk]]
[[pl:Język programowania]]
[[pt:Linguagem de programação]]
[[ro:Limbaj de programare]]
[[ru:Язык программирования]]
[[sah:Программалааhын тыла]]
[[simple:Programming language]]
[[sk:Programovací jazyk]]
[[sl:Programski jezik]]
[[sq:Gjuhë programimi]]
[[sr:Програмски језик]]
[[su:Basa program]]
[[sv:Programspråk]]
[[ta:நிரல் மொழி]]
[[te:ప్రోగ్రామింగు భాష]]
[[tg:Забони барномасозӣ]]
[[th:ภาษาโปรแกรม]]
[[tl:Wikang pamprograma]]
[[tr:Programlama dili]]
[[uk:Мова програмування]]
[[ur:برمجہ زبان]]
[[vi:Ngôn ngữ lập trình]]
[[war:Yinaknan han programa]]
[[zh:编程语言]]
[[zh-min-nan:Thêng-sek gí-giân]]
[[zh-yue:程式語言]]