Programazio

thumb|500x500px|Formula bat balio batzuekin kalkulatzen duen programa xume bat Python lengoaiaz (zilindro baten bolumena)|alt=
thumb|350x350px|Formula bat balio batzuekin kalkulatzen duen programa xume baten exekuzioa Python lengoaiaz (zilindro baten bolumena)
**Programazioa**, programa informatiko bat garatzeko egiten den prozesua da. Ordenagailuetarako programen kodea idatzi, probatu, araztu eta mantentzeko prozesua da. Programa informatiko bat ondo sortzeko kontuan hartu behar den metodologia aztertzen duen diziplinari ere **programazioa** esaten zaio.

Orokorrean, bizitza arruntean *programatzea* esaten denean tarea bat planifikatzea adierazi nahi da. Informatikan programatzea zera da, konputagailuari adieraztea zer egin behar duen eta nola.

## Historia 
Gailu programagarriak duela urte askotatik existitu izan ohi dira. Bederatzi garren mendean, musika sekuentziadore bat inbentantua izan zen "Banu Musa" anai pertsiarrengandik, zeintzuk txirula mekaniko automatiko bat deskribatu zuten *Book of Ingenious Devices* liburuan.

1206. urtean Al-Jazari arabiarrak bateria programagarri bat sortu zuen non musika mekaniko automatikoa sortu zezakeen erritmo desberdinak eta tamboreen patroi desberdinak jotzearen poderioz, leben eta klabijen bitartez.

Kodea hausteko algoritmoak mendeetan zehar ere existitu dira. IX mendean, Al-Kindi matematikari arabarrak kodetutako kodea deszifratzeko algoritmo kriptografikoa deskribatu zuen, *A Manuscript On Deciphering Cryptographic Messages* liburuan. Maiztasun analisiaren bidez, kriptoanalisiaren lehen deskribapena eman zuen, kodeketaren algoritmo zaharrena.

Lehenengo programa informatikoa 1843koa da, orokorrean, Ada Lovelace matematikariak Bernoulli zenbakien sekuentzia kalkulatzeko algoritmoa argitaratu zuenean, Charles Babbageren Motor Analitikoak burutzeko.

### Programazio-lengoaien historia eta aurrerapenak 
Programa bat sortzeko, konputagailua interpretatu ahal izateko eta bertan dauden instrukzioak ordenagailuak egiteko, programazio-lengoaia batean idatzita egon behar dira instrukzio horiek.

Hasiera batean, ordenagailuek oso lengoaia sinple batean bakarrik ulertzen zuten, ordenagailuaren makina-lengoaian. Lengoaia hori baina oso konplexua zen programatzeko, bai datuak bai instrukzioak sistema bitar irakurgaitza erabiliz adierazi behar ziren.

Orduan, lana erraztearren adituek zeroz eta batez sortutako sekuentzia amaitezin haiek hitz-laburduren bidez erabili ahal izatea asmatu zuten. Hortaz, Ensabladorea edo Mihiztadura-lengoaia sortu zen. Adibidez, bi zenbaki gehitzeko *ADD* kodea erabil zitekeen.

Mihiztadura-lengoaian eta makina-lengoaian programatzea funtsean gauza bera da, baina programatzaileentzat errazagoa da komandoen letrak gogoratzea, zenbaki bitarren kateak baino.

Ordenagailuek gauza gero eta konplexuagoak egiten zituztenez, mihiztadura-lengoaian ere neketsua zen programa luzeak sortzea. Beraz, goi-mailako programazio-lengoaiak sortu ziren. Esate baterako, bi zenbakien batuketa egiteko instrukzio batzuk behar ziren mihiztadura lengoaian, baina goi-mailako batekin instrukzio bakar batekin lor daiteke.thumb|350x350px|Goi-mailako programazio-lengoaia batzuen bertsio-bilakaera urteetan zehar.|alt=Programa bat amaitzean bai mihiztadura-lengoaian bai goi-mailako programazio-lengoai batean idatzita badago, kasu bietan konpilatu egin beharko da, hau da, sortutako kodea makina-lengoaiara itzuli beharko da. Beraz, beharrezkoa da hori egitea programa erabiliko duen ordenagailuak edo makinak uler dezan. Horrez gain, batzuetan beharrezkoa da beste fase bat igarotzea. Lotura fasea esaten zaio; alegia, kodeari behar dituen baliabideak liburutegitik eransten zaizkio.

