Programa informatiko

alt=|thumb|500x500px|Formula bat balio batzuekin kalkulatzen duen programa xume bat Python lengoaiaz (zilindro baten bolumena)
thumb|350x350px|Formula bat balio batzuekin kalkulatzen duen goiko programa xumearen exekuzioa Python lengoaiaz (zilindro baten bolumena)
**Programa informatiko** bat instrukzio sekuentzia bat da, gailu informatiko batek egikaritzean zeregin bat gauzatzen duena. Gailu informatiko gehienek programa informatikoen beharra dute ondo funtzionatzeko.

Programa informatikoen kodea progamazio lengoaia batean idazten dira, gehienetan programatzaile batek idatzita. Kode honi iturburu kodea deritzo, eta konpilatzaile batez konpilatu eta mihiztatu ondoren fitxategi egikarigarri batean bihurtzen da.thumb|"hello, world" Brian Kernighan 1978an egindako programa informatikoa

Programazio informatikoen multzoari, liburutegi eta datuekin batera, software deitzen zaio. Haien funtzioari erreparatuz bi mota daude: sistemako softwarea eta aplikazio softwarea.

## Historia 
IX. mendean Al-Kindi matematikari arabiarrak kriptoanalisia definitu zuen analisi frekuentziala erabiliz, eta hau izan zen historiaren lehen kode algoritmoa.

### Lehenengo makina programagarriak 
Lehenengo makina programagarriak ordenagailu digitalaren asmakuntzarekin etorri ziren. Hauek dira aipagarrienak:

* IX. mendean Banu Musa anaiek musika sekuentzagailu bat asmatu zuten.
* 1206an Al-Jazari ingeniari arabiarrak erritmo kutxa bat programatu zuen.
* 1801an Joseph-Marie Jacquardek ehungailu mekaniko bat asmatu zuen, txartel zulatuez baliatzen zena oihalean patroiak egiteko.

### Motore analitikoa 
1837an Charles Babbage, Jacquarden ehungailuan inspiratuta, motor analitikoa sortzen saiatu zen. Txartel zulatuen bi atalekin programatua izan zen, bata operazioa egiteko eta bestea aldagaiak gordetzeko. Nahiz eta Erresuma Batuaren gobernuak 17.000 libra baino gehiago inbertitu, ez zen lortu dena ondo burutzea.

### Turing makina 
thumb|Programa informatikoak gordetzeko erabiltzen ziren txartel zulatuak
1936an Alan Turingek Turing makina sortu zuen. Turing makina teorikoa zen eta edozein algoritmo simulatu ahal zuen.

### Lehen ordenagailu programagarriak 
1941ean Konrad Zusek Z3 ordenagailu digital eta programagarria sortu zuen. Ordenagailu digitalek elektrizitatea erabiltzen dute osagai kalkulatzaile bezala. Z3 ordenagailuak 2400 errele zituen zirkuituak sortzeko eta zirkuitu hauek 9 instrukzio bitarreko ordenagailu bat osatzen zuten. Z3 ordenagailua programatzeko teklatu berezi bat eta txartel zulatu berezi bat erabili zuten.

1945ean ENIAC ordenagailua atera zen. ENIAC Turingen testa betetzen zuen, eta zirkuituak egiteko 17.468 balbula termoionikoak erabiltzen zituen ordenagailu bat zen. 30 tona pisatzen zituen eta 167m² okupatzen zituen. Gainera, $650 gastatzen zituen orduko. ENIAC programatzeko bi hilabete behar izan zituzten eta programa bat debugeatzeko aste bete bat behar zen. ENIAC programatu zutenak emakumeak ziren eta "ENIAC girls" deitzen zieten. 8 urte egon zen martxan, hidrogeno bonben aldagaiak kalkulatzen, eguraldiaren iragarpena egiten eta artilleria armak kontrolatzeko aginteak egiten.

1948an Manchester Baby izan zen sortua. Hau programatzeko ez zen behar kablerik mugitzea, izan ere programa memoria batean zenbaki bezala gordeta zegoen. 3 biteko instrukzioak soilik gorde ahal ziren, orduan 8 instrukzio bakarrik izan ahal zituen.

### Ordenagailu aurreratuagoak 
1970era arte egindako ordenagailuek panel etengailuak erabiltzen zituzten programatzeko, hala ere, programa informatikoa paperean idazten zen erreferentzia izateko. Instrukzioak piztu/itzali erreferentzia bezala errepresentatzen ziren eta behin konfigurazioa eginda, exekuzio botoiari eman behar zitzaion. Prozesu hau behin eta berriz errepikatu behar zen. Garai honetako ordenagailu garrantzitsuenak hauek izan ziren:

