# Programa informatiko

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

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

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

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

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)
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
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

* ↑ Dooley, John, 1952-. A brief history of cryptology and cryptographic algorithms. ISBN 978-3-319-01628-3. PMC 860897407. (Noiz kontsultatua: 2019-11-21).
* ↑ McCartney, Scott.. (1999). ENIAC, the triumphs and tragedies of the world's first computer. Walker ISBN 0-8027-1348-3. PMC 40534855. (Noiz kontsultatua: 2019-11-21).
* ↑ Akter, Shameem.. (2006). Multi-core programming : increasing performance through software multithreading. Intel Press ISBN 9780976483243. PMC 183266834. (Noiz kontsultatua: 2019-11-21).
* ↑ Watt, David Anthony.. ([1996]). ADA lengoaia eta metodologia. Servicio Editorial de la Universidad del País Vasco = Euskal Herriko Unibertsitateko Argitalpen Zerbitzua ISBN 8475858651. PMC 434213410. (Noiz kontsultatua: 2019-09-06).
* ↑ Alegria, Iñaki.. ([1995]). C programazio-lengoaia. Elhuyar Kultur Elkartea ISBN 8487114032. PMC 431789020. (Noiz kontsultatua: 2019-09-06).
* ↑ Informatikaren oinarriak C lengoaian ebatzitako problemak : industria ingeniaritza teknikoko eta industria graduko ikasleei zuzendua. Servicio Editorial de la Universidad del País Vasco = Euskal Herriko Unibertsitateko Argitalpen Zerbitzua 2010 ISBN 9788498604641. PMC 776669615. (Noiz kontsultatua: 2019-09-06).
* ↑ Bastarrika, Juan Ramon; Sarasola, Kepa. (1991). LISP: programazio-lengoaia. Udako Euskal Unibertsitatea ISBN 8486967325. PMC 907327642. (Noiz kontsultatua: 2019-09-06).
* ↑ Astigarraga Pagoaga, Aitzol.; Sarasola, Kepa. (2009). TAPE: testu-analisirako PERL erremintak. Udako Euskal Unibertsitatea ISBN 9788484382331. PMC 863215889. (Noiz kontsultatua: 2019-09-06).
* ↑ Alegria Loinaz, Iñaki; Perez de Viñaspre, Olatz; Sarasola, Kepa. (2016). Python programazio-lengoaia.. UEU eta UPV/EHU ISBN 9788490824405. PMC 1019651201. (Noiz kontsultatua: 2019-09-06).
* ↑ Arruabarrena, Rosa.. (1997). Algoritmika. Udako Euskal Unibertsitatea ISBN 8486967821. PMC 52409142. (Noiz kontsultatua: 2019-09-06).
* ↑ Díaz de Ilarraza Sánchez, Arantza.; Sarasola, Kepa. (1999). Oinarrizko programazioa : ariketa bilduma. Udako Euskal Unibertsitatea ISBN 8484380025. PMC 52408737. (Noiz kontsultatua: 2019-09-06).
* ↑ Sarasola, Kepa.. (1984). Programatzeko algoritmoak. Udako Euskal Unibertsitatea ISBN 8439819714. PMC 433751095. (Noiz kontsultatua: 2019-09-06).

## Kanpo estekak

* Datuak: Q40056
* Multimedia: Software / Q40056