Geroago, hardwarearekin bezala, softwarearen garapen historikoa (programazioarena) ere hainbat belaunalditan antolatu izan da:

* Lehenengo belaunaldia, lehenengo ordenagailu elektrikoekin etorri zen. Programa memorian zuzenean eta kode bitarrean idatzi behar zen.
* Bigarren belaunaldia, Mihiztadura-lengoaiaren hedapena ekarri zuena.
* Hirugarren belaunaldia, algoritmo konplexuagoak proramatzeko aukera ekarri zuena.
* Laugarren belaunaldia, goi-mailako programazio-lengoaiak eta beren erraztasunak ekarri zituena.
* Bosgarren belaunaldia, adimen artifizialaren programazio-lengoaiak sortu zituena.

### Informatikaren eta Teknologiaren historia 
Informatikaren eta Teknologiaren historia guztian zeharreko gertaera edo asmakizun batzuek zerikusi estua izan dute programazioaren hedapenarekin. Hona hemen asmakizun horietako batzuk:

XIX. mendean programazioaren lehen urratsak:

* 1842an Ada Lovelace sortu zuen lehen programa.

XX. mendeko hainbat aurrerakuntza:

* 1936an Turingen Makina.
* 1946an ENIAC: Lehenengo ordenagailua digitala.
* 1947an Transistore.
* 1966an ARPANET: Internetaren jatorria
* 1970ean UNIX Sistema eragilea.
* 1972an Lehenengo birus informatikoa.
* 1974an TCP protokoloa: Lehenengo sare lokala.
* 1975ean eta 1976an Microsoft eta Apple fundatu ziren.
* 1981ean IBM PC: Sistema eragile MS-DOS
* 1983an Programazio Lengoaia C++.
* 1990ean HTML lengoaia sortu zen.
* 1991n Linux sistema eragileak sortu ziren.

## Behe- eta goi-mailako programazio-lengoaiak 
Programazioaren historiako lehenengo urrats haietan programazio-lengoaiak Behe- eta goi-mailakoen artean sailkatzen ziren, haien ezaugarrien arabera.

### Behe-mailako programazio-lengoaiak 
thumb|300x300px|Makina-lengoaiako instrukzioak. 3 adibide.
Programazio-lengoaia hauen instrukzioak euskarri fisikoan dute kontrola edo eragina, eta ondorioz ordenagailuaren egitura fisikoarekin zeharo lotuta daude. Beste konputagailu mota batean ez da izango erabilgarri. *Behe* hitzak ez dio lengoaiaren potentziari edo kalitateari erreferentzia egiten, lengoaia- eta hardware-abstrakzio murriztuari baizik.

* Makina-lengoaia: ulertezina programatzaileentzat, aginduak sinpleegiak eta ordenagailu mota bakoitzak bere makina-lengoaia du.
* Mihiztadura-lengoaia: makina-lengoaiatik oso gertu dago, baina programatzaileentzat ulerterrazagoa da. Agindu bitarrak karaktere alfanumerikoekin adierazten dira.

### Goi-mailako programazio-lengoaiak 
alt=|thumb|300x300px|Goi-mailako programazio-lengoaia baten adibidea.Programazio-lengoaia hauek programatzaileari aukera ematen diote instrukzioak hitz edo adierazpen sintaktikoen bidez idazteko. Maila honetako adibide batzuk hauek izan daitezke: Ada, BASIC, C, C++, C#, COBOL, Common Lisp, Fortran, , Haskell, Java, JavaScript, Mathematica, Pascal, Perl, PHP, Prolog, Python, R, Ruby, Visual Basic.

* Ezaugarriak:
** Datuak eta aginduak karaktere alfanumerikoen bidez aipa daitezke, hau da, ez kode bitarrean.
** Datuak hartzeko aldagaiak defini daitezke.
** Agindu eta datu ahaltsuagoak eta landuagoak erabil daitezke, hau da, ez oinarrizko eragiketa xumeak soilik.
** Bateragarria da, hainbat ordenagailu mota desberdinetan erabili daitezke.
** Programen erroreak zuzenketa errazagoa da. Denbora asko aurrezten da horregatik aurrezten da beste behe-mailako programazio-lengoaiekiko.
** Oharrak txerta daitezke programa hobetu ulertzeko.

