Llenguatge de programació

De la Viquipèdia, l'enciclopèdia lliure.
Saltar a la navegació Saltar a la cerca
Codi font d’un programa escrit en llenguatge BÀSIC

Un llenguatge de programació , en informàtica , és un llenguatge formal que especifica un conjunt d' instruccions que es poden utilitzar per produir dades de sortida: es pot utilitzar per controlar el comportament d'una màquina formal o una implementació d'aquesta (normalment, un ordinador ) o bé en la fase de programació mitjançant l'escriptura del codi font d'un programa per part d'un programador : un llenguatge de programació es considera a tots els efectes com a tal si és complet de Turing .

Història

El primer llenguatge de programació de la història és el llenguatge mecànic utilitzat per Ada Lovelace per programar la màquina de Charles Babbage , que va ser seguit per Plankalkül de Konrad Zuse , desenvolupat per ell a la Suïssa neutral durant la Segona Guerra Mundial i publicat el 1946 . Plankalkül mai es va fer servir realment per a la programació. La programació dels primers ordinadors es va fer en codi curt [1] , a partir del qual va evolucionar l' assemblea , que constitueix una representació simbòlica del llenguatge màquina. L'única forma de control de flux és la instrucció de salt condicional, que condueix a escriure programes que són molt difícils de seguir lògicament a causa dels salts constants d'un punt a un altre del codi.

La majoria dels llenguatges de programació posteriors van intentar abstreure’s d’aquest nivell bàsic, donant la possibilitat de representar estructures de dades i estructures de control més generals i més properes a la forma (humana) de representar els termes dels problemes als quals pretenem. per escriure programes. Entre els primers llenguatges d'alt nivell que van assolir certa popularitat hi va haver Fortran , creat el 1957 per John Backus , del qual posteriorment va derivar BASIC ( 1964 ): a més del salt condicional, que es va fer amb la declaració IF, aquesta nova generació de llengües Introdueix noves estructures de control de flux com bucles WHILE i FOR i instruccions CASE i SWITCH: d’aquesta manera es redueix considerablement l’ús de les instruccions de salt (GOTO), cosa que fa que el codi sigui més clar i elegant i, per tant, un manteniment més fàcil.

Després de l’aparició de Fortran, van néixer una sèrie d’altres llenguatges de programació històrics que van implementar una sèrie d’idees i paradigmes innovadors: els més importants són Lisp ( 1959 ) i ALGOL ( 1960 ). Tots els llenguatges de programació existents avui en dia es poden considerar descendents d’un o més d’aquests primers llenguatges, dels quals manlleven molts conceptes bàsics; l'últim gran progenitor dels llenguatges moderns va ser Simula ( 1967 ), que va ser el primer a introduir el concepte (llavors amb prou feines esbossat) d' un objecte de programari. El 1970 Niklaus Wirth va publicar Pascal , el primer llenguatge estructurat, amb finalitats didàctiques; el 1972 el B (ràpidament oblidat) i després el C van néixer de la BCPL , que en canvi va ser un gran èxit des del principi. El mateix any també apareix Prolog , fins ara el principal exemple de llenguatge lògic, que encara que no s’utilitza normalment per al desenvolupament industrial de programari (per la seva ineficiència) representa una possibilitat teòrica extremadament fascinant.

Amb els primers mini i microordinadors i investigació a Palo Alto, el 1983 va néixer Smalltalk , el primer llenguatge realment i completament orientat a objectes, inspirat en Simula i Lisp: a més d’utilitzar-se encara avui en alguns sectors, Smalltalk és recordat per l’enorme influència que va exercir en la història dels llenguatges de programació, introduint el paradigma orientat a objectes en la seva primera encarnació madura . Alguns exemples dels llenguatges actuals orientats a objectes són Eiffel ( 1986 ), C ++ (que va sortir el mateix any que Eiffel) i posteriorment Java , classe 1995 .

Descripció

Conceptes fonamentals

Icona de la lupa mgx2.svg El mateix tema en detall: teoria dels llenguatges de programació i programació (informàtica) .
Manuals de programació

