Wikang pamprograma

[alt=Isang larawan na nagpapakita sa programang 'Hello World' na nakasulat sa wikang pamprogramang C.|thumb|402x402px|Isang halimbawa ng programang 'Hello World' na isinulat sa wikang [C (wikang pamprograma)|C. na may mga komento sa wikang Ingles. Kapag ito ay kinompayl at pinatakbo, lalabas sa iskrin ang "*Hello, world!*"]]
Ang **wikang pamprograma** (Ingles: *programming language*) ay isang pormal na wikang naglalaman ng mga tagubilin (*instructions*) na kayang magpalabas ng samot-saring *output*. Ginagamit ang mga wikang pamprograma sa pagpoprograma sa kompyuter para magsagawa ng mga algoritmo.

Naglalaman ang karamihan sa mga wikang pamprograma ng mga tagubilin para sa mga kompyuter. May mga makinang napoprograma na gumagamit ng mga tiyak na tagubilin imbes na wikang pamprogramang panlahatan (*general-purpose programming languages*). Mas nauna sa mga kompyuter ang mga sinaunang halimbawa nito, kung saan ang maaaring pinakauna sa mga ito ay ang awtomatikong tagatugtog ng plawta na inilarawan sa ika-9 ng siglo ng magkapatid na Musa sa Baghdad, sa kasagsagan ng Ginintuang Panahon ng Islam. Simula noong unang bahagi ng dantaong 1800s, ginamit ang mga programa para manduhan ang ugali ng mga makinang tulad ng makina ni Jacquard, kahong tumutugtog (*music box*), at mga tumutugtog na piyano. Di gumagawa ang mga programang ginamit sa mga naturang makina ng iba pang ugali, bilang tugon sa mga iba't ibang pinapasok (*input*) at nilalabas (*output*), bukod sa nakasaad na tagubilin.

Libo-libo na ang nagawang mga wikang pamprograma, at patuloy itong nadadagdagan kada taon. Isinusulat ang maraming wika sa anyong pautos (mga tagubiling kailangang gawin), habang ang ilan naman ay isinulat sa anyong paturol (binigay ang kailangang maging resulta, hindi kung paano ito dapat gawin),

Madalas hinahati sa dalawa ang paglalarawan para sa mga wikang pamprograma: ang sintaksis (anyo) at ang semantika (kahulugan) nito. May mga dokumentong nagpapaliwanag sa ilang mga wika (madalas tinatawag sa Ingles bilang *specification document*), tulad ng C na pinapaliwanag ng pamantayang ISO, habang ginagamit naman ng ilan, tulad ng Perl, ang ginagamit madalas ng karamihan at tinatanggap bilang sanggunian nito. May mga ilan ding gumagamit ng parehong paraan - may isang dokumentong naglalarawan sa wika, at galing naman sa napagkasunduan ng nakakarami ang mga karugtong (*extensions*) nito.

## Kahulugan 
Isang notasyon ang mga wikang pamprograma para makapagsulat ng mga programa sa kompyuter. May mga ilang naghihigpit sa terminong "wikang pamprograma" sa mga wikang kayang gawin ang lahat ng mga posibleng algoritmo. Importante ang katangian ng mga ito para masabi kung ano wikang pamprograma sa mga wikang hindi, tulad ng:

'*Gamit (*Function*) at Layon (*Target*)*'
:Isang wikang ginagamit para makapagsulat ng mga programa sa kompyuter ang *wikang pamprograma*. Nangangahulugan nito na dapat nagsasagawa ang kompyuter ng mga pagkokompyut o algoritmo at maaaring nakakapagkontrol ng mga panlabas na *device* tulad ng mga *printer*, *disk drive*, *robot*, at iba pa. Halimbawa, ginagawa kalimitan ng ibang programa ang mga programang ginawa sa wikang PostScript para makontrol ang isang printer o device na pan-*display*. Sa pangkalahatan, maaaring ilarawan ng mga wikang pamprograma ang kakalkulahin sa isang, posibleng basal (*abstract*) na, makina. Tinatanggap kadalasan na dapat maglaman ang isang kumpletong pagdedetalye sa isang wikang pamprograma ng isang paglalarawan sa isang (maaaring napakaperpekto, o *idealized*) makina o tagaprosesong (*processor*) para sa wikang iyon. Sa praktikal na pananaw, kadalasang sinasama sa usapan patungkol sa mga wikang pamprograma ang kompyuter, kaya naman madalas pinag-aaralan at binibigyang-kahulugan sa makinang ito ang mga wikang pamprograma. Iba ang mga natural na wika sa mga wikang pamprograma: ginagamit lamang kasi ang mga natural na wika para sa komunikasyon nang tao sa tao, habang ginagamit naman ang mga wikang pamprograma para sa komunikasyon sa pagitan ng tao sa makina sa pamamagitan ng mga tagubilin.