Laburbilduz, behe-mailako programazio-lengoaiak makinaren prozesamendu-lengoaiaz hurbilago daude eta goi-mailako programazio-lengoaiak, aldiz, programatzailearen lengoaiaz hurbilago daude.

Gehienetan, goi-mailako lengoaia bat erabiltzen denean, programaren idazketa bera bi urratsetan egiten da eta bi erreminta erabiliz. Alde batetik, kodea idazten laguntzen duen editore bat erabiltzen da. Eta bestalde, beste erreminta bat kode hori makina-lengoaiara itzultzeko, mikroprozesadorea agindu horiek prozesatu ahal ditzan.

## Programa bat eraikitzeko faseak 
thumb|300x300px|Konputagailu-programa bat sortzeko faseak (ebazpen-fasea eta inplementazio-fasea)
Problema bat emanda hauek dira programa bat eraikitzeko faseak:

* **Zehaztapena (edo espezifikazioa)**

Ondo zehaztu zeintzuk diren programak hartuko dituen datuak eta zeintzuk diren lortu beharko diren emaitzak. Zer dira? Zenbaki osoak? Zenbaki errealak? Hitzak? Zer propietate betetzen dituzte datu horiek? Eta emaitzek?
* **Diseinua (algoritmoa)**

thumb|300x300px|Algoritmo bat: Bi zenbaki osoren zatitzaile komunetako handiena kalkulatzea.
Zehaztapenak definitzen du ZER lortu behar dugun. Algoritmoak NOLA lor ditzakegun emaitzak.  Ez dago programaetan bezala zorrotz jarraitu behar diren sintaxi-araurik; algoritmoa ez baita idazten makina batek uler dezan, beste pertsona batek baizik.

Algoritmoak lagunduko digu gero programako agindu-sekuentzia eraikitzen.

* **Programa idaztea**

thumb|300x300px|Programa bat: bi zenbaki osoren zatitzaile komunetako handiena kalkulatzeko programa Ada lengoaian.
Konputagailuak exekutatuko duen agindu-sekuentzia da. Programazio-lengoaia bat erabili beharko da aginduak idazteko, lengoaia horren arau sintaktikoak errespetatu beharko dira (zer formatutan idatzi behar diren aginduak, nola idatzi zenbakiak,...), noski, bestela erroreak gertatuko dira konpilazio-fasean, agindu-sekuentzia automatikoki makina-lengoaiara itzultzerakoan.
* **Proba**

Probatu behar da programak emaitza zuzenak lortuko dituela, datuak edozein direla .Datuen balio esanguratsuekin proba multzo bat prestatu behar da. Eta gero kasu horietan guztietan probatu ea emaitza zuzenak lortzen diren.
* **Erabilera**

Probak ondo bukatuz gero, programa prest dago erabilia izateko.

## Programa on baten ezaugarriak 
Programa on baten ezaugarriak hauek izan behar dira:

* **Zuzentasuna:** Programa batek lortzen dituen emaitzak ea beti zuzenak diren, alegia, ea bat datozen programaren espezifikazioan zehaztu zirenekin. Horregatik da oso garrantzitsua programa idazten hasi baino lehenago espezifikazioa (edo zehaztapena) ondo finkatzea. Programa amaitzean ziurtatu behar da lortzen dituen emaitzak eta hasieran espezifikazioan adierazi zirenak bat datozela.
* **Irakurgarritasuna:** oso garrantzitsua da programa argia eta irakurterraza izatea. Etorkizunean bere garapena eta mantentze-lana errazteko. Beste alde batetik, programa bat sortzean saiatu behar da bere egitura erraza eta koherentea izatea, baita programazioaren estiloa zaintzea ere, programaren funtzionamendua azalduko duten hainbat ohar eta iruzkin txertatzea funtsezkoa izaten da irakurgarritasuna lortzeko. Horrela programatzailearen lana errazten da, bai sorkuntzaren fasean baita geroko fasetan ere (akatsen zuzenketan, aldaketetan, garapenean). Garrantzitsua da ezaugarri hau garapeneko fase bakoitzean pertsona desberdinak aritzen diren kasuetan.
* **Eraginkortasuna:** programa zuzena izan arren, beharrezkoa da bere helburua ahal den denbora txikienean lortzea. Horrez gain, erabiltzen dituen memoria-espazioa eta baliabideak era eraginkorrean erabili behar ditu. Beraz, denbora eta memoria-espazio ahal den txikiena erabiltzeak eraginkorra egingo du programa bat.
* **Portabilitatea:** programa sortzeko erabili den plataforma (konputagailu mota bat, sistema eragilea, bertsioa...) ez den beste plataforma batean ere modu egokian egikaritzeko aukera duenean. Adibidez Windows sistema eragile batean sortutako programa bat beste aldaketarik gabe Linux-en ere egikaritu ahal denean.
* **Sendotasuna:** programak arazoak izan ditzake aurreikusita ez dauden kasuetan. Programa sendoa bada, ohiko ez diren kasuetan ere programaren exekuzioa bukatzen da eta emaitza zuzenak lortzen ditu