* 1961ean Burroughs B5000 egin zen, ALGOL 60 programazio lengoaian programatzen zena. Kasu honetan, hardwarea zirkuituekin zetorren konpilatze fasea errazteko.
* 1964an IBM System/360 atera zen, sei ordenagailuen multzoa zena. Seiak arkitektura instrukzio berdinak zituzten. Hainbat modelo atera ziren, haietatik 30. modeloa zen txikiena eta merkeena. Gainera, kontsumitzaileek modelo batetik bestera eguneratu zezaketen aplikazio software berdina mantenduz.

## Programazioa 
Programazioa iturburu kodea idaztearen edo editatzearen prozesua da. Programazioa egiten duen pertsona bati programatzailea deritzo. Gehienetan, programa bat programatzaile batek baino gehiagok egiten dute.

Batzuetan programa informatiko bat programatzearen prozesuari software garapena deitzen zaio. Prozesua ingeniaritza diziplina bezala ikusten hasi da, software ingeniaritza hain zuzen ere.

### Programazio lengoaiak 
Programa informatikoak eginda izan diren programazio lengoaiaren arabera multzokatu ahal dira. Bi programazio lengoaia mota nagusi daude: inperatiboa eta deklaratiboa.

#### Lengoaia inperatiboak 
Programa inperatiboak ordenagailuari ataza bat nola burutu behar duen esaten dioten agindu multzoz osatuta daude. Lengoaia inperatiboen adibide batzuk C, PHP, Python... dira.

#### Lengoaia deklaratiboak 
Programazio deklaratiboa programazio inperatiboaren kontrakoa da. Programa garapenean oinarrituta dago, baldintzak, proposizioak, baieztapenak, mugak, ekuazioak edo aldaketak deklaratuta, problema deskribatzen eta konponbidea zehazten dutenak. Lengoaia deklaratiboen adibide batzuk Haskell eta SQL dira.
## Programen egikaripena eta memoria 
Programa informatikoak, kasu gehienetan, memoria ez-hegazkorrean daude gordeta, erabiltzaileak, zuzenki edo ez-zuzenki, deitzen dion arte. Hori gertatzen denean, sistema eragileak RAM memorian kargatzen du, prozesadore zentralak programaren atzipena izateko. Ondoren, prozesadore zentralak programa egikaritzen du prozesu izena hartuz. Bukaera hiru motakoa izan daiteke: normal amaitzen delako, erabiltzaileak bukatzeko esaten diolako edo errore bat gertatzen delako.

### Aldibereko egikaripena 
Sistema eragile askok multiataza pairatzen dute, hau da, aplikazio informatiko batean, aldi berean, hainbat programa exekuzioan egon. Horretarako, sistema eragileak prozesuen planifikazioaz baliatzen da.

### Bere burua aldatzen duten programak 
Normalean, programa informatiko bat banatuta dago aldatzen dituen datuengan. Hala ere, batzuetan, programa berak bere burua aldatzen du. Kasu hauetan, aldatuta dagoen programa, programa berdinaren barruan egikaritzen da subsekuentziaz.

## Kategoria funtzionalak 
### Aplikazio softwareak 
Mota asko daude:

* App: Aplikazio hitzaren laburdura bat da. Hainbat plataformentzat diseinatu dira, baina lehen agerpena mobiletan izan zen. Hala ere, web app, telebistako app, etab. badaude ere.
* Aplikazioen bilduma: Hainbat programa informatikoen multzoa da. Adibidez Microsoft Office, LibreOffice...
* Erakunde aplikazioak: Saltzaileei, erosleei eta langileei laguntzeko diseinatuta dauden aplikazioak dira. Adibidez enpresa baliabideen plangintza (ERP), bezeroekiko harremanak kudeatzeko sistemak (CRM)...
* Jolas software: Bideo-joko aplikazioak, musika aplikazioak edo bideo aplikazioak izan ahal dira.

### Programa baliagarriak 
Gailu informatikoak analizatzen, konfiguratzen, optimizatzen eta mantentzen laguntzen duten programak dira.

### Sistema eragilea 
Sistema eragilea gailu informatiko baten software nagusia da, hardwarea eta erabiltzailea lotzen duena.

### Abio programa 
Abio programak ROM memorian daude gordeta eta gailu informatikoa hasieratzen dute.

## 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.

## Behe- eta goi-mailako lengoaietako programak 
Programazioaren historiako lehenengo urratsetan programazio-lengoaiak behe- eta goi-mailakoen artea 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.

## Erreferentziak 
## Kanpo estekak