**Kabasalan** '*(*Abstraction*)*'
:Madalas naglalaman ang mga wikang pamprograma ng mga kabasalan (*abstraction*) para bigyang kahulugan at manipulahin ang mga istraktura ng datos (*data structures*) o di kaya'y kontrolin ang daloy ng gagawin (*flow of execution*). Ipinahahayag ng prinsipyo ng kabasalan (*abstraction principle*) ang praktikal na pangangailangan ng suporta ng mga wikang pamprograma sa sapat na antas ng kabasalan. Binuo ang prinsipyong ito bilang isang rekomendasyon sa mga nagpoprograma para gamitin nang maayos ang mga kabasalan.

'*Lakas na Magpahayag (*Expressive power*)*'
:Inuuri ng teorya ng pagkokompyut (*computing theory*) ang mga wika base sa mga kalkulasyong kaya nilang gawin. Masasabing kumpletong Turing (*Turing complete*) ang isang wika kung kayang gawin nito ang lahat ng posibleng algoritmo. Madalas ituring ang ilang wika, tulad ng ANSI/ISO na SQL-92 at Charity, bilang isang wikang pamprograma kahit na hindi sila kumpletong Turing.

Hindi madalas inuuri ang mga wikang pammarka (*markup languages*), tulad ng XML, HTML, at troff, bilang mga wikang pamprograma. Gayunpaman, maaaring magkaroon ang mga wikang pamprograma ng kaparehong sintaksis (anyo) tulad ng mga wikang pammarka basta may semantikang pangkalkula na binigay. Halimbawa nito ang wikang XSLT, isang kumpletong Turing na wika na may sintaksis kapareho sa XML. Isa pang halimbawa ang LaTeX, isang wikang madalas gamiting panggawa ng istraktura ng mga dokumento at may *subset* na kumpletong Turing.

Madalas ring ginagamit ang terminong **wikang pangkompyuter** bilang kasingkahulugan ng wikang pamprograma, subalit iba-iba ang paraan ng paggamit ng mga nasa larangan sa dalawang termino, pati na sa kung anong sakop ng bawat isa. Inilalarawan ng isang paggamit ang mga wikang pamprograma bilang isa lamang pangkat ng wikang pangkompyuter. Madalas ring inlalarawan bilang mga wikang pangkompyuter ang mga wikang ginagamit sa larangan ng pagkokompyut na may ibang layunin kaysa sa gumawa ng isang programa sa kompyuter. Halimbawa, itinuturing mga wikang pangkompyuter ang mga wikang pammarka para maidiin na hindi sila ginagamit sa larangan ng pagpoprograma.

Samantala, may isa ring paggamit na naglalarawan sa mga wikang pangkompyuter bilang isang pangkat lamang ng mga wikang pamprograma, kung isasama ang teoretikal na pagbubuo para maiprograma ang mga basal (*abstract*) na makina, sa kadahilanang tumatakbo lamang ang mga wikang pangkompyuter sa mga kompyuter, isang makinang may limitadong pinagkukunan ng lakas ng *hardware*. Idiniin ni John C. Reynolds na katulad din ng mga wikang pamprograma ang mga wikang may pormal na pagdedetalye (*formal specification languages*) sa kadahilanang pareho silang mga wikang ginagamit para magsagawa (*execute*) ng isang bagay. Katwiran niya, mga wikang pamprograma din ang mga pinapasok na teksto at maging mga grapiko na nakakaapekto sa ugali ng kompyuter, kahit na karaniwang mga hindi kumpletong Turing ang mga ito. Pinuna rin niya na ang pagbabalewala sa mga konsepto ng wikang pamprograma ay ang dahilan kung bakit maraming lamat at butas ang mga pormat ng pag-*input*.

## Kasaysayan 
### Mga panimulang pagpapaunlad 
Pinoprograma nang walang tulong mula sa mga nakalagay na programa (*stored program*) ang pinakaunang mga kompyuter, tulad ng *Collosus*, sa pamamagitan ng pagbago sa sirkito o di kaya'y magtakda gamit ng mga pisikal na kontrol.

Lumipas ang ilang taon, maisusulat na ang mga programa gamit ng mga wikang pangmakina, kung saan maaaring magsulat ang isang tagaprograma ng mga tagubuling nakanumero at direkta itong isasagawa ng makina. Halimbawa, maaaring magkaroon ng tatlong numero ang tagubilin para ipagdagdag ang dalawang halagang nasa magkaibang lokasyon sa memorya: isang *opcode* (pinaiksing *operation code* o kodigo ng operasyon) na pumipili sa operasyon ng "pagdagdag" kasama ng dalawang lokasyon sa memorya. Binabasa ang mga programang ito, mapa-sampuan (*decimal*) man o dalawahan (*binary*), gamit ng mga *punched card*, *paper tape*, *magnetic tape*, o di kaya'y binubukas-sara gamit ng mga *switch* na nasa harapang panel ng nasabing kompyuter. Kalaunan, tinawag ang mga wikang pangmakina bilang mga *wikang pamprograma ng unang henerasyon* (1GL, "*first generation language"*).

