# Programació d'ordinadors

La programació d'ordinadors o programació informàtica (sovint abreujat programació o codificació) és el procés d'escriure, provar, depurar/solucionar problemes, i mantenir el codi font de programes. Aquest codi font està escrit en un llenguatge de programació. El codi pot ser una modificació d'una font existent o una cosa completament nova. L'objectiu de la programació és crear un programa que mostra un determinat comportament desitjat (personalització). El procés d'escriure el codi font sovint requereix experiència en molts temes diferents, incloent coneixement de l'àmbit d'aplicació, dels algorismes especialitzats i lògica formal.

## Resum

Dins d'enginyeria de programari, la programació (la implementació) es considera com una fase en un procés de desenvolupament de programari.
Hi ha un debat en curs sobre en quina mesura l'escriptura de programes és un art, un ofici o una disciplina d'enginyeria. En general, la bona programació es considera que és l'aplicació mesurada dels tres, amb l'objectiu de produir una solució de programari eficient i capaç d'evolucionar (els criteris d'«eficiència» i «evolució» varien considerablement). La disciplina es diferencia de moltes altres professions tècniques, ja que els programadors, en general, no necessiten ser llicenciats o passar per qualsevol proves de certificació estandarditzades (o regulatització governamental) per anomenar-se a si mateixos «programadors» o fins i tot «enginyers de programari». No obstant això, pel fet que la disciplina abasta moltes àrees, que pot o no incloure aplicacions crítiques, és discutible la concessió d'una llicència per a la professió en el seu conjunt. En la majoria dels casos, la disciplina és autoregulada per les entitats que requereixen la programació, i de vegades ambients molt estrictes es defineixen (per exemple, l'ús d'AdaCore a la Força Aèria dels Estats Units i habilitacions de seguretat).
Un altre debat en curs és el grau en què el llenguatge de programació utilitzat per escriure programes informàtics afecta la forma que el programa final pren. Aquest debat és anàloga al que envolta la hipòtesi de Sapir-Whorf en la lingüística, que postula que la natura d'un idioma parlat determinat influeix en el pensament habitual dels seus parlants. Diferents patrons del llenguatge produeixen diferents patrons de pensament. Aquesta idea desafia la possibilitat de representar el món a la perfecció amb el llenguatge, perquè reconeix que els mecanismes de qualsevol llenguatge condicionen els pensaments de la seva comunitat parlant.
Dit d'una altra manera, la programació és l'art de transformar requeriments en alguna cosa que un ordinador pot executar.

## Breu història de la programació