Tots els llenguatges de programació existents estan definits per un lèxic , una sintaxi i una semàntica i tenen:

  • Instrucció : una ordre o una regla descriptiva: fins i tot el concepte d’instrucció és molt variable entre els diversos idiomes. Independentment del llenguatge en particular, però, cada vegada que s’executa una instrucció, canvia l’estat intern de l’ordinador (ja sigui l’estat real de la màquina o un entorn teòric virtual creat pel llenguatge).

Alguns conceptes també estan presents en la majoria dels idiomes:

  • Variable i constant : una dada o un conjunt de dades, conegudes o desconegudes, ja memoritzades o per memoritzar; a una variable, sempre correspon, en algun lloc, un nombre determinat (fix o variable) de llocs de memòria assignats , és a dir, reservats, per contenir les dades mateixes. Molts idiomes també atribueixen a les variables un tipus , amb propietats diferents (cadenes de text, nombres, llistes, àtoms, etc.) que es poden assignar de manera forta ( escriptura forta ) o dèbil ( escriptura feble ). Hi ha llenguatges de programació, com unlambda , que no fan servir variables. Alguns idiomes admeten l’ús dels anomenats punteres variables.
Exemple de diagrama de flux d'un algorisme
  • Expressió : una combinació de variables i constants , unides per operadors ; les expressions es van introduir inicialment per representar expressions matemàtiques, però la seva funcionalitat s'ha ampliat des de llavors. Una expressió s’avalua per produir un valor i la seva avaluació pot produir "efectes secundaris" al sistema i / o als objectes que hi participen. Els casos especials d’expressió són les anomenades expressions regulars .
  • Estructures de dades , mecanismes que permeten organitzar i gestionar dades complexes.
  • Les estructures de control , que permeten governar el flux d’execució del programa, alterant-lo en funció del resultat o l’avaluació d’una expressió (que es pot reduir al contingut d’una variable o fins i tot ser molt complexa) (bucles iteratius com per a , fer , mentre que i estructures condicionals com if , case-commutador ).
  • Subprograma : un bloc de codi que es pot cridar des de qualsevol altre punt del programa. En aquest context, gairebé tots els idiomes ofereixen funcions de reutilització de codi combinant seqüències d’instruccions dins de funcions que es poden recuperar segons les necessitats dins dels programes o dins de les biblioteques que es poden recuperar a cada programa.
  • Funcionalitat de l' entrada de dades des del teclat i visualització de dades de sortida (serigrafia) a través dels anomenats canals estàndard (entrada estàndard, sortida estàndard).
  • Possibilitat d’inserir comentaris sobre el codi escrit, identificats i delimitats sintàcticament, que expliquin les seves funcions en benefici de la llegibilitat o la intel·ligibilitat.

Codi font

Icona de la lupa mgx2.svg El mateix tema en detall: codi font .
Exemple de codi font

Programar en un llenguatge de programació determinat significa generalment escriure un o més fitxers de text ASCII simples, anomenats codi font, que expressen l'algoritme del programa traduït al llenguatge de programació. Fonts, colors i, en general, l'aspecte gràfic és irrellevant a l'efecte de la programació per se: per aquesta raó, els programadors no utilitzen la paraula processament dels programes, però de text editors (com emacs . I breu) que en el seu lloc ofereixen funcions de processament de text avançats ( regulars expressions , substitucions condicionals i cerques en diversos fitxers, possibilitat de trucar a eines externes, etc.).

Si un determinat editor és capaç de treballar estretament amb altres eines de treball (compilador, enllaçador, intèrpret, etc.: vegeu més avall), a més d’un editor, estem parlant d’ IDE o entorn de desenvolupament integrat. Cal assenyalar que alguns llenguatges de programació recents també permeten una forma mixta de programació, en la qual la redacció del codi font ASCII també s’associa a operacions de programació visual , mitjançant les quals el programador descriu alguns aspectes del programa dibuixant a la pantalla utilitzant el ratolí ; una aplicació típica d'aquesta última forma de programació és el disseny interactiu de la GUI del programa (finestres, menús, etc.). Per executar-lo el processador, el codi font s’ha de traduir al llenguatge de la màquina, que és el llenguatge en què opera la màquina a nivell físic, i això és possible mitjançant dues tècniques possibles: compilació i interpretació .

