Limbàgiu de programmatzione

Unu **limbàgiu de programmatzione**, in informàtica, est unu limbàgiu formale chi ischerat un'impare de istrutziones chi podent èssere impreadas pro prodùere datos in essida. Si podet impreare pro su controllu de su cumportamentu de una màchina formale o de unu cumprimentu suo (in manera tìpica, un'elaboradore), duncas in fase de programmatzione de custa pro mèdiu de s'iscritura de su còdighe de orìgine de unu programma a òpera de unu programmadore. Unu limbàgiu de programmatzione est cunsideradu tale de su totu si est Turing-cumpletu.

## Istòria
Su primu limbàgiu de programmatzione de s'istòria est su limbàgiu mecànicu impreadu dae Ada Lovelace pro sa programmatzione de sa màchina de Charles Babbage, sighidu dae su Plankalkül de Konrad Zuse, isvilupadu dae issu in s'Isvìtzera neutrale durante sa segunda gherra mundiale e publicadu in su 1946. Plankalkül no est istadu mai impreadu a beru pro programmare.

Sa programmatzione de is primos elaboradores fiat fata imbetzes in short code, chi est istadu sa base de s'assembly e est una rapresentatzione simbòlica de su limbàgiu màchina. S'ùnica forma de controllu de flussu est s'istrutzione de brincu cunditzionadu, chi faghet is programmas meda difìtziles de sighire in manera lògica pro neghe de is brincos de unu puntu a s'àteru de su còdighe.

Sa parte manna de is limbàgios de programmatzione imbenientes ant chircadu de pònnere un'astratzione a suba a custu livellu basilare, donende sa possibilidade de rapresentare istruturas de datos e istruturas de controllu prus generales e cun faeddos chi s'acostant de prus a is chi is umanos impreant pro rapresentare is problemas chi depent èssere risòlvidos iscriende is programmas. Intre is primos limbàgios a livellu artu a segudare una tzerta popularidade ddoe aiat su Fortran, creadu in su 1957 dae John Backus, de cale est derivadu posca su BASIC (1964): ultres a su brincu cunditzionadu, otentu cun s'imparu IF, custa generatzione noa de limbàgios introduit istruturas noas de controllu de flussu comente a sos tziclos WHILE e FOR e is istrutziones CASE e SWITCH: custu mènguat meda s'impreu de istrutziones de brincu (GOTO), faghende su còdighe prus craru e elegante, e duncas de mantenidura prus fàtzile.

A pustis de sa cumparta de su Fortran sunt nàschidos una sèrie de àteros limbàgios de programmatzione istòricos, chi ant postu in òpera una sèrie de ideas e paradigmas innovativos: is prus importantes sunt su Lisp (1959) e s'ALGOL (1960). Totu is limbàgios de programmatzione chi esistint oe podent èssere cunsiderados discendentes de unu o prus de custos primos limbàgios, chi tenent medas cuntzetos de base a cumone cun issos; s'ùrtimu ingendradore mannu de is limbàgios modernos est istadu su Simula (1967), chi at introduidu pro primu su cuntzetu de *[[Programmatzione orientada a ogetos|ogetu]]*.

