Un linguaggio di programmazione è una notazione convenzionale per formulare algoritmi e produrre programmi per computer che li applicano. In modo simile a un linguaggio naturale, un linguaggio di programmazione è composto da un alfabeto , un vocabolario , regole grammaticali , significati , ma anche un ambiente di traduzione che dovrebbe rendere comprensibile alla macchina la sua sintassi .
I linguaggi di programmazione consentono di descrivere, da un lato, le strutture dei dati che verranno manipolate dall'apparato informatico, e dall'altro di indicare come vengono eseguite le manipolazioni, secondo quali algoritmi. Servono come mezzo di comunicazione attraverso il quale il programmatore comunica con il computer, ma anche con altri programmatori; i programmi di solito vengono scritti, letti, compresi e modificati da un team di programmatori.
Un linguaggio di programmazione è implementato da un traduttore automatico: compilatore o interprete . Un compilatore è un programma per computer che prima trasforma un codice sorgente scritto in un determinato linguaggio di programmazione in un codice di destinazione che può essere eseguito direttamente da un computer, ovvero un programma in linguaggio macchina o in codice intermedio , mentre l'interprete esegue questa traduzione " al volo".
I linguaggi di programmazione offrono diverse possibilità di astrazione e una notazione vicina all'algebra , consentendo di descrivere in modo conciso e di facile comprensione le operazioni di manipolazione dei dati e l'evoluzione del flusso del programma a seconda delle situazioni. La possibilità della scrittura astratta libera la mente del programmatore dal lavoro non necessario, compreso il prendere in considerazione le specifiche dell'hardware del computer, e quindi gli consente di concentrarsi su problemi più avanzati.
Ciascun linguaggio di programmazione supporta uno o più approcci di programmazione- paradigma . I concetti che inducono il paradigma fanno parte del linguaggio di programmazione e consentono al programmatore di esprimere nel linguaggio una soluzione che è stata immaginata secondo questo paradigma.
I primi linguaggi di programmazione sono stati creati negli anni '50 in concomitanza con l'avvento dei computer . Tuttavia, molti concetti di programmazione sono stati avviati da un linguaggio o talvolta da più linguaggi, prima di essere migliorati e quindi estesi nei linguaggi successivi. Il più delle volte la progettazione di un linguaggio di programmazione è stata fortemente influenzata dall'esperienza maturata con i linguaggi precedenti.
Un linguaggio di programmazione è costruito da una grammatica formale , che include simboli e regole sintattiche, a cui sono associate regole semantiche. Questi elementi sono più o meno complessi a seconda delle capacità della lingua. Le modalità di funzionamento e la definizione della complessità di un linguaggio di programmazione sono generalmente determinate dalla loro appartenenza ad uno dei gradi della gerarchia di Chomsky .
Da un punto di vista teorico, qualsiasi linguaggio informatico può essere qualificato come linguaggio di programmazione se è Turing-completo, vale a dire che consente di rappresentare tutte le funzioni computabili nel senso di Turing e Church (pur ammettendo per eccezione alla teoria che la memoria dei computer non è uno spazio infinito).
Le regole della sintassi Definite da una grammatica formale , disciplinano i diversi modi in cui gli elementi del linguaggio possono essere combinati per ottenere programmi. La punteggiatura (ad esempio l'apposizione di un simbolo ; alla fine di una riga di istruzione del programma) è una questione di sintassi. il vocabolario Tra gli elementi del linguaggio, il vocabolario rappresenta l'insieme delle istruzioni costruite a partire da simboli . L'istruzione può essere mnemonica o solo simbolica come quando è rappresentata da simboli operativi come operatori aritmetici ("+" e "-") o booleani (&& per la logica e per esempio). Si parla talvolta anche di parola chiave per designare un'istruzione (per abuso di linguaggio perché il concetto di parola chiave non copre quello di simboli che però fanno anche parte del vocabolario ). la semantica Le regole della semantica definiscono il significato di ciascuna delle frasi che possono essere costruite nel linguaggio, in particolare quali saranno gli effetti della frase quando il programma viene eseguito. La scienza per lo studente è la semantica dei linguaggi di programmazione . L' alfabeto L'alfabeto per i linguaggi di programmazione si basa sugli standard attuali come ASCII , che consiste in lettere dalla A alla Z senza accenti, numeri e simboli, o Unicode per la maggior parte dei linguaggi moderni (in cui l'uso è limitato alle stringhe generali o letterali e commenti, con alcune eccezioni degne di nota come C♯ che consentono anche identificatori unicode).La maggior parte dei linguaggi di programmazione può fornire elementi strutturali aggiuntivi, metodi procedurali e definizioni e identificatori temporanei e variabili:
i commenti I commenti sono testi che non verranno tradotti. Possono essere aggiunti nei programmi per lasciare spiegazioni. I commenti sono delimitati da segni che differiscono da linguaggio di programmazione a linguaggio di programmazione come "-" , "/ *" o "//" . gli ID Gli elementi costitutivi del programma, come variabili , procedure o tipi, vengono utilizzati per organizzare il programma e il suo funzionamento. Possiamo così, ad esempio, dividere un programma in funzioni o dargli una struttura per oggetti : questi elementi della struttura sono definiti da identificatori o procedure di parole chiave a seconda del linguaggio.Un linguaggio di programmazione fornisce un framework per costruire algoritmi ed esprimere diagrammi di flusso. Consente in particolare di descrivere le strutture dei dati che verranno trattati dall'apparato informatico e quali saranno le manipolazioni. Un linguaggio di programmazione viene utilizzato come mezzo di comunicazione con il computer ma anche tra programmatori: i programmi vengono solitamente scritti, letti e modificati da un team di programmatori.
Un linguaggio di programmazione offre un insieme di concetti che possono essere usati come primitivi per sviluppare algoritmi. I programmatori apprezzano che il linguaggio sia chiaro, semplice e unificato, che ci sia un minimo di nozioni che possono essere combinate secondo regole semplici e regolari. Le qualità di un linguaggio di programmazione influiscono sulla facilità con cui i programmi possono essere scritti, testati e successivamente compresi e modificati.
Facilità d'uso, portabilità e chiarezza sono qualità popolari dei linguaggi di programmazione. La facilità d'uso, che dipende dalla sintassi, dal vocabolario e dai simboli, influenza la leggibilità dei programmi scritti in questa lingua e la durata dell'apprendimento. La portabilità consente di trasferire un programma scritto per essere eseguito da una determinata piattaforma informatica (un sistema operativo) per l'esecuzione su un'altra piattaforma.
Ai programmatori piace la sintassi per esprimere la struttura logica inerente al programma. Una delle preoccupazioni nella programmazione è evitare guasti, che sia possibile rilevarli, evitarli e correggerli; ciò è reso possibile dai meccanismi interni dei linguaggi di programmazione. A volte vengono eseguiti controlli impliciti per individuare i problemi.
I programmatori apprezzano che un linguaggio di programmazione è in linea con le buone pratiche di programmazione e ingegneria, incoraggia la strutturazione del programma, facilita la manutenzione del programma e scoraggia o addirittura vieta le cattive pratiche. L'utilizzo dell'istruzione goto, ad esempio, che esiste dai primi linguaggi di programmazione, è considerata una cattiva pratica. Il suo utilizzo è sconsigliato, o addirittura impossibile, nei recenti linguaggi di programmazione.
L'allineamento con gli standard del settore, la capacità di utilizzare funzionalità scritte in un altro linguaggio di programmazione e l'esecuzione simultanea di più thread sono possibilità popolari per i linguaggi di programmazione.
Un linguaggio di programmazione si basa su un insieme di nozioni come istruzioni, variabili, tipi e procedure o funzioni, che possono essere utilizzate come primitive per sviluppare algoritmi.
un'istruzioneUn ordine dato a un computer.
Una variabileUn nome utilizzato in un programma per fare riferimento a dati manipolati dal programma.
Una costanteUn nome utilizzato per fare riferimento a un valore permanente.
Un'espressione letteraleUn valore citato per intero nel programma.
un tipoOgni dato ha una classificazione, che influenza l'intervallo dei valori possibili, le operazioni eseguibili e la rappresentazione dei dati sotto forma di bit. Ogni linguaggio di programmazione offre una gamma di tipi primitivi , incorporati nel linguaggio. Alcune lingue offrono la possibilità di creare nuovi tipi.
I tipi di dati primitivi comuni sono interi , numeri reali , booleani , stringhe e puntatori .
In particolare, il tipo booleano è un tipo che ha solo due valori, true e false , mentre il tipo puntatore si riferisce a dati che si trovano da qualche parte nella memoria.
Ad esempio, il linguaggio C ha una varietà di tipi che consentono di scegliere con precisione la quantità di memoria allocata ai dati.
Una struttura datiUn modo caratteristico di organizzare un insieme di dati in memoria, che influenza gli algoritmi utilizzati per manipolarli. Le strutture comuni sono array , record , elenchi , pile , code e alberi .
Una dichiarazioneUna frase di programma che viene utilizzata per informare il traduttore (compilatore, interprete, ecc.) dei nomi e delle caratteristiche degli elementi del programma come variabili, procedure, tipi, ecc.
I controlli vengono eseguiti in fase di compilazione o durante l'esecuzione del programma, per garantire che le operazioni del programma siano possibili con i tipi di dati utilizzati. In un linguaggio fortemente tipizzato , ogni elemento del programma ha un tipo univoco, conosciuto e verificato in fase di compilazione, che rende possibile intercettare gli errori prima dell'esecuzione del programma.
Procedure, funzioni, metodiDiversi linguaggi di programmazione offrono la possibilità di isolare un frammento di un programma e renderlo un'operazione generale, configurabile e riutilizzabile. Questi frammenti sono chiamati procedure , funzioni o metodi , a seconda del paradigma.
ModuliI linguaggi di programmazione possono anche offrire la possibilità di suddividere un programma in più parti chiamate moduli , ognuna con un determinato ruolo, quindi di unire le parti.
I concetti di procedura e modulo hanno lo scopo di facilitare la creazione di programmi complessi e voluminosi, aiutando ad affrontare questa complessità. Queste funzioni consentono in particolare la modularità e l' astrazione .
Un paradigma è un modo di affrontare la programmazione. Ogni paradigma porta la sua filosofia di programmazione; una volta che una soluzione è stata immaginata da un programmatore secondo un certo paradigma, un linguaggio di programmazione che segue quel paradigma permetterà di esprimerla. I paradigmi di programmazione sono imperativi, dichiarativi, funzionali, logici, orientati agli oggetti, concorrenti, visivi, guidati dagli eventi e basati sul web. Ciascun linguaggio di programmazione riflette uno o più paradigmi, fornendo un insieme di concetti che possono essere utilizzati per esprimere una soluzione a un problema di programmazione. Nel corso della storia, scienziati e programmatori hanno identificato i vantaggi ei limiti di uno stile di programmazione e introdotto nuovi stili. La maggior parte dei linguaggi di programmazione contemporanei consente l'adozione di diversi paradigmi di programmazione purché compatibili.
Il paradigma imperativo o procedurale si basa sul principio di eseguire le istruzioni passo dopo passo proprio come fare una ricetta di cucina. Si basa sul principio della macchina di Von Neumann . Un insieme di istruzioni di controllo del flusso di esecuzione controlla l'ordine in cui vengono eseguite le istruzioni che descrivono i passaggi. Il C , il Pascal , il Fortran e il COBOL sono esempi di linguaggio di programmazione che implementa il paradigma imperativo.
Ci sono essenzialmente due paradigmi dichiarativi; questi sono il paradigma funzionale e il paradigma logico. Nel paradigma funzionale, il programma descrive le funzioni matematiche. In paradigma logico, descrive i predicati : cioè le affermazioni che, una volta istanziate, possono essere vere o false o non ricevere un valore di verità (quando la valutazione del predicato non termina). In un modello di implementazione, una macchina astratta esegue le operazioni necessarie per calcolare il risultato di ciascuna funzione o di ciascun predicato. In questi paradigmi, una variabile non viene modificata dall'assegnazione . Una delle caratteristiche principali è la trasparenza referenziale , il che significa che un'espressione può essere sostituita dal suo risultato senza modificare il comportamento del programma.
FunzionaleIl paradigma funzionale si basa sulla valutazione di formule, al fine di utilizzare il risultato per altri calcoli; si basa sulla ricorsione e il suo modello è il lambda-calcolo , più precisamente la riduzione in forma normale della testa . Tutti i calcoli valutano espressioni o chiamano funzioni. In parole povere, il risultato di un calcolo viene utilizzato per il calcolo oi calcoli che richiedono il suo risultato fino a quando non viene valutata la funzione che produce il risultato del programma. Il paradigma funzionale è stato introdotto dai linguaggi Lisp e ISWIM nonché per quanto riguarda le funzioni ricorsive da Algol 60 , negli anni 60. Linguaggi come Ruby e Scala supportano diversi paradigmi compreso il paradigma funzionale, mentre Haskell supporta solo il paradigma funzionale e OCaml favorisce il paradigma funzionale che condivide con il paradigma oggetto e una piccola dose di imperativo.
LogicaIl paradigma logico mira a rispondere a una domanda ricercando un insieme, utilizzando assiomi, interrogativi e regole di deduzione. L'esecuzione di un programma è una cascata di ricerche di fatti in un insieme, invocando regole di deduzione. I dati ottenuti possono essere associati ad un altro insieme di regole e possono quindi essere utilizzati nel contesto di un'altra ricerca. Il programma viene eseguito per valutazione: il sistema ricerca tutti gli enunciati che, per deduzione, corrispondono ad almeno un elemento dell'insieme. Il programmatore esprime le regole e il sistema guida il processo. Il paradigma logico è stato introdotto dal linguaggio Prolog nel 1970.
Il paradigma orientato agli oggetti ha lo scopo di facilitare la divisione di un grande programma in diversi moduli isolati l'uno dall'altro. Introduce le nozioni di oggetto e di ereditarietà. Un oggetto contiene le variabili e le funzioni relative a un soggetto. Le variabili possono essere private , ovvero possono essere gestite solo dall'oggetto che le contiene. Un oggetto contiene implicitamente le variabili e le funzioni dei suoi predecessori e questa ereditarietà aiuta il riutilizzo del codice. Il paradigma orientato agli oggetti consente di associare fortemente i dati alle procedure. È stato introdotto dal linguaggio Simula negli anni '60 ed è diventato popolare negli anni '80, quando l'aumento della potenza di calcolo dei computer ha reso possibile l'esecuzione di programmi di grandi dimensioni. Diversi linguaggi di programmazione sono stati arricchiti al fine di consentire la programmazione orientata agli oggetti; questo è il caso di C++ (derivato dal linguaggio C ), Simula , Smalltalk , Swift e Java sono linguaggi di programmazione in paradigma orientato agli oggetti.
In un paradigma simultaneo un programma può eseguire più attività contemporaneamente. Questo paradigma introduce le nozioni di thread , active wait e remote function call. Questi concetti sono stati introdotti negli anni '80 quando, a seguito dello sviluppo tecnologico, un computer è diventato una macchina con più processori e in grado di svolgere più compiti contemporaneamente. I linguaggi di programmazione contemporanei del 2013 come C++ e Java sono adatti per microprocessori multi-core e consentono la creazione e la manipolazione di thread. Più recentemente, abbiamo assistito all'emergere di linguaggi completamente orientati alla gestione della concorrenza, come il linguaggio Go .
Nella stragrande maggioranza dei linguaggi di programmazione, il codice sorgente è il testo, il che rende difficile esprimere oggetti bidimensionali. Un linguaggio di programmazione come Delphi o C# consente di manipolare gli oggetti trascinandoli e rilasciandoli e il disegno risultante viene quindi tradotto in una rappresentazione testuale orientata agli oggetti e guidata dagli eventi. Il paradigma visuale è stato introdotto alla fine degli anni '80 da Alan Kay nel linguaggio Smalltalk , con l'obiettivo di facilitare la programmazione delle interfacce grafiche .
Mentre un programma interattivo pone una domanda ed esegue azioni in base alla risposta, in stile evento il programma non aspetta nulla e viene eseguito quando è successo qualcosa. Ad esempio, l'utente sposta il mouse o preme un pulsante. In questo paradigma, la programmazione riguarda la descrizione delle azioni da intraprendere in risposta agli eventi. E un'azione a cascata può innescare un'altra azione corrispondente a un altro evento. Il paradigma degli eventi è stato introdotto dal linguaggio Simula negli anni '70 ed è diventato popolare con l'avvento delle interfacce grafiche e delle applicazioni web.
Con l'avvento di Internet negli anni '90, i dati, le immagini e il codice vengono scambiati tra computer. Se viene richiesto un risultato da un computer, può eseguire il programma necessario e inviare il risultato. Può anche inviare il codice necessario al computer client per calcolare il risultato stesso. Il programma è raramente tradotto in linguaggio macchina , ma piuttosto interpretato o tradotto in una forma intermedia, il bytecode , che verrà eseguito da una macchina virtuale , o tradotto in linguaggio macchina a runtime ( just-in-time ). Java, PHP e Javascript sono linguaggi di programmazione web based.
L'uso di una lingua è reso possibile da un traduttore automatico. Un programma che prende un testo scritto in quella lingua per fare qualcosa con esso, di solito:
Un programma che traduce il testo in un linguaggio che ne consentirà l'esecuzione, come linguaggio macchina , bytecode o linguaggio assembly .
Un programma che esegue le istruzioni richieste. Svolge lo stesso ruolo di una macchina che riconosce questa lingua.
Ogni dispositivo informatico ha una serie di istruzioni che possono essere utilizzate per eseguire operazioni. Le istruzioni consentono di eseguire calcoli aritmetici o logici, spostare o copiare dati o passare all'esecuzione di altre istruzioni. Tali istruzioni vengono registrate sotto forma di sequenze di bit, dove ciascuna sequenza corrisponde al codice dell'operazione da eseguire e agli operandi, cioè ai dati interessati; è un linguaggio macchina.
La traduzione avviene in più fasi. Innanzitutto, il traduttore esegue un'analisi lessicale in cui identifica gli elementi linguistici utilizzati nel programma. Nella fase successiva, il parsing , il traduttore costruisce un diagramma ad albero che riflette come gli elementi del linguaggio sono stati combinati nel programma, per formare le istruzioni. Quindi, durante l' analisi semantica , il traduttore determina se è possibile eseguire l'operazione e le istruzioni che verranno richieste nella lingua di destinazione.
Nel linguaggio di programmazione assembly, le parole cheat (mnemonico) vengono utilizzate per fare riferimento alle istruzioni della macchina. Le istruzioni differiscono a seconda del costruttore e lo stesso vale per i mnemonici. Un programma di assemblaggio traduce ogni mnemonico nella sequenza di bit corrispondente.
I linguaggi di programmazione spesso funzionano utilizzando un runtime .
Un runtime (traduzione: executor ) è un insieme di librerie software che implementano il linguaggio di programmazione, consentendo di eseguire operazioni semplici, come la copia di dati, ma anche operazioni molto più complesse.
Quando si traduce un programma in linguaggio macchina, le operazioni semplici vengono tradotte nelle corrispondenti istruzioni in linguaggio macchina mentre le operazioni complesse vengono tradotte in usi di funzioni di runtime . In alcuni linguaggi di programmazione, tutte le istruzioni vengono tradotte in utilizzi del runtime che funge quindi da intermediario tra le possibilità offerte dalla piattaforma informatica e le costruzioni specifiche del linguaggio di programmazione.
Ogni linguaggio di programmazione ha un modo convenzionale di tradurre l'esecuzione di procedure o funzioni, di inserire variabili in memoria e di passare parametri. Queste convenzioni vengono applicate dal runtime . Il runtime è stato utilizzato anche per implementare alcune funzionalità avanzate dei linguaggi di programmazione come la garbage collection o la reflection.
I linguaggi di programmazione sono comunemente auto-implementati, ovvero il compilatore per quel linguaggio di programmazione è implementato nel linguaggio stesso. Esempio: un compilatore per il linguaggio Pascal può essere scritto in linguaggio Pascal.
Funzionalità avanzate come Garbage Collector , gestione di eccezioni, eventi o thread, nonché late binding e Reflection sono implementate dai linguaggi di programmazione runtime .
Un meccanismo che rimuove le variabili inutilizzate e libera lo spazio di memoria che era stato loro riservato.
Un fatto imprevisto, spesso accidentale, provoca il fallimento del normale svolgimento del programma, e questo fatto eccezionale deve essere curato dal programma prima che possa continuare. Alcuni linguaggi di programmazione consentono di interrompere deliberatamente il normale flusso del programma.
Una procedura che verrà eseguita quando viene soddisfatta una particolare condizione. Gli eventi vengono utilizzati in particolare per implementare interfacce grafiche .
Una sequenza di istruzioni in esecuzione. I linguaggi di programmazione che manipolano i thread consentono di eseguire più attività contemporaneamente. Questa possibilità di esecuzione simultanea, offerta dai sistemi operativi, è offerta in forma leggera anche dal runtime dei linguaggi di programmazione.
Il processo di binding (inglese late binding o dynamic binding ) consiste nell'associare ogni identificatore di un programma alla locazione di memoria interessata. Questa operazione può essere eseguita durante la traduzione del programma, durante l'esecuzione del programma o poco prima, si dice in ritardo quando l'operazione di collegamento viene eseguita molto tardi, appena prima che venga utilizzata la locazione interessata.
La possibilità per un programma di ottenere informazioni sulle proprie caratteristiche. Le istruzioni del linguaggio di programmazione consentono a un programma di ottenere informazioni su se stesso e di manipolarle come dati.
Una struttura che permette di manipolare tratti imperativi in linguaggi funzionali puri.
Anche se la nozione di programma appare gradualmente durante la seconda metà del XIX E secolo, i primi linguaggi di programmazione non appaiono fino a quando intorno al 1950. Ogni essere in grado di creare un proprio linguaggio, è impossibile determinare il numero totale di lingue. esistente allo stato attuale.
Possiamo anche classificare i linguaggi di programmazione in base al loro utilizzo perché molti linguaggi sono specializzati in una particolare applicazione o dominio.
Questo tipo di linguaggio viene utilizzato per una maggiore interazione tra un client e un server .
Lato Web server , ciò consente di produrre pagine il cui contenuto viene generato su ciascun display. Questi linguaggi sono spesso abbinati anche ad un linguaggio per comunicare con i database (esempi: PHP , LiveCode ).
Lato client (generalmente il browser web ), questi linguaggi offrono la possibilità di reagire a determinate azioni dell'utente senza dover interrogare il server. Ad esempio, JavaScript su una pagina Web può reagire all'input dell'utente in un modulo (e controllare il formato dei dati ).
Alcuni linguaggi consentono di sviluppare aspetti sia client che server. Questo è il caso di Ocsigen , Hop , Dart o anche JavaScript lato server .
Il linguaggio di programmazione teorico è talvolta indicato come sistemi formali utilizzati per descrivere teoricamente il funzionamento dei computer. Non vengono utilizzati per sviluppare applicazioni ma per rappresentare modelli e dimostrare alcune delle loro proprietà.
Possiamo citare la macchina di Turing e della Chiesa λ-calcolo, sia di che data dal 1930, e quindi antecedenti l'invenzione del computer. Il λ-calcolo è stato successivamente utilizzato come base teorica per la famiglia dei linguaggi di programmazione funzionale . Negli anni '80, Robin Milner ha sviluppato il -calcolo per modellare i sistemi concorrenti.
I linguaggi esotici mirano a creare grammatiche complete e funzionali ma in un paradigma lontano dalle convenzioni. Molti sono anche considerati scherzi.
Queste lingue sono generalmente difficili da mettere in pratica e quindi usate raramente.
Linguaggi di programmazione sincrona per sistemi reattivi: Esterel , Lustre .
Lingue educativeLo pseudo-codice di solito ha solo uno scopo pedagogico.
R , SAS e xLispStat sono entrambi linguaggi e software di statistica.
Linguaggi di programmazione a controllo numerico (NC)Una macchina utensile automatizzata, o Controllo Numerico (NC), necessita di un linguaggio di programmazione per eseguire operazioni di tornitura o fresatura ...
Linguaggi di programmazione di controllori logici programmabili industriali (PLC)Nyquist è un linguaggio di sintesi e analisi del suono. Pure Data è un software di creazione musicale grafica basato su un linguaggio di programmazione procedurale.
Sei ricercatori di tre università portoghesi hanno condotto uno studio comparativo su 27 linguaggi di programmazione, intitolato “Energy Efficiency Across Programming Languages”. Hanno esaminato il consumo energetico, il tempo di esecuzione e l'utilizzo della memoria. Per ottenere una serie di programmi comparabili, i ricercatori hanno esplorato il Computer Language Benchmarks Game (CLBG).
La tabella risultante presenta i risultati complessivi (in media) per il consumo di energia (Energy), il tempo di esecuzione (Time) e il consumo massimo di memoria (Mb) normalizzati rispetto al linguaggio più efficiente per il criterio misurato.
Le cinque migliori lingue sono:
La popolarità di ogni lingua è difficile da quantificare; esiste invece l' indice TIOBE , calcolato mensilmente, che si basa sul numero di training/corsi destinati agli ingegneri e sul numero di rivenditori/freelance specializzati in un linguaggio di programmazione. Si tratta di informazioni frammentarie, ma possono dare un'idea delle tendenze in termini di preferenze dei programmatori.