Programlingvo

**Programlingvo** estas formala artefarita lingvo, kreita por transdoni komandojn al aparatoj, plejofte al komputiloj. Programlingvoj estas uzataj por krei programojn kiuj kontrolas la konduton de ia aparato kaj por esprimi algoritmojn.

Nuntempe ekzistas miloj da programlingvoj, kaj ĉiujare aperas kelkaj lingvoj. Iuj el ili postulas, ke la komputado estu indikita en la *imperativa* formo (t.e., kiel sinsekvo de ordonoj por plenumi), dum aliaj uzas kromajn formojn de programoj, ekzemple la deklaran formon (kiam oni indikas la deziratan rezulton kaj ne precizigas la vojon por atingi ĝin).

La priskribo de ĉiu programlingvo kutime konsistas el du partoj: sintakso, aŭ kiel oni skribas, kaj semantiko, aŭ kion signifas ĉiu vorto en la lingvo. Por kelkaj lingvoj ekzistas normiga dokumentado, kiu servas kiel ĉefa referenco por multaj efektivigoj (ekzemple C, Java), dum ĉe aliaj lingvoj ekzistas unu klasika referenca efektivigo, kiun oni traktas kiel normigan (ekz. ĉe Perl). Kelkaj lingvoj havas ambaŭ.

## Klasifiko de programlingvoj 
Ekzistas multaj sistemoj por klasifiki programlingvojn.

### Kelkaj ekstersistemaj klasifikoj 
eta|Fontkodo de unu programo en Scratch: la lingvo, kiu estas uzata por instrui programadon al lernejanoj

Oni distingas kelkajn klasojn de lingvoj, kiuj estas utilaj por praktika uzado, sed kiuj ne konsistigas iun klaran klasifik-atributon. Jen kelkaj ekzemploj de diversaj programlingvoj:

* Maŝina kodo kaj asemblaj lingvoj, sed ankaŭ C ebligas programadon ĉe la aparatara nivelo.
* Altnivelaj programlingvoj ebligas komfortan, rapidan programadon.
* Skriptoj estas uzataj por aŭtomatigo de kutimaj agoj, por sinsekva prilaboro de datenoj kaj regi komputilojn.
* Vidaj lingvoj kun ekranredaktiloj estas utilaj por rapida kreado de grafika interfaco.
* Esoteraj programlingvoj estas eksperimentoj por foje tre interesaj konceptoj.
* Grafikaj programlingvoj ofertas simplan lernadon de programado: anstataŭ skribi la fontkodon oni kreas programon per musklakoj sur ekrano.
* Domajnaj lingvoj estas uzataj ne por priskribi algoritmojn, sed por iuj specifaj taskoj (kontraste al la ĝeneralcelaj lingvoj):
** Datumbankaj lingvoj (SQL) estas speciale kreitaj por formuli datum-mendojn.
** Aparataraj lingvoj (VHDL) priskribas la strukturon kaj funkciojn de aparatoj.
** CNC-programlingvojn oni uzas por programi kontrolilojn.

### Programlingvoj laŭ generacioj 
Historie, kiam oni komparas programlingvon kontraŭ naturaj lingvoj, oni parolas pri kelkaj generacioj. Komence tiuj generacioj montris la kreskantan potencon de lingvoj prezenti pli kaj pli abstraktajn objektojn, sed post enkonduko de novaj generacioj oni foje iom re-difinis la antaŭajn, pro kio la tuta klasifiko iom transformiĝis.

#### Unua-generaciaj lingvoj (1GL) 
Unua-generaciaj lingvoj **(1GL)** estas maŝinlingvoj, la lingvoj de la procesoro. Komence neniu ilo estis uzata por kompili aŭ asembli la lingvojn de unua generacio. La lingvoj de tiu generacio estis enigataj rekte al la komputilo per ŝaltiloj sur ties panelo.

Tiuj lingvoj estas pure binaraj, t.e. konsistantaj el nuloj kaj unuj. Tiu trajto igas ilin facile kompreneblaj por maŝinoj, sed tre malfacilaj por homoj.

La ĉefa avantaĝo de tiuj lingvoj estis, ke la programoj rulis tre rapide kaj efike, ĉar ili estis plenumataj rekte de centra procesilo. Sed se iu eraro aperis, estis malfacile trovi kaj korekti ĝin.

Hodiaŭ oni apenaŭ uzas tiujn lingvojn, nur se oni devas ripari iun konatan problemon. Oni ne plu uzas binaran sistemon, sed preferas la deksesuman sistemon, kiuj estas multe pli kompakta.

#### Dua-generaciaj lingvoj (2GL) 
Dua-generaciaj lingvoj **(2GL)** estas asemblaj lingvoj. La ordonoj de la procesoro havas simbolajn nomojn.