El codi font, que conté les instruccions que cal executar i (sovint) algunes dades constants i conegudes, es pot executar passant-lo a un intèrpret que executarà les instruccions que conté, cosa que és una pràctica normal per als llenguatges de script ; o pot ser compilat, és a dir, traduït a instruccions de llenguatge automàtic per un programa compilador : el resultat és un fitxer binari 'executable' ( codi executable ) que no necessita altres programes per executar-se, i també és molt més ràpid que un programa interpretat. En el passat, la compilació era la norma per a tots els llenguatges de programació per a usos generals; actualment hi ha nombrosos llenguatges interpretats i d’ús general, com ara Java o els de la plataforma .NET , que apliquen un enfocament híbrid entre les dues solucions, mitjançant un compilador per produir codi en un llenguatge intermedi (anomenat bytecode ) que posteriorment s’interpreta. La diferència de rendiment entre els llenguatges interpretats i els compilats s’ha reduït amb tècniques de compilació just in time , tot i que els llenguatges compilats (si no el muntatge ) continuen utilitzant-se per a aplicacions que requereixen el màxim rendiment possible.

Recopilació

Icona de la lupa mgx2.svg El mateix tema en detall: recopilació i codi d'objectes .
Esquema típic d'un compilador ideal

La compilació és el procés pel qual el programa, escrit en un llenguatge de programació d’alt nivell, es tradueix a un codi executable mitjançant un altre programa anomenat compilador . La compilació ofereix nombrosos avantatges, en primer lloc el fet d’obtenir executables molt ràpids en la fase d’execució adaptant diversos paràmetres d’aquesta fase al maquinari disponible; però té el principal desavantatge en el fet que és necessari compilar un executable diferent per a cada sistema operatiu o maquinari ( plataforma ) en què s’hagi de posar a disposició l’execució o bé manca l’anomenada portabilitat .

Interpretació

Icona de la lupa mgx2.svg El mateix tema en detall: Intèrpret (ordinador) .
Un codi Python