Sumunod na ginawa ang mga *wkang pamprograma ng ikalawang henerasyon* (2GL, "*second generation language*"), mas kilalang mga wikang assembly. Malapit pa rin ang mga wikang nasa henerasyong ito sa arkitektura ng mga tagubilin ng isang kompyuter. Ginawa ito na may intensyong maging mas madaling mabasa ng tao at nang mabawasan ang mga pagkakamaling posibleng magawa ng tagaprograma sa kakakompyut ng mga adres.

Una namang isinulat ang *mataas na wikang pamprograma* o mga *wikang pamprograma ng ikatlong henerasyon* (3GL, "*third generation language*") noong dekada 1950s. Ang Plankalkül, ginawa para sa Alemang kompyuter na Z3 ni Konrad Zuse noong 1943 hanggang 1945, ay isang halimbawa ng sinaunang mataas na wikang dinisenyo para sa mga kompyuter, pero hindi ito nasubukan hanggang noong 1998 at 2000.

Isa sa mga itinuturing na unang halimbawa ng mataas na wikang ginawa para sa elektronikong kompyuter ang Short Code, isang mungkahi noong 1949 ni John Mauchly. Di tulad ng kodigong pangmakina, nakasulat gamit ng mga ekpresyong matematikal sa anyong mauunawaan ng nagbabasa ng kodigo ang bawat pahayag ng wika. Kaso lamang, kinakailangan nitong isalin sa kodigong pangmakina sa kada pagtakbo ng mga programang nakasulat sa wikang ito, na lalo pang nagpabagal imbes na magpabilis sa proseso.

Ginawa naman ni Alick Glennie ang Autocode noong unang bahagi ng dekada 1950s sa Pamantasan ng Machester. Bilang isang wikang pamprograma, gumagamit ito ng isang kompayler para agad na masalin ang wika sa kodigong pangmakina. Ang unang kadigo at kompayler na ginawa ay ginawa noong 1952 para sa kompyuter na Mark 1 sa naturang pamantasan. Ito ang itinuturing na kauna-unahang nakokompayl na mataas na wikang pamprograma.

Noong 1954, ginawa ni R.A. Brooker ang ikalawang autocode para sa Mark 1 at tinawag na "Mark 1 Autocode." Gumawa rin si Brooker ng *autocode *para naman sa kompyuter na Ferrari Mercury noon ding dekadang iyon sa tulong ng Pamantasan ng Machester. Ginawa naman ni D.F. Hartley ng Laboratoryong Pangmatematika ng Pamantasan ng Cambridge noong 1961 ang bersiyon nito para sa makinang EDSAC 2. Kilala bilang *EDSAC 2 Autocode*, direktang ginawa ito mula sa *autocode* ng Mercury na may ilang pagbabago para umakma sa lokal na paggamit. Kilala ito dahil sa pag-ooptimisa sa kodigong nakabagay (*object code*) at pagsusuri sa pinagmulang wika (*source language diagnostics*), mga bagay na kinokonsiderang nakaabante noong panahong iyon. Kasabayan (ngunit hiwalay) nito ang Atlas Autocode na ginawa para naman sa makinang Atlas 1 ng Pamantasan ng Manchester.

Noon ding taong 1954, inimbento ni John Backus sa IBM ang wikang FORTRAN. Ito ang kauna-unahang pangkalahatang wikang pamprogramang marami ang gumamit na ginawa para gamitin, imbes na panukala lamang o pagpatunay mula sa isang papel. Ginagamit pa rin hanggang ngayon ang naturang wika para sa mga malalakas at matitinding pagkokompyut at mga programang sumusukat sa bilis ng mga superkompyuter.

Smantala, sa Estados Unidos, ginawa ni Grace Hopper ang wikang FLOW-MATIC. Ginawa ito para sa kompyuter na UNIVAC sa Remington Rand mula noong 1955 hanggang 1959. Napansin ni Hopper at ang kagrupo niya na hindi komportable ang mga *customer* ng paproseso ng mga datos sa negosyo sa mga notasyong pangmatematika, kaya naman ginawa nila ang wikang nakasulat sa wikang Ingles at sumubok ng isang *prototype*. Inilabas sa publiko noong 1958 ang kompayler ng nasabing wika, at maituturing na kumpleto na ito noong 1959. Malaki ang impluwensiya ng FLOW-MATIC sa disenyo ng wikang COBOL, dahil tanging ito at ang direktang apo nitong AIMACO lamang ang aktwal na ginagamit noong panahong iyon.

## Mga wikang pamprograma 
Ang ilan sa mga halimbawa ng mga wikang pamprograma ay ang mga sumusunod:

*ADA (en)
* ASP
*BASIC
* C
*C++ (en)
*C# (en)
*Catrobat
* Java
*Lisp (en)
* Pascal
*Perl (en)
*PEARL (en)
* Python
*Scratch (en)
* Smalltalk
* Visual Basic
* Visual C



## Sanggunian