La faktermino "dua-generaciaj" lingvoj, kune kun la lingvoj de "unua generacio" aperis kiam oni volis distingigi la *lingvojn de alta nivelo* (kiel COBOL kaj Paskalo) disde la pli fruaj lingvoj surbaze de maŝinkodoj.

Kontraste al la lingvoj de la unua generacio, tiuj lingvoj havas jenajn ecojn:

* La kodo en tiuj lingvoj estas legebla por homoj, sed ne por komputiloj. Necesas konverti programojn en tiuj lingvoj en maŝinan kodon por igi ilin ruleblaj. Tiu procezo nomiĝas *asembl(ad)o*.
* Tiuj lingvoj estas unikaj por ĉiu centra procesilo kaj redaktilo.

Oni uzas tiujn lingvojn por programi kernojn de operaciumoj kaj pelilojn (kvankam ofte ankaŭ eblas programi ilin per C, kiu estas pli kaj pli preferata), sed krome en programoj, kiuj bezonas tre altan rendimenton, kiel grafikaj ludoj (ofte tridimensiaj), video-redaktado ktp.

#### Tria-generaciaj lingvoj (3GL) 
Tria-generaciaj lingvoj **(3GL)** estas ankaŭ nomataj altnivelaj lingvoj, kiuj estas la plejparto de hodiaŭaj lingvoj. Kontraste al 2GL tiuj lingvoj estas multe malpli maŝin-dependaj kaj pli legeblaj por programistoj. Tiuj lingvoj subtenas multajn diversajn datumtipojn tiel, ke la lingvo "favoras" la homon, sed ne komputilon, dum programado. Unu grava avantanĝo super la lingvoj de la dua generacio estas aŭtomata pritrakto de negravaj detaloj (kiel aŭtomata kontrolo de memoro). Precipe gravas la subteno de abstraktaj kaj agregatigaj datumtipoj, kiuj ebligas multajn program-vojojn. Per tiu trajto la lingvoj de tiu generacio staras multe pli proksime al homaj (naturaj) lingvoj (kaj povas esti komprenitaj ĝis ioma grado ofte per homoj sen antaŭlerno de tiu lingvo).

La unuaj tiaj lingvoj estis proceduraj lingvoj kiel Fortran, COBOL kaj Algol, enkondukitaj en 1950aj jaroj.