## Lengoaia baten definizioa: hitz erreserbatuak eta arauak 
Programazioa, arau eta hizkuntza hizkuntza natural antza (ingelesez) duten aginduen, adierazpenen, instrukzioen eta komandoen multzoek osatzen dute. Elementu horiek anbiguotasun txikia izan behar dute, programazio-lengoaiak zenbat eta anbiguotasun gutxiago izan, orduan eta eraginkorragoa delako. Premisa horretatik abiatuta, bitarra da lengoaiarik eraginkorrena, ez baitu anbiguotasunik .

Goi-mailako programazio-lengoaietan hainbat elementu bereizten dira, eta horien artean lengoaiaren berezko lexikoa eta arau semantiko eta sintaktikoak daude. Lehenengo konputagailuarentzat diseinatutako goi-mailako programazio-lengoaia Plankalkül (1948) izan zen, Konrad Zuse-k (1910-1995) sortua. Hala ere, berea ekarpen teorikoa izan zen batez ere, programazio-lengoaia hori ez baitzuen inplementatu.

Zabalki hedatutako lehenengo goi-mailako programazio-lengoaia Fortran izan zen, 1957. urtean IBMk garatutakoa. Bitartean, Algol lengoaiak, 1958. eta 1960. urteetan definitutakoa, kontzeptu berriak sartu zituen, hala nola errekurtsioa, programazio-egiturako hainbat kontzeptu eta abar. Garai horretan, COBOLek erregistroak barruratu zituen eta berdin egin zuen LISPek lambda-abstrakzioarekin.

Lehenengo goi-mailako programazio-lengoaiak 1950eko hamarkadan diseinatu ziren. Gaur egun mota horretako ehunka lengoaia existitzen dira, adibidez:
thumb|340x340px|Goi-mailako programazio-lengoaiaren adibide bat

## Programak eta algoritmoak 
Algoritmo bat da arazo bat konpontzeko urratsez urrats jarraitu behar den, antolatuta dagoen eta finitua den argibideen sekuentzia, anbiguotasunik ez duena. Oro har, programa batek algoritmo bat edo gehiago inplementatzen du, hau da, programazio-lengoaia batera itzultzen du. Algoritmo bat era ugaritan adieraz daiteke: grafikoki (fluxu-diagrama modura), kode moduan (sasikodea) edo era esplikatzaile batean (programazio-lengoaia).

Algoritmo guztiak honako parteez osatuta egon behar dira beti:
* **Input** edo sarrera. Algoritmoak funtzionatzeko behar dituen datuen sarrera.
* **Prozesua**. Algoritmoak sartutako inputekin gauzatuko duen eragiketa logikoa.
* **Output** edo irteera. Algoritmoaren egikaritzea amaitzean input-ak erabiliz egindako prozesuaren emaitzak.

Gehienetan programak moduluak deitutako atal txikiagotan banatzen dira. Moduluen erabilerarekin algoritmoen zailtasuna murrizten da eta ondorioz errazagoa da programa garatzea. Prozesu horri beheranzko analisia (Top-Down) deritzo eta asko erabiltzen den jarduera da.

Niklaus Wirth-en arabera programa bat algoritmoz eta datuen estrukturaz osatua dago.

Programazioak ikuspegi edo paradigma anitz jarrai ditzake, hau da, arazo baten konponbidea aurkitzeko modu ezberdinak daude. Programazioaren paradigmarik nagusienak hauek dira:

* Programazio deklaratiboa
* Programazio egituratuta
* Programazio modularra
* Objektuetara bideratutako programazioa

Programazio paradigma konkretu batekin lan egin daiteke, baina praktikan ohikoa da horiek nahastea (multiparadigma).