Per intentar eliminar el problema de portabilitat (la dependència o no de l'idioma de la plataforma), vam intentar crear altres idiomes que només es podrien basar en biblioteques (components) compilades ad hoc per a cada plataforma, mentre s'interpreta el seu codi i, per tant, no cal fer cap recopilació en tots els tipus de màquines en què s'executa. [ es necessita una cita ] El gran defecte d'aquests llenguatges és la lentitud de l'execució; no obstant això, tenen el gran avantatge de permetre-us utilitzar el mateix programa sense modificacions en diverses plataformes. En aquest cas, es diu que el programa és portàtil .

La pèrdua de rendiment que es basa en els llenguatges interpretats és el doble treball que s’encarrega a la màquina que es prepara per processar aquest programa. A diferència d’un programa compilat, de fet, cada instrucció és comprovada i interpretada a cada execució per un intèrpret . Els llenguatges interpretats s’utilitzen en la fase de desenvolupament d’un programa per evitar la realització de nombroses compilacions o, en canvi, quan es vol crear programari que realitzi operacions no crítiques que no requereixen optimitzacions quant a velocitat o mida, però que es beneficien més de la portabilitat. Les seqüències d’ordres i tots els llenguatges orientats al web quasi sempre s’interpreten. PHP , Perl , Tcl / Tk i JavaScript i molts altres són exemples concrets d’interacció sense plataforma.

Hi ha diversos intents de fer compiladors multiplataforma creant un nivell intermedi, una mena de semiinterpretació, com en el cas esmentat de Java ; d'altra banda, per als llenguatges interpretats hi ha intents de generar recopilacions automàtiques (o semicompilacions) específiques de la màquina en què s'executen. També hi ha eines per automatitzar al màxim la compilació del mateix programa en diferents plataformes, per exemple GNU autoconf / automake , que permet crear una distribució del codi font que es pot configurar i compilar automàticament en diferents plataformes, generalment almenys tot Unix .

Enllaç

Icona de la lupa mgx2.svg El mateix tema en detall: Enllaç .

Si el programa, com passa sovint, utilitza biblioteques o està compost per diversos mòduls de programari , aquests han d'estar "enllaçats" entre si. L’eina que realitza aquesta operació s’anomena enllaçador i s’ocupa principalment de resoldre les interconnexions entre els diferents mòduls. Hi ha principalment dos tipus diferents d’enllaços: dinàmics i estàtics .

Enllaç estàtic

Tots els mòduls de programa i llibreries que s’utilitzen s’inclouen a l’executable, que és gran, però conté tot el necessari per a la seva execució. Si es fa necessari un canvi a alguna de les biblioteques, per corregir un error o problema de seguretat , tots els programes que els utilitzen amb enllaç estàtic s'han de tornar a enllaçar amb les noves versions de les biblioteques.

Enllaç dinàmic

Les biblioteques utilitzades són carregades pel sistema operatiu quan sigui necessari ( enllaç dinàmic ; les biblioteques externes s’anomenen "DLL", llibreries d’enllaç dinàmic als sistemes Microsoft Windows , mentre que l’ objecte compartit "SO" en sistemes semblants a Unix ). L'executable resultant és més compacte, però depèn de la presència de les biblioteques utilitzades al sistema operatiu per poder executar-se. D'aquesta manera, les biblioteques només es poden actualitzar una vegada al nivell del sistema operatiu, sense necessitat de tornar a enllaçar programes. També es pot fer servir diferents versions de la mateixa biblioteca o utilitzar biblioteques personalitzades amb característiques específiques per a l'amfitrió en particular. En la realització d’un projecte complex de programari, pot passar que algunes parts del programa es creen com a biblioteques, per facilitar-ne el manteniment o poder utilitzar-les en diferents programes que formen part del mateix projecte.

La complicació addicional és que quan instal·leu un programa d’enllaç dinàmic, heu de comprovar les biblioteques que utilitza i, finalment, instal·lar-les també. Els sistemes de gestió de paquets, que s’encarreguen d’instal·lar programes en un sistema operatiu, solen fer un seguiment d’aquestes dependències automàticament. En general, es prefereix l'enllaç dinàmic per crear petits programes i, en general, reduir la memòria RAM ocupada, suposant que les biblioteques necessàries ja estan presents al sistema, o de vegades es distribueixen junt amb el programa.

Comparació entre recopilació i interpretació

Un exemple de codi font a Python . Destacar certs fragments de codi és una eina habitual entre els programadors per navegar pel codi.

Aquests dos mètodes de creació i execució d’un programa tenen avantatges i desavantatges: el major avantatge de la compilació és, sens dubte, l’eficiència molt superior en termes de rendiment, al preu de restar lligat a una plataforma (combinació d’arquitectura de maquinari i sistema operatiu) particular ; en canvi, un llenguatge interpretat no té, en principi, aquesta dependència, però és més lent i requereix més memòria en temps d'execució.

Bytecode i P-code

Una solució intermèdia entre compilació i interpretació es va introduir en les primeres versions de Pascal (inclosa la creada el 1975 pel seu inventor, Niklaus Wirth ) i posteriorment adoptada en els llenguatges Java i Python , amb bytecode , i en Visual Basic i .NET idiomes de Microsoft amb el codi P.

En ambdós casos, el codi font dels programes no es compila en llenguatge màquina, sinó en un codi "híbrid" intermedi destinat a ser interpretat en el moment de l'execució del programa: la raó d'aquest doble pas és tenir la portabilitat de llenguatges però també, gràcies a la precompilació, una fase d’interpretació més senzilla i, per tant, més ràpida. En el cas del bytecode de Java, estem davant d’un llenguatge real d’ assemblatge , que originalment s’havia d’implementar en un model de processador real, però que mai no es va realitzar; alguns microprocessadors moderns, com ara ARM amb Jazelle, implementen nativament moltes instruccions de bytecode i, per tant, són capaços d'executar un bytecode Java com si es tractés d'un muntatge.

Tanmateix, el codi intermedi és més fàcil d’interpretar i de compilar: per aquest motiu, s’han desenvolupat compiladors JIT (Just In Time) per a llenguatges Java i .NET, que en el moment de llançar un programa Java o .NET compilen Codi intermedi sobre la marxa i execució de codi de màquina nativa, eliminant completament la necessitat d’un intèrpret i fent programes escrits en aquests idiomes gairebé tan ràpidament com els seus corresponents programes compilats.

Entorns de desenvolupament i execució

Icona de la lupa mgx2.svg El mateix tema en detall: entorn de desenvolupament i entorn d'execució .
Exemple IDE
La plataforma Java , un exemple típic d' un entorn d'execució

Amb entorn de desenvolupament ens referim al conjunt d’eines per al desenvolupament del codi font del programa, mentre que amb entorn d’execució normalment ens referim al conjunt de biblioteques de programari, també anomenades plataforma de programari, que el programa utilitza per funcionar correctament.

Classes d'idiomes

Icona de la lupa mgx2.svg El mateix tema en detall: paradigma de programació i llista de llenguatges de programació .

En general, hi ha prop de 2500 llenguatges de programació més o menys coneguts i estesos. Aquests, en primer lloc, es classifiquen, segons el nivell d'abstracció, des del llenguatge de màquina fins al llenguatge lògic humà, en llenguatges de baix i alt nivell (als anys noranta es distingien fins i tot els de més alt nivell ). Al seu torn, els idiomes es poden classificar en idiomes compilats i interpretats tal com es va veure més amunt. Els llenguatges normalment es divideixen en tres grans famílies basades en el paradigma de programació de referència: llenguatges imperatius , funcionals i lògics .

Imperatius

Icona de la lupa mgx2.svg El mateix tema en detall: programació imperativa .

En llenguatges imperatius, la instrucció és una ordre explícita, que funciona sobre una o més variables o sobre l'estat intern de la màquina, i les instruccions s'executen en un ordre predeterminat. Escriure un programa en un llenguatge imperatiu significa essencialment tractar amb el que ha de fer la màquina per obtenir el resultat que desitgeu i el programador està ocupat per ajustar els algorismes necessaris per manipular les dades. Les estructures de control prenen la forma d’enunciats de flux (GOTO, FOR, IF / THEN / ELSE, etc.) i el càlcul procedeix per iteració en lloc de per recursió. Els valors de les variables sovint s’assignen a partir de constants o altres variables (assignació) i rarament passant paràmetres (instanciació).

Llenguatges imperatius típics:

Estructurat

Icona de la lupa mgx2.svg El mateix tema en detall: Programació estructurada .

La programació estructurada és una tècnica que té com a finalitat limitar la complexitat de l'estructura de control del programa. El programador està obligat a utilitzar només les estructures de control canònic definides pel teorema de Böhm-Jacopini , és a dir, la seqüència , la selecció i el bucle , evitant les instruccions de salt incondicionals.

Orientat a objectes

Icona de la lupa mgx2.svg El mateix tema en detall: Programació orientada a objectes .

La programació orientada a objectes es basa en una evolució del concepte de tipus de dades abstractes caracteritzat per l’ encapsulació , l’ herència i el polimorfisme . A més dels llenguatges especialitzats que implementen plenament els principis d'aquesta metodologia (com Smalltalk o Java), molts llenguatges moderns incorporen alguns conceptes de programació orientada a objectes.

Funcional

Icona de la lupa mgx2.svg El mateix tema en detall: Programació funcional .

Els llenguatges funcionals es basen en el concepte matemàtic de funció. En un llenguatge funcional pur, l’assignació explícita és fins i tot completament absent i només s’utilitza el pas de paràmetres. Normalment en aquest model, el control del càlcul es gestiona mitjançant recursivitat i concordança de patrons (l’acció de comprovar la presència d’un determinat motiu - patró - dins d’un objecte compost), mentre que l’estructura de dades més comuna és la llista , una seqüència de elements. L’exponent més important d’aquesta categoria és, sens dubte, Lisp (LISt Processing).

Declaratiu (o lògic)

Icona de la lupa mgx2.svg El mateix tema en detall: Programació lògica .

En llenguatges lògics, la instrucció és una clàusula que descriu una relació entre dades: programar en un llenguatge lògic significa descriure el conjunt de relacions entre les dades i el resultat desitjat, i el programador es dedica a establir com han d’evolucionar les dades durant el càlcul. No hi ha cap ordre d’execució preestablert de les diverses clàusules, però correspon a l’intèrpret trobar l’ordre correcte. L’estructura de control principal la representa el tall , que s’anomena vermell si canvia el comportament del programa o verd si només fa més eficient el càlcul, que procedeix per recursió i no per iteració. Les variables reben el seu valor per instanciació o per altres variables ja assignades a la clàusula ( unificació ) i gairebé mai per assignació, que només s’utilitza en el cas del càlcul directe d’expressions numèriques.

Per tal que puguin ser utilitzats en un programa declaratiu, tots els algoritmes normals s'han de reformular en termes recursius i de retrocés ; això fa que la programació amb aquests llenguatges sigui una experiència completament nova i requereixi una manera de pensar radicalment diferent, perquè més que calcular un resultat, requereix demostrar el seu valor exacte. Davant d’aquestes exigències, els llenguatges declaratius permeten obtenir resultats excepcionals a l’hora de manipular grups d’entitats en relació els uns amb els altres.

Idiomes amb escriptura feble o forta

Una altra classificació vol des del punt de vista del tipus de dades expressades, vol la subdivisió en idiomes amb mecanografia forta o mecanografia feble.

Llenguatges esotèrics

Icona de la lupa mgx2.svg El mateix tema en detall: llenguatge de programació esotèric .

Llengües paral·leles

Els supercomputadors moderns i, a hores d’ara, tots els ordinadors de gamma alta i mitjana estan equipats amb diverses CPU . Com a conseqüència òbvia, això requereix la capacitat d’explotar-los; 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.

Linguaggi di scripting

Magnifying glass icon mgx2.svg Lo stesso argomento in dettaglio: Linguaggio di scripting .

I linguaggi di scripting sono nati come linguaggi batch , per automatizzare compiti lunghi e ripetitivi da eseguire, appunto, in modalità batch . Invece di digitare uno ad uno i comandi per realizzare un certo compito, essi sono salvati in sequenza in un file, utilizzabile a sua volta come comando composto. I primi linguaggi di scripting sono stati quelli delle shell Unix ; successivamente, vista l'utilità del concetto, molti altri programmi interattivi hanno cominciato 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, è stato in molti casi l'estensione dei linguaggi con l'associazione di simboli a valori, cioè l'uso di variabili, con i comandi di gestione del flusso, ovvero i costrutti di salto condizionato, le istruzioni di ciclo o di ricorsione, rendendoli così linguaggi completi. Recentemente molti programmi nati per scopi ben diversi dalla programmazione offrono agli utenti la possibilità di programmarli in modo autonomo tramite linguaggi di scripting.

La sintassi di molti linguaggi di scripting, come PHP oi dialetti di ECMAScript , è simile a quella del C, mentre altri, come Perl o Python , ne adottano invece una progettata ex novo. Visto che molto spesso i linguaggi di scripting nascono per l'invocazione di comandi o procedure esterne, altrettanto spesso essi sono interpretati , cioè eseguiti da un altro programma, come il programma madre, del quale il linguaggio di scripting è un'estensione, o un apposito interprete.

Altri linguaggi

Altri tipi di linguaggi sono i linguaggi di programmazione ad altissimo livello utilizzato da professionisti ei linguaggi di programmazione visuali che non richiedono particolari conoscenze avanzate in fatto di programmazione.

Valutazione

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; la segnalazione e gestione di errori comuni a runtime dovuti a dati che assumono valori imprevisti ( overflow , underflow ) o eccedono i limiti definiti (indici illegali per vettori o matrici) controllo dei limiti ; 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 un'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. [2]
  • 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

  1. ^ Robert W. Sebesta, Concepts of Programming languages , 2006, pp.44. ISBN 0-321-33025-0
  2. ^ Sito web della TIOBE Software che mensilmente stila una classifica di popolarità dei linguaggi di programmazione.

Bibliografia

Voci correlate

Altri progetti

Collegamenti esterni

Controllo di autorità Thesaurus BNCF 5676 · LCCN ( EN ) sh85107313 · GND ( DE ) 4047409-4 · BNF ( FR ) cb13318353n (data) · NDL ( EN , JA ) 00569224
Informatica Portale Informatica : accedi alle voci di Wikipedia che trattano di informatica