Modernaj tiaspecaj lingvoj estas C, Paskalo, BASIC, tamen se oni komparas tiujn lingvojn kontraŭ iliajn hodiaŭajn dialektojn (kiel Java, Python, C#, oni povas ankaŭ vidi, ke ankaŭ tiuj ne estas vere tre "altnivelaj" hodiaŭ. Tamen, tiu uzo estas historia, ĉar unue la lingvoj de alta nivelo ebligis pli facilan kreadon, korektadon, redaktadon kaj subtenon de programaro.

#### Kvara generacio de la lingvoj (4GL) 
Kvara generacio de la lingvoj **(4GL)** estas grupo de lingvoj, kies celo estis perfektigi la lingvojn de la tria generacio (3GL). Kun ĉiu plia generacio oni strebas atingi pli altan nivelon de abstrakteco disde la interna konstruo de komputiloj, kiu igis la lingvojn pli flekseblaj kaj libere programeblaj, pli potencaj kaj multfacetaj. Dum la ekzakta difino por lingvoj de tiu generacio ŝanĝiĝis dum tempo, tiaspecaj lingvoj estas ĝenerale tiuj, kiuj eblas funkcii al granda aro de datumoj per unu ordono, kompare al la traktado al bitoj kaj bitokoj okaze de la pli malaltaj lingvoj. Krome, tiuj lingvoj havas larĝan kaj maturan sistemon de datumtipoj, ofte subtenon por datumbankoj, kreado de raportoj, optimumizado, kreado de grafika interfaco kaj TTT-programado.

Dum multaj lingvoj de tiu generacio taŭgas por plenumo de ajnaj algoritmaj taskoj (t.n. “komunuzaj lingvoj”), ekzistas ankaŭ la lingvoj, kies rolo estas limigita al plenumo de certa tasko: mendo al datumbanko (SQL) aŭ kreo de raporto (ABAP).

#### Kvina generacio de la lingvoj (5GL) 
Kvina generacio de la lingvoj **(5GL)** estas lingvoj, kiuj mem devenas la algoritmon por solvi la donitan taskon surbaze de difinitaj postuloj. Do, programisto ne plu devas efektivigi algoritmon, sed nur klare difini la taskon. Multaj deklaremaj kaj funkciaj lingvoj apartenas al tiu generacio.

Tiu termino aperis kaj estis populara en la 90-aj jaroj, kiam oni volis perfektigi la ekzistantajn lingvojn tiel, ke la komputilo, sed ne programisto, difinas la efektivigon. Tiam la uzanto tute ne devas zorgi pri tio kiel programi ion, sed simple pri ĝusta difino de la tasko kaj ties postuloj/limoj. Ekzemplo de la lingvoj de tiu generacio estas Prolog.

Dum longa tempo oni konsideris tiujn lingvojn la estonteco de la programado, kaj estis profetaĵoj, ke tiaj lingvoj plene anstataŭos ordinarajn lingvojn en programado (kun escepto de malalt-nivelaj lingvoj). En Japanio de 1982 ĝis 1993 oni multe investis en priesploro de tiuj lingvoj, kun la espero krei novajn, multe pli potencajn lingvojn kaj ilojn. Tamen, dum oni produktis pli kaj pli longajn programojn, la misoj de tiu aliro fariĝis pli evidentaj. Evidentiĝis, ke se oni havas postulojn de iu tasko, devenigi la efikan algoritmon por solvi tiun taskon estas tre malfacila tasko. Tiu grava paŝo ankoraŭ ne estas farebla per komputiloj kaj bezonas enmiksiĝon de homa intelekto.

### Programlingvoj laŭ primara programparadigmo 
En Informadiko ekzistas diversaj paradigmoj. Laŭ tiuj paradigmoj oni povas klasifiki la lingvojn:
* **Objektemaj lingvoj**, kiel C++, Ĝavo kaj Smalltalk, kie (preskaŭ) ĉiu variablo estas objekto. Objekto estas ekzemplero de klaso. Kaj objektoj havas metodojn, kiujn oni povas voki por peti, ke la objekto faru ion.
* **Ordonemaj lingvoj**, kiel C, Ĝavo, Paskalo, Ada. Programoj en tiuj lingvoj konsistas el sekvenco de ordonoj kaj la komputilo simple plenumas tiujn ordonojn en la donita (aŭ modifita per alia ordono) sinsekvo.
* **Deklaremaj lingvoj** sekvas tute malan modelon, en kiu programisto priskribas la kondiĉojn, kiujn la rezulto de la programo devas plenumi. Kiel tiu rezulto efektiviĝas estas decidita dum kompilado pere de la kompililo. La plej ilustra ekzemplo de tiaj lingvoj estas SQL, la lingvo de datum-mendoj. Laŭ la tipo de kondiĉoj ĉiuj deklaremaj lingvoj estas subklasigitaj al logikaj lingvoj, kiuj baziĝas sur matematika logiko, kaj funkciaj lingvoj, en kies fundamento estas matematikaj funkcioj.
* **Funkciaj lingvoj**, kiel Haskell kaj Lisp. En funkcia programo la tuta programo estas unuopa esprimo (aŭ formulo), kiun oni devas elkalkuli. Kutime en tiuj lingvoj la programoj similas al matematikaj taskoj, kaj la kompililo plenumas gravan taskon por konverti tiujn sufiĉe formale difinitajn taskojn en porkomputilajn ordonojn.

Multaj programparadigmoj, kiuj estas sendependaj intere, povas libere kombiniĝi, ekzemple la ordonema aŭ la funkcia kaj objektema. Oni nomas lingvojn, kiuj entenas kaj aktive uzas plurajn paradigmojn, t.n. lingvoj plurparadigmaj. Do ekzemple, ekde la 1970-a jardeko estas objektema versio de Lisp, kaj estas objektemaj versioj de C. Multaj modernaj lingvoj, kiel Java, C#, Python, Perl kaj aliaj estas nuntempe plurparadigmaj kaj ebligas flekseman programadon.

## Populareco de programlingvoj 
eta|Lernolibroj pri programado
La plej popularaj programlingvoj laŭ TIOBE indekso de programista komunumo:

# Java
# C
# C++
# C#
# PHP
# Objective-C
# (Visual) Basic
# Python
# Perl
# JavaScript
# Ruby
# Delphi/Object Pascal
# Lua
# Lisp
# Transact-SQL
# Pascal
# PL/SQL
# Ada
# RPG (OS/400)
# D

## Kronologio de programlingvoj 
La suba listo enhavas gravajn programlingvoj, grupitajn laŭ jardekoj. Se la lingvo aperas en krampoj, tio signifas, ke tiu estis domana lingvo. Steleto (*) signifas, ke la lingvo estis unika kaj ne havas rektajn pralingvojn.

### Antaŭ-1950 
### 1950-aj 
### 1960-aj 
### 1970-aj 
### 1980-aj 
### 1990-aj 
### 2000-aj 
## Post 2010 
## Vidu ankaŭ
* Esotera programlingvo
* Listo de programlingvoj
* Neanglabazitaj programlingvoj

## Referencoj 
## Eksteraj ligiloj 
* Kion Programlingvoj Solvas (What Languages Fix) - eseo pri programlingvoj de Paul Graham.

Kategorio:Lingvotipoj