Informatikan programa esaten dugunean software bati buruz hitz egiten ari gara. Zenbait programa mota bereiz ditzakegu. Oinarrizko software-ak, adibidez, pertsona bati ematen dio konputagailuaren osagai fisikoen (hardware) gaineko kontrola izateko aukera. Windows edo Linux sistema eragileak oinarrizko software-aren taldean sartzen dira.

Bulegotika programak ere oso garrantzitsuak dira, horien artean ondorengo testu prozesadoreak bereizten dira: Microsoft Word eta LibreOffice Writer; kalkulu-orriak, hala nola Calc, Lotus 1-2-3 eta Microsoft Excel; eta posta elektronikoaren kudeaketa ahalbidetzen duten Thunderbird, Lotus Notes, Microsoft Outlook eta Eudora.

## Konpilazioa 
Goi-mailako lengoaian idatzitako programazio-lengoaia (ordenagailuarentzat ulerterraza dena) jatorrizko programa deitzen da eta ezin da zuzenean ordenagailuan egikaritu. Ohiko aukera modulu bat lortuz programa konpilatzea da, hala ere; modu zuzenagoan exekutatu daiteke interpretatzaile informatiko baten bidez. Programaren iturburu-kodeak itzultze-prozesu bat pasatu behar du makina-lengoaia edo bitarteko kodea bihurtzeko, objektu deitzen den modulu bat sortuz. Prozesu horri konpilazio deritzo.

Normalean programa exekutagarri (.exe modukoa Microsoft Windows-erako edo DOS) baten sorrera bi urratsez osatuta dago. Lehenengo urratsa konpilazioa da, horrek testu-artxibo batean gordetako programazio-lengoaian idatzita dagoen iturburu-kodea itzultzen du behe-mailako kode batera (gehienetan objektu-kode batera eta ez zuzenean makina-lengoaiara). Bigarren urratsa lotura deitzen da, horrekin lehenago egindako konpilaziotik sortutako fitxategi eta azpiprograma guztien behe-mailako kodea lotzen da, eta konpiladorearen liburutegian dauden funtzioen kodea gehitzen. Modu horretan exekutagarria sistema eragilearekin zuzenean komunika daiteke eta horrela, azkenean, objektu-kodea makina-kode bihurtzen da.

Bi urrats horiek banaka egin daitezke, konpilazio fase bakoitzaren emaitza objektu artxiboetan biltzen da (.o modukoa Unix-rako, .obj moduko MS-Windows-rako, DOS); ondorengo faseetan lotzeko edo zuzenean exekutagarri bat sortzeko. Konpilazio fasea bakarrik gorde daiteke denboraldi baterako. Programa batek zenbait lengoaiatan idatzitako zatiak eduki ditzake, adibidez, Java, C, C++ eta mihiztatzaile. Zati horiek banaka konpilatu daitezke eta gero elkarrekin lotu modulu exekutagarri bakarra lortzeko.

## Software-ingeniaritza eta programazioa 
Programa informatiko baten sorrera programaren idazketa hutsarekin identifikatzen da gehienetan. Horrek balio du programa txikiak egiten direnean, eta erabilera pertsonal hutserako, baina ez da hori bakarrik milaka agindu izango dituen proiektu handi batekin aritzean.

Ingeniaritzaren ikuspuntutik, hauek dira software baten sorkuntza-prozesu batean zehar jarraitu behar diren ezinbesteko urratsak:

# Problema baten ebazpena lortzeko programa baten beharra antzeman, edo ataza baten automatizazioaren aukera identifikatu.
# Programaren betebeharrak bildu. Espezifikazio formal batean argi geratu behar da bere eginkizuna zein den eta zertarako erabiltzen den.
# Programa ezarri (instalatu). Hori egiteko programa abian jarri behar da behar dituen osagaiekin batera (datu-baseekin, komunikazio-sareekin, etab.)

Software-ingeniaritza arloa programaren diseinu eta plangintzaren urrats horietan ardazten da. Aspaldian programatzaile baten betebeharra (artisau-programazioa) kodea idaztea baino ez zen, eta espezifikazio-, diseinu- eta analisi-fasea oso xumeak ziren.

## Erreferentziak 
## Bibliografia 
* http://www.alegsa.com.ar/Dic/lenguaje_de_programacion_de_alto_nivel.php
* https://definicion.de/programa-en-informatica/

## Ikus, gainera 
* Programazio-lengoaien arteko konparazioa

## Kanpo estekak