La primera màquina programable (és a dir, màquina de la qual les possibilitats d'ús canvien quan es modifica el seu «programa») és, probablement, el teler de Jacquard, que es va completar el 1801. La màquina utilitzava una sèrie de cartrons perforats. Els forats indicaven el patró que el teler seguia per realitzar un teixit; amb targetes diferents, el teler produïa teixits diferents. Aquesta innovació ha estat llavors millorada per Herman Hollerith d'IBM per al desenvolupament de les famoses targetes perforades d'IBM.
El 1936, la publicació de l'article seminal de la ciència informàtica On Computable Numbers with an Application to the Entscheidungsproblem per Alan Mathison Turing, va posar en marxa la creació de l'ordinador programable. Ell presenta la seva màquina de Turing, el primer ordinador programable universal, i inventa els conceptes i les condicions de programació i programa.
Els primers programes informàtics eren realitzats amb un soldador i un gran nombre de tubs de buit (més tard, transistors). Fent-se els programes més complexos, allò s'ha fet gairebé impossible, perquè un sol error tornava el programa sencer inutilitzable. Amb els avenços en emmagatzematge de dades, es fa possible carregar el programa a partir de targetes perforades, contenint la llista de les instruccions en codi binari específic per a un tipus particular d'ordinador. Augmentant la potència dels ordinadors, se'ls va utilitzar per fer els programes, els programadors preferint, naturalment escriure el text, més que com conjunts de 0 i d'1, deixant que la màquina mateixa va fer la traducció. Amb el temps, nous llenguatges de programació han aparegut, fent cada vegada més l'abstracció del maquinari sobre el qual s'hauria d'executar els programes. Això aporta beneficis en diversos aspectes: aquests llenguatges són més fàcils d'aprendre, un programador pot produir un codi més ràpidament, i els programes produïts es poden executar en diferents màquines.

## Llenguatges de programació

Diferents llenguatges de programació admeten estils diferents de programació (anomenats paradigmes de programació). L'elecció del llenguatge utilitzat està subjecte a moltes consideracions, com la política de l'empresa, l'adequació a la tasca, la disponibilitat de paquets de tercers, o preferència individual. Idealment, el llenguatge de programació més adequat per a la tasca en qüestió serà seleccionat. Les compensacions d'aquest ideal impliquen trobar prou programadors que coneixen el llenguatge per construir un equip, la disponibilitat de compiladors per a aquell llenguatge i l'eficiència amb què executen els programes escrits en un llenguatge donat. Els llenguatges formen un espectre aproximat des de «baix nivell» a «alt nivell»; els llenguatges de «baix nivell» són típicament més orientats cap a les màquines i més ràpids d'executar, mentre que els llenguatges d'«alt nivell» són més abstractes i més fàcils d'usar, però executen amb menys rapidesa.
Allen Downey, al seu llibre How To Think Like A Computer Scientist («Com pensar com un informàtic»), escriu:
| « | Els detalls semblen diferents en llenguatges diferents, però unes poques instruccions bàsiques apareixen en gairebé tots els llenguatges: entrada: obtenir dades des del teclat, arxiu, o algun altre dispositiu. sortida: mostrar dades en la pantalla o enviar dades a un arxiu o un altre dispositiu. aritmètica: realitzar operacions aritmètiques bàsiques, com sumes i multiplicacions. execució condicional: cercar determinades condicions i executar la seqüència apropiada de instruccions. repetició: dur a terme una acció repetidament, en general amb alguna variació. | » |
Molts llenguatges de programació proporcionen un mecanisme per cridar funcions proporcionades per llibreries. Sempre que les funcions en una llibreria segueixin les convencions de temps d'execució apropiades (per exemple, el mètode de passar arguments), llavors aquestes funcions es poden escriure en qualsevol altre llenguatge.

## Programes i Algoritmes

Un Algoritme és una seqüència no ambigua, finita i ordenada d'instruccions que han de seguir-se per a resoldre un problema. Un programa normalment implementa (tradueix a un llenguatge de programació concret) un o més algoritmes. Un algoritme pot expressar-se de diferents maneres: de forma gràfica, com un diagrama de flux, en forma de codi, com per exemple el pseudocodi, o de forma explicativa amb el llenguatge de programació.
Els programes acostumen a dividir-se en parts menors, anomenades mòduls, de manera que la complexitat algorítmica de cadascuna d'aquestes parts és menor que la del programa complet, cosa que ajuda al desenvolupament del programa. Aquesta és una pràctica molt utilitzada i és coneguda amb el nom de "refinament progressiu".
Segons Niklaus Wirth, un programa està format pels algoritmes i l'estructura de dades.
La programació pot seguir molts enfocaments o paradigmes, és a dir, diverses maneres de formular la resolució d'un problema donat. Alguns dels principals paradigmes de la programació son:
* Programació declarativa
* Programació estructurada
* Programació modular
* Programació orientada a objectes

## Compilació

El programa escrit en un llenguatge de programació d'alt nivell (fàcilment comprensible pel programador) es anomenat codi font i no es pot executar directament en un ordinador. L'opció més comú és compilar el programa obtenint un mòdul objecte, tot i que també por executar-se de manera més directe a través d'un intèrpret informàtic.
El codi font del programa ha de sotmetre's a un procés de traducció per a convertir-lo a llenguatge maquina o bé a un codi intermedi, generant així un mòdul denominat "objecte". Aquest procés és anomenat compilació.
Habitualment la creació d'un programa executable (un típic Exe per a Microsoft Windows o DOS) comporta dos pasos. El primer pas és diu compilació (pròpiament dit) i tradueix el codi font (escrit en un llenguatge de programació) que es troba emmagatzemat en un arxiu de text a codi en baix niell (normalment codi objecte, no directament a llenguatge de màquina). El segon pas es diu enllaç en el qual s'enllaça el codi de baix nivell generat de tots els fitxers i subprogrames que s'han fet compilar i s'hi afegeix el codi de les funcions que hi ha a les biblioteques del compilador per a que el executable pugui comunicar-se directament amb el sistema operatiu. D'aquesta manera es tradueix finalment el codi objecte a llenguatge de màquina i es genera un mòdul executable.
Aquests dos pasos es poden fer per separat, emmagatzemant el resultat de la fase de compilació en arxius objecte (un típic .o per Unix, .obj per MS-Windows, DOS); per enllaçar-los en fases posteriors o crear directament l'executable. D'aquesta manera la fase de compilació pot emmagatzemar-se només de forma temporal. Un programa podria tenir parts escrites en diferents llenguatges, com per exemple, Java, C, C++ i assemblador, que es podrien compilar de forma independent i desprès enllaçar junts per formar un únic mòdul executable.

## Programació i enginyeria de programari

Article principal: Enginyeria de programari
Existeix la tendència a identificar el procés de creació d'un programa informàtic amb la programació, cosa que és certa quan es tracta de programes petits per a us personal però que dista de la realitat quan es tracta de grans projectes.
El procés de creació d'un programari, des del punt de vista de la enginyera, inclou mínimament els següents pasos:
* Reconèixer la necessitat d'un programa per a solucionar un problema o identificar la possibilitat d'automatització una tasca.
* Recollir els requisits del programa. Ha de quedar clar que és el que ha de fer el programa i per a que és necessita.
* Realitzar l'anàlisi dels requisits del programa. Ha de quedar quines tasques ha de realitzar el programa. Les proves que comproven la validesa del programa es poden especificar en aquesta fase.
* Dissenyar l'arquitectura del programa. Ha de descompondre's el programa en parts de complexitat assequible.
* Implementar el programa. Consisteix en realitzar un disseny detallat, especificant completament tot el funcionament del programa, després del qual la codificació (programació pròpiament dita) hauria de resultar immediata.
* Provar el programa. Comprovar que passen les proves que s'han definit a l'anàlisi de requisits.
* Implantar (instal·lar) el programa. Consisteix en posar el programa en funcionament junt amb els components que pugui necessitar (bases de dades, xarxes de comunicació, etc.) .
L'enginyeria de programari se centra en els pasos de planificació i disseny del programa, mentre que antigament la realització d'un programa consistia quasi únicament en escriure el codi sota tan sols el coneixement dels requisits i amb una modesta fase d'anàlisi i disseny.

## Objectius de la programació

La programació ha de perseguir l'obtenció de programes de qualitat. Per a això s'estableixen una serie de factors que determinen la qualitat d'un programa. Alguns dels factors de qualitat més importants són els següents:
* Correcció. Un programa és correcte si fa el que es va establir a les fases prèvies al seu desenvolupament de manera satisfactoria. Per a tal de determinar si un programa fa el que ha de fer és molt important especificar-ho clarament abans del seu desenvolupament i, un cop acabat, comparar-ho amb el qual realment fa.
* Claritat. És molt important que el programa sigui el més clar i llegible possible per això facilitar tant el seu desenvolupament com el seu posterior manteniment. Al elaborar un programa s'ha d'intentar que la seva estructura sigui senzilla y coherent, així com cuidar el seu estil de programació. D'aquesta manera es facilita la feina del programador, tant en la fase de creació com en les fases posteriors de correcció d'errors, ampliacions, modificacions, etc. Fases que poden ser realitzades fins i tot per un altre programador, un altre motiu per a respectar aquesta estructura i poder continuar la feina fàcilment. Alguns programadors arriben fins i tot a utilitzar Arte ASCII per a delimitar seccions de codi; una pràctica comuna és realitzar aclariments dins el codi font utilitzant línies de comentaris. Contràriament, alguns programadors per impedir una anàlisi còmoda a altres programadors o per diversió recorren a l'ús del codi ofuscat.
* Eficiència. Es tracta de que el programa a més a més de realitzar allò pel que va ser creat (és a dir, que sigui correcte), ho faci gestionant de la millor manera possible els recursos que utilitza. Normalment, al parlar d'eficiencia d'un programa s'acostuma a fer referència al temps que tarda en acomplir la tasca per la que ha sigut creat y la quantitat de memoria que necessita però hi ha altres recursos que també poden ser considerats a l'hora de millorar l'eficiència d'un programa, depenent de la seva naturalesa (espai que utilitza dins el disc dur, tràfic que genera dins al xarxa, etc.).
* Portabilitat. Un programa és portable quan té la capacitat de poder executar-se en una plataforma, ja sigui software o hardware, diferent a aquella en la que es va desenvolupar. La portabilitat és una característica molt desitjable per a un programa ja que permet, per exemple, a un programa que s'ha elaborat per al sistema GNU/Linux executar-se també a la familia de sistemes operatius Windows. Això permet que el programa pugui arribar fàcilment a més usuaris.

## Cicle de la vida del software

El terme cicle de la vida del software descriu el desenvolupament de software, des de la fase inicial fins a la fase final, incloent-hi el seu estat funcional. El propòsit es definir les diferents fases intermedies que calen per validar el desenvolupament de l'aplicació, és a dir, per garantir el softw
are compleixi els requisits per a l'aplicació i verificació dels procediments de desenvolupament. S'assegura de que tots els mètodes utilitzats siguin apropiats. Aquests mètodes s'originen en el fet que és molt car rectificar els errors que es detecten tard dins la fase d'implementació (programació pròpiament dita), o pitjor encara, durant la fase funcional. El model de cicle de la vida permet que els errors es detectin el més aviat possible i, per tant, permet als desenvolupadors centrar-se en la qualitat del software, en les dates d'implementació i en els costos associats. El cicle de vida bàsic d'un software consta de, almenys, els següents procediments.
* Definició d'objectius: definir el resultat del projecte i el seu paper en l'estratègia global.
* Anàlisi dels requisits i la seva viabilitat: recopilar, examinar i formular els requisits del client i examinar qualsevol restricció que es pugui aplicar.
* Disseny general: requisits generals de l'arquitectura de l'aplicació.
* Disseny detallat: definició precisa de cada subconjunt de l'aplicació.
* Programació (programació i implementació): és la implementació d'un llenguatge de programació per a crear les funcions definides durant l'etapa de disseny.
* Proba d'unitat: proba individual de cada subconjunt de l'aplicació per garantir que s'implementin d'acord amb les especificacions.
* Integració: per a garantir que els diferents mòduls i subprogrames s'integrin amb l'aplicació. Aquest és el propòsit de la proba d'integració i ha de ser acuradament documentada.
* Proba beta o validació: per garantir que el software compleix amb les especificacions originals.
* Documentació: es documenta amb tota la informació necessària, sigui funcional final per tots els usuaris del software (manual d'usuari), i de desenvolupament per a futures adaptacions, ampliacions y correccions.
* Manteniment: per a tots els procediments correctius (manteniment correctiu) i les actualitzacions secundàries del software (manteniment continu).
L'ordre i la presencia de cadascun d'aquests procediments dins el cicle de vida d'una aplicació depenen del tipus de model de cicle de vida acordat entre el client i l'equip de desenvolupadors. En el cas del software lliure es té un cicle de vida molt més dinàmic a causa que molts programadors treballen simultàniament desenvolupant les seves aportacions.

## Notes

* ↑ Kenneth E. Iverson, l'autor del llenguatge de programació APL, va creure que la hipòtesi Sapir-Whorf s'aplicava a llenguatges de programació (sense arribar a esmentar la hipòtesi pel nom). La seva conferència al Premi Turing, Notation as a tool of thought, va ser dedicada a aquest tema, argumentant que notacions més poderoses ajudaven a pensar en algorismes informàtics.

## Referències

* ↑ Marco Galindo, M. Jesús. Fonaments de programació ( PDF). Primera edició en llengua catalana, setembre 2008. ISBN 978-84-9029-535-9. OCLC 900796932.
* ↑ Graham, Paul. «Hackers and Painters» (en anglès), 2003. [Consulta: 24 octubre 2010].
* ↑ Iverson, Kenneth E. «Notation as a tool of thought» (en anglès). Communications of the ACM, 23, 8, 8-1980, pàg. 444–465. DOI: 10.1145/358896.358899. ISSN: 0001-0782.
* ↑ Turing, Alan. «On Computable Numbers with an Application to the Entscheidungsproblem» ( PDF) (en anglès). Arxivat de l'original el 2011-02-22. [Consulta: 13 novembre 2010].
* ↑ Downey, Allen. «How To Think Like A Computer Scientist» (en anglès). [Consulta: 14 novembre 2010].

## Vegeu també

* Portal de la Programació
* Enginyeria informatica
* Codi font
* Llenguatge de programació
* Programació estructurada
* Programació extrema
* Programació en parella
* Programació dinàmica
* Programació orientada a objectes
* Software o programari

## Enllaços externs

* Programar ordinadors