In su 1970 Niklaus Wirth pùblicat su Pascal, su primu limbàgiu istruturadu, cun punna didàtica; in su 1972 de su BCPL naschent su B e posca su C, chi at tentu resèssida manna dae s'incumintzu. In su matessi annu cumparet fintzas su Prolog, su printzipale esèmpiu de limbàgiu lògicu, chi mancari no siat de norma impreadu pro s'isvilupu industriale de programmas (pro neghe de s'atòliu suo bàsciu) rapresentat una possibilidade teòrica ammajadora.

Cun is primos mini e micro-elaboradores e sas chircas in Palo Alto, in su 1983 naschet Smalltalk, su primu limbàgiu a ogetos beru, chi s'ispirat a su Simula e a su Lisp. Est impreadu ancora oe in unos cantos setores e est ammentadu pro s'influèntzia manna in s'istòria de is limbàgios de programmatzione, introduende su paradigma orientadu a is ogetos in su primu cumprimentu. Esempros de limbàgios a ogetos de oe sunt Eiffel (1986), C++ (chi essit in su matessi annu de Eiffel) e posca Java, classe 1995.

## Cuntzetos fundamentales
Totu is limbàgios de programatzione chi esistint sunt definidos dae unu lèssicu, una sintassi e una semàntica e tenent:

* Istrutzione: unu cumandu opuru una règula descritiva: fintzas su cuntzetu de istrutzione càmbiat meda dae unu limbàgiu a s'àteru. Cale si siat su limbàgiu, però, onni borta chi un'istrutzione est esecutada, s'istadu internu de su carculadore (chi siat s'istadu beru de sa màchina o un'ambiente virtuale, teòricu, creadu dae su limbàgiu) càmbiat.

* **[[Variàbile (informàtica)|Variàbile]] e costante:** unu datu o un'impare de datos, connotos o disconnotos, giai ammentados o de ammentare; a una variàbile currispondet semper unu tzertu nùmeru de locatziones de memòria chi sunt *allogadas*, est a nàrrere riservadas, pro cuntènnere is datos matessi. Medas limbàgios annotamala atribuint a sas variàbiles unu tipu, cun diferentes propiedades (cadena de testu, nùmeros, listas, *àtomos* etc.) chi podet èssere assinniadu in manera forte (tipizatzione *forte*) o in manera leca (tipizatzione *dèbile*). Ddoe at limbàgios de programmatzione, comente a unlambda, chi imbetzes no impreant variàbiles. Carchi limbàgiu suportat s'impreu de is puntadores a variàbiles.
* Espressione: una cumbinatzione de variàbiles e costantes, unidas dae operadores; is espressiones sunt istadas introduidas in comintzu pro rapresentare is espressiones matemàticas, ma de sighida sa funtzionalidade issoro s'est estèndida. Un'espressione est **valutada** pro prodùere unu balore, e s'avaloramentu suo podet prodùere "efetos collaterales" in su sistema e/o in is ogetos chi ddoe partètzipant.
* Istruturas de datos, mecanismos chi permitint de organizare e gestire dados cumplessos.
* Istruturas de controllu, chi permitint de guvernare su flussu de esecutzione de su programma, alterende·ddu in base a su resurtadu o avaloramentu de un'espressione (chi si podet reduire a su càbidu de una variàbile, o èssere fintzas meda cumplessa) (tziclos iterativos comente a esempru *for*, *do*, *while* e istruturas cunditzionales comente a esempru *if*, *switch-case*).
* Suta-programma: unu blocu de còdighe chi podet èssere tzarradu dae cale si siat àteru puntu de su programma. Agiumai totu is limbàgios oferint funtzionalidades de impreu nou de su còdighe agrupende secuèntzias de istrutziones a s'internu de funtziones de tzarrare segundu netzessidades a s'internu de programmas o a s'internu de librerias chi si podent impreare in onni programma.
* Funtzionalidade de intrada de datos dae tecladu e imprenta de datos in essida (ammustra in vìdeu) pro mèdiu de is *canales istandard*.
* Possibilidade de insertare cummentos in su còdighe iscritu, chi nd'acrarent is funtzionalidades a benefìtziu de sa legibilidade e cumprensione.

### Còdighe de orìgine
 
Programmare in unu limbàgiu de programmatzione sinnìficat de sòlitu iscrìere unu o prus documentos de testu ASCII, mutidu *còdighe de orìgine* chi espressat s'algoritmu de su programma traduidu in su limbàgiu de programmatzione. Is tipos de caràtere, is colores e in generale s'aspetu gràficu no sunt de importu pro sa programmatzione e totu: pro custu is programmadores no impreant programmas de video-iscritura, ma  *editores* *de testu* (comente a *emacs* e *brief*) chi imbetzes oferint funtziones sobradas de tratamentu de tesos (*espressiones regulares*, càmbios cunditzionales e chircas intre documentos mùltiplos, possibilidades de impreare trastos esternos etz).

Si un'editore de testu dislindadu podet traballare a cuntatu cun is àteros trastos de traballu (compiladore, linker, intèrprete etc.: bide prus a in antis) tando si faeddat de **IDE** o ambiente de isvilupu integradu. Bolet naradu chi carchi limbàgiu de programmatzione reghente cunsentint fintzas una forma mista de programmatzione, in ue a s'istèrrida de còdighe de orìgine ASCII s'assòtziant fintzas operatziones de programmatzione visuale, chi permitit a su programmadore de descrìere carchi aspetu de su programma *disinnende* a vìdeu pro mèdiu de su sòrighe; un' aplicatzione tìpica de custa forma de programmatzione est su disinnu interativu de s'interfàtzia gràfica de su programma (bentanas, menùs, etz).Pro èssere esecutadu dae su protzessore su còdighe de orìgine depet èssere traduidu in limbàgiu màchina chi est su limbàgiu de livellu fìsicu de sa màchina, e custu est possìbile pro mèdiu de duas tècnicas: sa cumpiladura e s'interpretatzione.

Su còdighe de orìgine, cun is istrutziones de esecutare e (s'ispissu) carchi datu connotu e costantes, podet èssere esecutadu colende·ddu a un'intèrprete chi nd'at a esecutare is istrutziones, su chi est sa prassi normale pro is limbàgios de scripting; opuru podet èssere compiladu, est a nàrrere traduidu in istrutziones de limbàgiu màchina dae unu programma compiladore: su resurtadu est unu documentu binàriu 'esecutàbile' (còdighe esecutàbile) chi non bisòngiat de àteros programmas pro andare in esecutzione, e est fintzas meda prus lestru de unu programma interpretadu.

In passadu, sa cumpiladura est istada sa norma pro totu is limbàgios de programmatzione de impreu generale; oe in die ddoe at medas limbàgios interpretados e de impreu generale, comente a su limbàgiu Java o is de sa prataforma .NET, chi àplicant un'ìbridu intre is duas solutziones, impreende unu compiladore pro prodùere còdighe in unu limbàgiu *intermèdiu* (naradu bytecode) chi est a pustis interpretadu. Sa diferèntzia de prestatziones tra is limbàgios interpretados e is compilados est istada reduida cun tècnicas de cumpiladura just-in-time, mancari chi si sigat a impreare is limbàgios compilados (e fintzas s'assembly) pro is aplicatziones chi recherent sas màssimas prestatziones possìbiles.

### Cumpiladura
 
Sa cumpiladura est su protzessu de furriadura de unu programma, iscritu in unu limbàgiu de programmatzione a artu livellu, in unu còdighe esecutàbile pro mèdiu de un'àteru programma naradu cumpiladore.

Sa cumpiladura oferit medas avantàgios, a primu su fatu de otènnere esecutàbiles lestros a beru in sa fase de esecutzione adatende vàrios paràmetros de custa fase a s'hardware a disponimentu; ma tenet s'isvantàgiu printzipale in su fatu chi est netzessàriu compilare un'esecutàbile diferente pro onni sistema operativu o hardware (prataforma) in ue su programma depet èssere esecutadu. In faeddos tècnicos, ammancat sa portabilidade.

### Interpretatzione
Is limbàgios de programmatzione esotèricos sunt ideados cun sa punna de èssere prus complicados possìbile. No tenent un'utilidade bera, ma podent èssere impreados comente a proa de abilesa de unu programmadore o isceti pro ispàssiu.
Esempros sunt Brainfuck, LOLCODE, Cow e Ook.

Cun s'interpretatzione, su còdighe est esecutadu in sa forma sua de orìgine dae un'intèrprete chi, in sa forma prus simpre, pigat onni istrutzione de su programma e dda portat a cumprimentu. In custa manera su problema de sa portabilidade est risòlvidu, cun sa cunditzione chi ddoe siat un'intèrprete pro sa prataforma in ue su programma bolet esecutadu.

Cun custa modalidade, su traballu pro sa màchina est prus mannu, ca onni istrutzione de su programma depet èssere averiguada dae s'intèrprete e bortada in un'istrutzione màchina o prus de una. Pro custa resone, is prestatziones de is programmas interpretados sunt de sòlitu prus pòberas chi no cun is programmas cumpilados.

Is limbàgios de scripting e totu is chi sunt orientados a su Web sunt belle semper interpretados.
PHP, Perl, Tcl/Tk e JavaScript e medas àteros sunt esèmpios cuncretos de interatzione non vinculada a sa prataforma.

Ddoe at tentativos de furriare  torrare sos compiladores multipiattaforma creende unu livellu intermèdiu, una bènnida de sèmenes-interpretatzione, comente a s'in casu subra mentovadu de Java; de àteru càntigu pro sos limbàgios interpretados b'ant tentativos pro generare de sas cumpiladuras (o sèmenes-cumpiladuras) automàticas dillindadas pro sa màchina subra cale sunt esecutados.

### Ligamentu (linking)
Si su programma, comente a s'ispissu acontesset, impreat librerias o est assentadu dae prus mòdulos de programma, custos depent èssere 'ligados' s'unu cun s'àteru. A su trastu chi faghet custa operatzione di narant ligadore (linker), e su traballu suo est prus che totu de risòlvere sas interconnessiones tra sos diferentes mòdulos.

Esistent duos tipos diferentes de ligamentu: **dinàmicu** e **istàticu**.

#### Ligamentu istàticu
Totu is mòdulos de su programma e is librerias impreadas sunt inclùdidas in s'esecutàbile, chi resurtat mannu ma cuntenet totu su netzessàriu pro s'esecutzione sua. Si est netzessària una muda a una de is librerias, pro curregire un'errore o unu problema de seguridade, totu is programmas chi ddas impreant cun ligamentu istàticu depent èssere torrados a ligare cun is versiones noas de is librerias.

#### Ligamentu dinàmicu
Is librerias impreadas sunt carrigadas dae su sistema operativu cando netzessàriu (is librerias esternas sunt mutidas "DLL" (*Dynamic-link libraries*) in is sistemas Microsoft Windows, mentras "SO" (*Shared Object*) in is sistemas Unix-like). S'esecutàbile est prus cumpatu, ma dipendet de sa presèntzia de sas librerias impreadas in su sistema operativu pro pòdere èssere esecutadu.

In custa manera, is librerias podent èssere annoadas una borta isceti a livellu de sistema operativu, sena netzessidade de torrare a ligare is programmas. Bessit fintzas possìbile impreare diversas versiones de sa matessi libreria o impreare librerias personalizadas.

In su cumprimentu de unu progetu de programma cumplessu, podet acontèssere chi carchi ala de su programma bèngiat iscrita che libreria, pro comodidade de mantenidura o pro ddas pòdere impreare in àteros programmas.

Sa cumplicazione agiunta est chi cando s'installat unu programma cun collegamentu dinàmicu est netzessàriu averguare sa presèntzia de is librerias chi impreat, e s'in casu mai installare custas puru. Is sistemas de manìgiu de pachetes, chi s'òcupant de installare is programmas in unu sistema operativu, de sòlitu tenent rasta de custas dipendèntzias.

De sòlitu si preferit su ligamentu dinàmicu, in manera de creare programmas minores e in generale reduire sa memòria RAM ocupada, assumende chi is librerias netzessàrias siant giai presentes in su sistema, o a bortas distribuende·ddas in paris cun su programma.

### Cunfrontu tra cumpiladura e interpretatzione

Custos duos mètodos de creatzione e esecutzione de unu programma presentant ambos avantàgios e isvantàgios: s'avantàgiu majore de sa cumpiladura est sena duda s'atòliu superiore meda in tèrmines de prestatziones, a su prètziu de su restare vinculados a una **prataforma** (cumbinatzione de architetura hardware e sistema operativu); unu limbàgiu interpretadu imbetzes non tenet, in lìnia de màssima, custa dipendèntzia ma est prus lentu e recheret prus memòria in fase de esecutzione.

### Bytecode e CIL
Una solutzione intre cumpiladura e interpretatzione est istada introduida in sas primas versiones de Pascal (inclùdida cussa portada a cumprimentu in su 1975 de s'imbentore suo, Niklaus Wirth) e posca adotada in is limbàgios Java e Python, cun su bytecode, e in is limbàgios Visual Basic e .NET de Microsoft cun su Common Intermediate Language.

In ambos casos su còdighe de orìgine de is programmas non est cumpiladu in limbàgiu màchina, ma in unu còdighe intermèdiu "ìbridu" destinadu a èssere interpretadu in su momentu de s'esecutzione: sa resone de custu dòpiu coladòrgiu est de tènnere sa portabilidade de unu limbàgiu interpretadu e, gràtzias a sa pre-cumpiladura, fintzas una fase de interpretatzione prus simpre e tando prus lestra. Su bytecode de Java est unu limbàgiu assembly beru, chi est insandus postu in òpera in parte dae unos cantos microprozessores, comente a is ARM cun tecnologia Jazelle. 

Su còdighe intermèdiu est prus fàtzile siat de interpretare siat de cumpilare: pro custu motivu siat pro Java siat pro is limbàgios .NET sunt istados isvilupados cumpiladores JIT (Just In Time), chi in su momentu de su làntziu de su programma cumpilant su còdighe intermèdiu e mandant in esecutzione unu còdighe màchina nativu, eliminende sa netzessidade de s'intèrprete e fadende is programmas iscritos in custos limbàgios lestros agiumai che is cumpilados.

## Classes de limbàgios
In generale esistent belle 2500 limbàgios de programmatzione prus o mancu connotos e difùndidos.
Custos a primu sunt classificados, a segunda de su livellu de astratzione partende dae su limbàgiu màchina finas a su limbàgiu lògicu umanu, in limbàgios a bassu livellu e a artu livellu (in is annos noranta si distinghiant fintzas cussos a livellu a beru artu). In prus, is limbàgios podent èssere classificados in limbàgios *compilados* e *interpretados* comente bidu subra. De sòlitu, is limbàgios sunt a pustis distintos in tres famìlias mannas basadas in su paradigma de programmatzione de riferimentu: is limbàgios **imperativos**,  **funtzionales** e **lògicos**.

### Imperativos
In is limbàgios imperativos s'istrutzione est unu cumandu craru, chi òperat a suba a una o prus variàbiles o a suba a s'istadu internu de sa màchina, e is istrutziones sunt esecutadas in un'òrdine pre-defnidu. Iscrìere unu programma in unu limbàgiu imperativu bolet nàrrere in manera essentziale s'ocupare de ite sa màchina depet fàghere pro otènnere su resurtadu e su programmadore depet pònnere in òpera is algoritmos netzessàrios a manigiare is datos.

Is istruturas de controllu sunt *istrutziones de flussu* (GOTU, FOR, IF/THEN/ELSE etc.) e su càrculu protzedit prus pro iteratzione chi no pro ricorsione. Is balores de is variàbiles sunt a s'ispissu assinniados partende dae costantes o dae àteras variàbiles e carchi borta pro coladòrgiu de paràmetros.

Unos cantos esempros de limbàgios imperativos sunt Frotrain, Cobol, Basic e C.

#### Istruturados
Sa programmatzione istruturada est una tècnica ideada pro limitare sa cumplessidade de s'istrutura de su controllu de su programma. Su programmadore est depet impreare isceti is istruturas de controllu canònicas definidas dae su Teorema de Böhm-Jacopini: sa *secuèntzia*, s'issèberu e su *tziclu*, evitende is istrutziones de brincu sena cunditziones. Esempros sunt Ada, Fortran 90/95 e Pascal.

#### Orientados a is ogetos
Sa programatzione a ogetos est basada a suba a un'evolutzione de su cuntzetu de tipu de datu astratu caraterizada dae incapsulamentu, eredade, polimorfismu. Medas limbàgios modernos ponent in òpera cuntzetos de sa programmatziones a ogetos. Esempros de limbàgios chi ddos ponent in òpera a manera cumprida sunt Java e Smalltalk.

### Funtzionales
Is limbàgios funtzionales sunt basados a suba a su cuntzetu matemàticu de funtzione. In unu limbàgiu funtzionale fintzas s'assinniamentu est fatu isceti comente coladòrgiu de paràmetros. In custu mollu su controllu de su càrculu est de sòlitu manigiadu cun sa ricorsione, mentras s'istrutura de datos prus comuna est sa lista, una secuèntzia de elementos. Esempros de limbàgios funtzionales sunt Lisp, OCaml e F#.

### Decrarativos (o lògicos)
In is limbàgios lògicos s'istrutzione est una *clàusola* chi descriet una relatzione intre is datos: programmare in unu limbàgiu lògicu bolet nàrrere descrìere s'impare de is relatziones chi esistint intre is datos e su resurtadu bòlidu, e su programmadore depet istabilire in cale manera is datos depent mudare durante su càrculu. Non ddoe at un'òrdine predefinidu de esecutzione de is clàusolas: agatare s'òrdine giustu est tarea de s'intèrprete.

S'istrutura de controllu printzipale est su **cut**, chi ddi narant *ruju* si mudat su cumportamentu de su programma o *birde* si donat isceti prus atòliu a su càrculu, chi protzedit pro ricorsione e non pro iteratzione. Is variàbiles retzint su balore issoro pro coladòrgiu de paràmetros o dae àteras variàbiles giai assinniadas in sa clàusola (*unificatzione*) e belle mai pro assinniamentu, chi est impreadu isceti pro su càrculu diretu de espressiones numèricas.

Pro pòdere èssere impreados in unu programma decrarativu, un'algoritmu depet èssere formuladu in manera recursiva o de *backtracking*; custu faghet de sa programmatzione cun custos limbàgios un'esperièntzia de su totu noa e recheret una manera de pensare diferente, pro ite ca prus chi contare unu resurtadu si recheret de nde dimustrare su balore cabale. In antis a custas rechertas, is limbàgios decrarativos permitint de segudare resurtados bonos meda cando si depent manigiare grupos de entes in relata.

Esempros de limbàgios lògicos sunt Curry, Mercury e Prolog.

### Limbàgios tipizados in manera dèbile o forte
Is limbàgios de programmatzione podent èssere partzidos fintzas segundu sa manera chi su tipu de dadu est asinniadu a una variàbile.

### Limbàgios esotèricos
Is limbàgios de programmatzione esotèricos sunt ideados pro èssere prus complicados possìbile. No tenent un'utilidade bera, ma sunt impreados comente a proa de abilesa de su programmadore o pro ispàssiu. Esempros sunt Brainfuck, LOLCAT, Whitespace, COW e Ook.

### Limbàgios parallelos
Is super-elaboradores modernos e, oe in die, agiumai totu is carculadores tenent prus de unu microprotzessore. Custu recheret sa capatzidade de ddos isfrutare. Sa parte manna de is limbàgios tenent istruturas o librerias chi permitint de esecutare partes diferentes de su programma in protzessores diferentes, ma unos cantos limbàgios sunt istudiados a manera de agatare issos e totu a manera automàtica is partes de còdighe de esecutare in su pròpiu tempus. Esempros sunt Occam, Linda e Axum.

### Limbàgios de scripting
Is limbàgios de scripting sunt nàschidos comente a *limbàgios batch*, pro automatizare tareas longas e ripetitivas de esecutare, apuntu, in modalidade batch.
Imbetzes de cumpònnere unu a unu sos cumandos pro cumprire unu tzertu traballu, issos sunt sarvados in secuèntzia in unu documentu, chi a pustis si podet impreare comente a cumandu. Is primos limbàgios de scripting sunt istados is de sas shell Unix; a pustis, pro s'utilidade issoro, medas àteros programmas interativos ant cumintzadu a permìtere s'ammentu e s'esecutzione de archìvios cun listas de cumandos o fintzas s'ammentu de registratziones de cumandos visuales (is **macro** de is programmas de videoiscritura, pro esempru). Su passu imbeniente, est istadu in medas casos s'estensione de is limbàgios cun s'assòtziu de sìmbulos a balores, est a nàrrere s'impreu de variàbiles, e is cumandos de gestione de su flussu: brincu cunditzionadu, istrutziones de tziclu torrende·ddos aici limbàgios cumpletos.

Giai ichi medas limbàgios de scripting naschent pro s'invocatzione de cumandos o protzeduras esternas, issos sunt de sòlitu interpretados, duncas esecutados dae un'àteru programma, comente a unu programma chi su script permitit de estèndere, o un'interprete.

Esempros de limbàgios de scripting sunt PHP, Javascript e Python.

## Riferimentos


## Bibliografia

* Maurizio Gabbrielli e Simone Martini, *Linguaggi di programmazione: principi e paradigmi*, 2a ed, Milano, McGraw-Hill, 2011. ISBN 978-88-386-6573-8.
* Ravi Sethi, *Linguaggi di programmazione*, Bologna, Zanichelli, 1994. ISBN 88-08-09740-4.