dimarts, 7 d’abril de 2009

História vertical de la programació II

Continua de Història vertical de la programació.

Resum:
Un ordinador, en la seva forma més bàsica, és una maquina mecànica (ejem electrònica, ejem) que llegeix una llista de instruccions i les executa. Tan simple com això.

Aquestes instruccions estan codificades en números, hi ha la instrucció 1, la 2, la 3, etc... que cada una fa una cosa determinada. Com que recordar la correspondència entre cada número i la seva corresponent instrucció és complicat, es varen inventar els ensambladors, que són uns programes que agafen paraules (mnemònics que corresponen a cada instrucció ADD per la suma, MUL per la multiplicació, etc...) i els converteixen al seu nombre corresponent.


L'evolució lògica fou trobar un llenguatge una mica més desenvolupat i abstracte de la màquina. Per exemple hi ha màquines on hi ha operacions complexes que en altres no tenen (A := A + C*D), o tenen un nom (nombre) diferent, etc... El llenguatge insígnia d'aquesta mena és el C.

C

C és un llenguatge que es va crear quan un grup de investigadors intentava crear un sistema operatiu que pogués funcionar sobre màquines diferents. Aquesta gen es va donar conte que era pràcticament impossible haver de fer cada vegada el mateix en el llenguatge ensamblador de cada un dels processadors, amb les seves limitacions, així que, agafant B com a referència [un llenguatge amb el mateix objectiu però força més simple] van crear un llenguatge i un seguit de programes que el traduïen a l'idioma concret de cada màquina. Així va néixer C, que va permetre la creació de Unix [EL sistema operatiu més influent de la història].

Paradigmes de la programació.

I aquí és on neixen els paradigmes de programació.

Què és un paradigma de programació? Doncs bona pregunta, amb difícil resposta. La meva seria alguna cosa així:

Un paradigma de programació és un seguit de estils i característiques que comparteixen uns llenguatges de programació que ajuden al programador a fer programes de manera més senzilla.

Bé, estic més o menys satisfet amb aquesta definició, però del tot obert a crítiques.

Hi ha, però, forces coses a destacar. La primera és que no existeix un paradigma millor que un altre, en principi. I dic en principi per què un cop analitzes el problema que busques solucionar n'hi ha de més adequats que d'altres. O sigui, cara paradigma és dissenyat amb un objectiu i per tal d'assolir-lo a agafat un seguit de característiques que el poden convertir en un problema en certes situacions.

Això fa que es puguin "adoptar" conceptes no natius del paradigma on es treballa per tal de millorar el programa que es fa, sempre i quan sàpigues què fas.

Finalment, és força freqüent que un sol llenguatge nadi entre varis paradigmes, fent servir característiques de cada un.

Ara us faig una llista amb els més importants i els seus pros i contres.

Paradigma imperatiu.
Aquest és el paradigma natural. Aquí el programador va manant pas a pas què és el que la màquina ha de fer (suma a i b i guarda-ho a c, després incrementa a en 1, ...).

Quan un llenguatge és imperatiu pur (com C o BASIC) les instruccions tenen una traducció si no directe, molt evident a ensamblador i és on es fan els programes més eficients (en quant a velocitat i/o memòria utilitzada), malgrat això es pagui amb la dificultat que suposa crear un programa de cert tamany amb aquest paradigma, ja que el programador necessita estar molt atent als detalls.

C n'és un bon exemple. Amb C ets capaç de controlar el que fa l'ordinador amb gran detall, això fa que es puguin magnificar els teus errors, ja que hi ha moltes operacions "estranyes" permeses. També es veu com un codi en C a partir de cert nombre de línies és quasi il·legible.


Paradigma Funcional (o declaratiu).
Aquí estem en l'extrem oposat al llenguatge imperatiu. Tu en un llenguatge funcional no li expliques a la màquina com ha de fer les coses, sinó què ha de fer.

Per a que ens entenem, un llenguatge funcional o declaratiu es vasa en un seguit de declaracions (de funcions o valors) a l'estil matemàtic. Així doncs, tu per calcular el factorial d'un nombre no li has de dir al programa "per calcular el factorial comença des de 1 i ves multiplicant cada vegada per un nombre més gran fins a arribar al nombre", sinó "el factorial del nombre és ell mateix multiplicat per el factorial del nombre anterior. El factorial de 0 és 1". D'aquesta manera el compilador té certa llibertat a l'hora de decidir com fer les coses, a vegades permetent-li agafar dreceres invisibles per al programador, i la forma de programar així és matemàticament molt més elegant.

SML, SQL, HTML són llenguatges declaratius.

Programació Orientada a Objectes.
La vaca sagrada de la programació moderna.

Explicaré amb més detall de què es tracta la programació orientada objectes en el següent tutorial, però de moment explico que en un programa orientat a objectes es tracta, principalment, de programar objectes.

Aquest paradigma està expressament dissenyat per a que sigui senzill, ja que acosta molt la programació a la manera de pensar humana. Dintre d'aquest programa es manipulen Objectes, cada un pertanyent a una certa Classe. Així, conceptualment, és senzill que si un objecte pertany a la classe Matriu i el multiplico per un objecte de la mateixa classe tindré un altre objecte de la mateixa classe, i que serà el resultat de la multiplicació de les anteriors.

Així doncs, el secret de la programació orientada a objectes radia en definir correctament les classes a les quals poden pertànyer aquests objectes i les seves possibles interaccions.

Aquesta facilitat però, té un cost. El primer, computacional: moltes de les característiques principals de l'OOP [Object-Oriented Programming] tenen un cert cost en temps i espai, encara que força reduït. L'altre és que el programador té certa responsabilitat de programar els objectes amb cura, ja que a vegades el posar noms comfusos i/o documentar incorrectament pot portar a seriosos problemes.

Java és un llenguatge orientat a objectes força complert (que també comparteix paradigma amb el imperatiu. C# és l'equivalent Microsoft a Java, i C++ és l'ampliació de C a l'orientació a Objectes (tot i que arrossega moltes de les característiques de C, cosa que el fa potencialment eficient i amb moltes bombes de rellotgeria internes si no es programa amb molta cura).

Altres: Ada, Eiffel, Python, Ruby...

Cap comentari:

Publica un comentari a l'entrada