diumenge, 26 d’abril de 2009

Programació Orientada a Objectes

Què és la programació orientada a objectes?
Per què s'usa tant?
Quines són els seus avantatges i els seus inconvenients?

Bé, aquests són alguns dels interrogants, no els únics, que espero contestar avui en aquest post.

Primer de tot, i per explicar què és la programació orientada a objectes, cal explicar els 3 principis fonamentals sobre el quals està construït.

I si expliques abans què punyetes és un objecte i què és una classe, com la gen normal?

Bé, jo volia...

Tu volies, tu volies, comencem per el començament:
Un objecte és una entitat construïda per un estat intern (atributs) i unes accions que pot fer (mètodes) per a canviar-los.

Bé, jo no ho hagués definit millor.

Gràcies :-D

Ehmmmmmmm doncs... per on anava?

Els 3 super-principis de la OOP.

Gràcies, és que perdo el fil.

En fi, aquí teniu els principis fonamentals de la OOP:
  • Encapsulament.
  • Herència.
  • Polimorfisme.
Estàs segur que existeix "encapsulament"?

No massa. Puc continuar?

Va, continua...

Doncs bé, la clau per a programar bé OOP és entendre aquests conceptes. Aneu amb compte, són gradualment més complexes, i cal que entengueu cada un bé abans de continuar.

Encapsulament [Abstracció]

A opinió meva, el atribut que menys importància se li dóna i, en canvi, el més important. Al ser el més senzill, hom acostuma a menysprear-lo lleugerament, també força moltes vegades que el programa sigui menys eficient, més lent, o que ocupi més. Si això és un problema, probablement hauries de pensar-te a moure't a un altre llenguatge, no a saltar-te el pilar principal del OOP. En tot cas aquí tenim:

L'abstracció es tracta simplement d'això: abstraure la implementació d'un objecte de la seva interfície.

Què vol dir això? Que no ha de fer falta MAI, PER A RES, saber com un objecte funciona internament per a poder-lo fer funcionar.

Saber com funciona un objecte ens dona, evidentment, avantatges: podem fer-lo servir millor, etc... però no ens hem de deixar temptar, abstraure correctament els objectes ens dóna moltes avantatges també, la primera de totes que deixem de dependre de com estigui fet.

I aquest és el salt que fa que la OOP funcioni tan bé. No us enganyeu, no és cap de les coses "guais" que fa (polimorfisme, sobrecarrega [que no mencionaré per què encara que pot facilitar la vida, el seu sobre ús la complica més que no ajuda, a més, no és una característica original i comuna del OOP], herència), sinó la capacitat de poder fer "d'acord, això funciona, continuem", i no estar-se sempre amb detalls.

Per a què ens entenem, a algú li fa falta saber com, exactament, funciona internament una radio per fer-la anar? El que el 99% (i pico) de la gen sap és, simplement, que quan l'engeguen i posen la freqüència que desitges sona la música que volen. I si necessitéssim saber fer anàlisi de Fourier i transformacions de Laplace per fer-les servir haurien tingut cap èxit les ràdios? Jo crec que no.

Resumint, un programador de OOP necessita, per fer servir un objecte, a quina classe pertany i què fa aquesta classe (no com ho fa).


Herència.

Una altra de les famoses característiques. Què és l'herència? Doncs el que el seu nom indica, que els fills hereten coses dels pares!

Què vol dir això?

Cada objecte pertany a una classe. Això és senzill d'entendre. Per tal de simplificar les coses, un pot definir una classe "Radio de Cotxe" i "Radio portàtil". Està clar que tant "Radio de Cotxe" com "Radio portàtil" tenen moltes coses comuns, entre elles, que són "Ràdios". Així, un hauria de repetir moltes coses de "Radio de Cotxe" a "Radio portàtil", per tal de simplificar això el que es fa és definir una classe "Radio" que és pare tant de "Radio de Cotxe" com de "Radio portàtil". Aquestes dues es comporten doncs, com "Radio" amb els seus matisos.

Això simplifica moltes vegades el codi, sobretot si se segueix la màxima de no repetir mai codi innecessàriament i tenir les coses sempre agrupades lògicament.

Polimorfisme.

El polimorfisme no és més que una petita volta al concepte d'herència.

Continuant amb l'exemple anterior, tant "Radio de Cotxe" com "Radio portàtil" són, a la vegada, "Radio"s. El polimorfisme s'aprofita d'aquest concepte i et permet usar un objecte de la classe "Radio de Cotxe" com si fos de la classe "Radio", i és que, en el fons, també ho és!

Com funciona això? Imaginem-nos que tens un programa que treballa tant amb "Radio de Cotxe" com amb "Radio portàtil". En un moment donat, necessites engegar un seguit d'aquestes ràdios. Pots crear un procediment que engegui primer totes les "Radio de Cotxe" i després les "Radio portàtil", o un que simplement agafi un seguit de "Radio" i les engegui totes, sense preguntar-se de quina mena de ràdio és exactament.

Potser les "Radio de Cotxe" són molt antigues, analògiques, mentre que les "Radio portàtil" són modernes i digitals i ambdues funcionen de formes força diferents. Malgrat tot, "engegar" és una cosa que poden fer totes les ràdios, i en totes es fa igual: prement el botó amb un triangle.


Bones pràctiques.

Hem vist, de forma genèrica, com funciona la OOP. Pròximament mirarem un cas concret, Java, però abans he de fer unes petites advertències.

Polimorfisme i herència donen eines molt potents i capaces de fer coses molt complicades. No caiguem en la temptació, cal sempre mantenir les coses el més simples possible per tal de seguir l'esperit de OOP: fer les coses senzilles. Un pot veure's temptat, per exemple, que quan un prem el botó d'engegar d'una ràdio faci una cosa diferent, que potser sembla adequada en una situació però (com el meu exemple vol demostrar) pot portar problemes de confusió, per molt bé que ho documentis.

I aquest és el problema que moltes vegades vé amb la sobrecàrrega de mètodes i operacions. Per tu pot semblar clar que quan multipliques 2 vectors et dóna la multiplicació element a element. Però algú pot interpretar que és la multiplicació vectorial, cosa que no és exactament el mateix, tot i donar un resultat similar (un altre vector).

Així que recordeu: amb un gran poder, bé una gran responsabilitat!

dimarts, 21 d’abril de 2009

El camí a Dortmund

Quantes coses cal fer per marxar d'erasmus...

Primer de tot, aquí és on vui marxar: mapa


Si, al costat de UniversitätstraBe (com es feien les ß? Ah, copia pega de la wikipedia...), veig com els alemans continuen posant nom a les coses amb la seva original originalitat (original de "que remunta a l'orígen", i originalitat de "Acte propi d’una persona original" on original és "Que no s’assembla als altres, que té quelcom d’estrany, de rar" [entengui's com a ironia]).

En fi, parres a part, que he de fer un munt de papers amunt i avall. I com que després em tornará tornar a buscar les coses per la caòtica web (que no està tant malament si la compares amb webs realment horribles d'universitats que ronden per Europa) una i una altra vegada.

En fi:

Curs estiuenc [mirar el máster de robótica, allà tindrás assignatures a convalidar]
Curs gratis d'alemany
Demanar places [abans del desembre, si pot ser]

Coses que falten: convalidar crèdits... je... je... je... jeeeeeje

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

dilluns, 6 d’abril de 2009

Epopeya a mitja llum

Com és semi-conegut, faig de programador amateur en diversos eternament inacabats projectes. L'últim en qüestió és JAL3D, una llibreria d'animació feta en Java.

Avui dia hi ha 3 maneres de programar en Java, i una d'elles no la considero decent:
  • Utilitzar javac, el compilador de línea de comandes, juntament amb kate/gedit/vim/emacs/notepad++ o el bloc de notes de torn (malgrat notepad++ sigui una entitat pròxima a divina, no puc considerar això una opció decent).
  • Utilitzar NetBeans, el IDE (Entorn integrat de desenvolupament) de Sun (els creadors de Java).
  • Utilitzar Eclipse, l'IDE de IBM.
Bé, no entraré a discutir per què faig servir Eclipse i no NetBeans, diguéssim que una raó és que el tenim a la facultat i punt.

En fi, per a passar les coses d'un ordinador a l'altre utilitzo el que se'n diu un repositori. Siguem sincers, no sé prou bé com funcionen els repositoris, així que explicaré el que sé: Són "bases de dades" on guardes els canvis que vas fent al teu projecte, de tal manera que ets capaç després de tornar enrere i de saber qui ha canviat què (i si afegeix un comentari al "commit", perquè).

Antigament, i per el meu projecte Aresource (projecte inacabat #N) feia servir un repositori de sourceforge.net que vaig aconseguir configurar per a que fes servir CVS. Ara, amb la nova versió de la forja, només aconsegueixo tenir SVN (SVN i CVS són els 2 programes principals de repositoris) i malgrat SVN sigui millor que CVS (no deixa de ser una mena de fork [separació del projecte, però continuant amb la feina feta] canviant d'arrels els problemes que arrossegava CVS des dels inicis) hi ha un gran problema: Eclipse no el du per defecte. I instal·lar plugins a l'Eclipse és dolor al forat del cul, com diuen els americans.

En fi, aquí teniu unes indicacions faciletes de seguir (comentaré coses, però si no voleu saber que feu, salteu-vos les explicacions) per tal d'instal·lar l'últim Eclipse a l'últim Ubuntu fins la data:

Eclipse Ganymede 3.4
Ubuntu Intrepid Ibex 8.10

  1. Descarregar-se Eclipse manualment. El que hi ha al repositori oficial d'Ubuntu és vell. No sé si és el 3.2 encara...

    1. Cal anar a la pàgina d'Eclipse [link] i descarregar-se aquell que posa "Eclipse IDE for Java Developers (85 MB)"
    2. És un zip, només cal descomprimir-lo i apretant 2 vegades a l'icona "eclipse" ja el teniu funcionant!
  2. Descarregar-se els paquets adequats de subversion per ubuntu. Atenció: al moment de escriure el post, la última versió de Subversion és la 1.6, mentre que a Ubuntu només hi ha fins la 1.5. AQUEST ha estat el principal problema que he tingut per a fer-ho funcionar. Us proposo 2 maneres:

    1. Utilitzar Synaptic. Al menú "inici" de Ubuntu: Sistema -> Administració -> Gestor de paquets Synaptic. Aquesta eina serveix per afegir programes al sistema [demanará la contrasenya de root]. En aquest cas ens toca buscar "subversion", "libsvn-java", "libsvn1". Apreteu amb el botó dret del ratolí sobre cada opció i assegureu-vos que estigui marcada. Després preneu "aplica". Aquesta via té l'avantatge que sabrem quina versió instalem (si 1.5 o superior)
    2. Utilitzar la línea de comandes: sudo apt-get install subversion libsvn-java libsvn1. Sudo és la comanda que indica "super usuari", així que ens demanarà el password de root (algun dia explicaré això de root, suposo). Aquesta opció no ens diu sempre quina versio instal·lem...
  3. Instalar Subclipse. Aquí ens haurem de pegar amb el sistema de plugins de l'Eclipse, i aquest és deixeble de Chuck Norris, esteu avisats!

    1. Tenint obert Eclipse, anar al menú Help -> Software Updates...(Perquè les actualitzacions són a "Help"??????)
    2. Se'ns obre una finestra. Anar a la pestanya "Avaliable Software"
    3. Afegir una pàgina de plugins: "Add Site" -> "http://subclipse.tigris.org/update_1.4.x" ////// "http://subclipse.tigris.org/update_1.6.x"
    4. Obrir les opcions del que acabem d'afegir, activar "subclipse" i prémer "Install".
    5. ATENCIÓ!!!!!!!!! subclipse 1.6 necessita subversion 1.6. Què vol dir? Que aquí no explico com instal·lar el 1.6 perquè només sé instal·lar el 1.5 que és el que vé al repositori d'Ubuntu. Espero que això canvii d'aquí poc, però mentrestant, aneu amb compte i instaleu-vos subclipse 1.4 per anar sobre segurs. Sinó us tocarà desinstalar el 1.6 i instalar el 1.4, com vaig haver de fer...

Bé, espero haver estat d'ajuda per algú, si mes no per a mi mateix, que segur que em carregaré l'ordinador qualsevol d'aquests dies sense voler i necessitaré això per no perdre una altra tarda maleint Eclipse...

dijous, 2 d’abril de 2009

História vertical de la programació.

Bé, això pretén ser una introducció a la programació. Els conceptes bàsics i que ningú es molesta a explicar: d'on surten les coses que hi ha avui dia i per què són així.

Turing i Von Neumann

Al principi de tot hi ha la màquina de Turing... però això és molt molt molt enrere en el temps. Això, de fet, és de la segona guerra mundial. La màquina de Turing és una màquina "teòrica" que compleix certes característiques matemàtiques i és capaç de resoldre problemes NP-Complets donats temps i memòria ilimitats.

Parres a part, el que ens interessa és que existeix un model de màquina que resol problemes matemàtics: aquest fou l'invent i contrivució de Turing. La veritat és que el que és la màquina de Turing és una cosa complicada, per això ens la saltem i passem al que és la salsa en sí: un ordinador amb una arquitectura Von Neumann.

Vaig massa a saco? M'ho sembla a mi? Estic parlant d'história, no és realment important saber tot això per saber programar, però va bé tenir una mica de cultura general, i ara ja teniu paraules per buscar a la Wikipedia, així que us deixo el trevall per a vosaltres. El que si que explicaré és l'arquitectura de Von Neumann. Simplement perquè, malgrat avui dia s'hagi evolucionat, els ordinadors continuen funcionant igual. O al menys, comportant-se igual.

Von Neumann en sério

Un ordinador amb arquitectura Von Neumann té la següent estructura:
  • Una memòria.
  • Uns dispositius d'entrada/sortida (teclat, pantalla, modem, etc.......)
  • Un processador.
L'element més important és el processador, que s'explica també ràpid. Té els següents elements:
  • Registres (llocs on guardar dades)
  • "Una" unitat de control
  • "Una" ALU (unitat aritmetico-logica)
Bé. Comencem a explicar els conceptes:
  • ALU. Una màquina de fer càlculs. Tu li fas entrar numeros per una banda i un codi dient-li què n'ha de fer amb aquests nombres i la ALU treu la operació feta per l'altra banda. Evidentment, només pot fer operacions senzilles: sumar, restar, multiplicar, -dividir-, comparar dos nombres (i dir quin és el més gran o si són iguals) i m'atreviria a dir que amb aixó n'hi ha prou.
  • Unitat de control: el cerbell de la màquina. Aquesta és la que dirigeix la màquina i controla les coses. Com ho fa? Més senzill del que ens pot semblar. Llegeix una instrucció d'un dels registres (un especial) i la executa. Què vol dir executar una instrucció? En general, hi ha poques variants:
    • Llegir una dada de la MEMÒRIA i desar-lo en un registre
    • Llegir una dada d'un registre i guardar-lo a la MEMÒRIA
    • Agafar dades de registres i fer una operació a la ALU, guardant el resultat en un registre
    • Moure dades dels dispositius d'entrada als registres
    • Moure dades dels registres als dispositius de sortida.
    Vistes les operacions bàsiques, ja no sembla gran cosa, veritat? Simplement el que es fa és "codificar" cada instrucció amb un número i quan la Unitat de Control llegeix aquest número l'executa.
Fàcil, no?

Com funciona, un trasto així?

Tu li poses a la memòria un programa. Què és un programa? Doncs un programa té 2 parts principals: Dades i Instruccions. En general, posaràs a la memòria aquestes parts en 2 zones separades, per tal de no liar-la massa. Un cop has posat el programa a la memòria, li poses "play" i la màquina comença:
1 - Li dones on de la memòria comença el programa. Aquest numeret es guarda en un registre que s'anomena PC, de Program Counter, o contador del programa.
2 - La unitat de control agafarà la instrucció que hi hagi al lloc de la memòria que li digui el PC i se la posarà al seu registre.
3 - Incrementarem el PC, per tal de que "apunti" a la seguent instrucció.
4 - La unitat de control executarà la instrucció que li digui el seu registre i tornarem al pas 2.

Molt bé. Ara tenim una màquina que executa un seguit de instruccions i acaba, probablement, deixant un resultat a la pantalla (dispositiu de sortida). Falta, però un element important. Qué passa si la feina que hem de fer és una mica més complexa que seguir passos un rere l'altre? Si hem de prendre "decisions"? Necessitem un tipus d'instrucció que no hem mencionat fins ara: la instrucció de "salt".

Aquesta instrucció és també senzilla: Simplement, hem de canviar el nombre que hi ha al PC per el que nosaltres volguem per tal que la següent instrucció que la nostra màquina executi no sigui exactament la següent en la memòria, sinó la que nosaltres volguem. A més aquest salt es pot fer condicional. Vol dir, podem comprovar 2 nombres, i si un és més gran que l'altre, saltar i si no ho és, continuem com anàvem.

I per què sapigueu tot només falta explicar la pila d'execució però... no cal. És complicat i tampoc afegeix res essencial, simplement fa certes coses una mica més senzilles i no deixa de ser una mena de salt complicat.

O sigui, ens saltem aquest troç i avancem al llenguatge ensamblador.

O passem abans per el "codi binari"?

Codi Binari 101

Tothom sap que existeix aquest "codi binari", però qué és? Doncs no és res més que una altra manera de contar. M'explicaré. Nosaltres tenim 10 nombres diferents. És per això que fem servir nombres decimals. Conceptualment ho tenim molt senzill: començem amb el 0, després el 1, 2, 3 i fins al 9. Quan no en tenim més, afegim un 1 al principi i tornem a començar, quan ens tornem a quedar sense, sumem un nombre al principi i au!

El codi binari és exactament el mateix, però amb només 2 nombres: el 0 i el 1. Així els primers nombres són: 0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111 que és el 15.

Matemàticament, podem veure que cada dígit incrementa exponencialment el seu valor quan més a l'esquerra és.

En decimal, 1.234 val 1 * 10^3 + 2 * 10^2 + 3 * 10^1 + 4 * 10^0 = 1000 + 200 + 30 + 4
En binari, 1101 és 1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1*2^0 = 8+4+1 = 13

Bé, ara es veu clar que el binari no és altra cosa que contar d'una altra manera. Desmitificar és important. Lletres? Assignem lletres arbitrariament a nombres i hem acabat. L'ASCII és la base de quasi tot el que es fa servir. Wikipediejeu.

I per què binari? Simple: fer operacions en binari és relativament fàcil. En el sentit de fer circuits elèctrics que sumin i restin nombres binaris. Què vol dir, sumar i restar nombres binaris? En un ordinador actual, agafar una ristra de cables, que representen 1ns i 0s estàn encesos o apagats, i fer que una altra ristra de cables s'ensenguin o apaguin en conseqüència.

Llenguatge màquina, llenguatge ensamblador.

Què tenim? Una màquina que va agafant nombres, els interpreta (hem construit la màquina de tal manera que sapiguem quin número vol dir quina operació) i fa operacions. A més aquesta màquina és capaç de llegir nombres que li donguem (cada vegada que apretem una tecla, li estem enviant un nombre, ell ja sap quina tecla és per el nombre que llegeix) i tornar-nos nombres en conseqüència del que digui el programa.

Bé, podem escriure programes directament en els nombres. És una matada que es coneix com a llenguatge màquina. Saber quin número correspon a quina instrucció és complicat i el que és pitjor, canvia amb una facilitat esferaidora de màquina a màquina. No és practic. Per què no fem una cosa? Creem un programa que llegeixi unes certes paraules i les converteixi a llenguatge màquina. No hauria de ser molt complicat; només cal que vagi llegint caràcter a caràcter (nombre a nombre, li assignem una lletra arbitràriament a cada nombre) i quan en tingui uns quants sabrà quina paraula li estem demanant, ergo, quina instrucció volem que faci, i "escrigui" aquesta instrucció a la sortida. I que aquest programa vagi repetint el procés i... ja tenim un ensamblador!

No ens enganyem, el llenguatge més bàsic de programació és el llenguatge màquina. Però com que no li tenim respecte i el llenguatge ensamblador no és més que una traducció directa d'aquest a un idioma "comprensible", l'obviarem i direm que el llenguatge ensamblador és el més bàsic.

Aquest llenguatge ensamblador té l'avantage de ser més fàcil de trevallar-hi i més fàcil de recordar les instruccions, però continua arrossegant problemes del llenguatge màquina. Entre elles, la dependència amb la màquina. Què passa? Màquines similars tenen llenguatge ensamblador similar, i no és gaire difícil passar d'un a altre, al menys, no tant com amb llenguatge màquina.

Compiladors

Per saltar-nos el problema de haver de programar cada vegada les coses per cada màquina on les volguem fer servir vàrem inventar el què s'anomena llenguatges de 3a generació [màquina = primera, ensamblador segona]. Aquests llenguatges són una mica més complexos que l'ensamblador i tenen una sintaxi força més complicada, però en el fons són tot instruccions del mateix tipus i amb poques coses bàsiques. Aquests llenguatges (el més important, el C, però no és pas el primer que va aparéixer, ni molt menys) es passen a ensamblador normalment abans de ser passats a llenguatge màquina per uns programes anomenats compiladors. Aquests compiladors són programes certament més complexos que els ensambladors, doncs no és una traducció directa i moltes vegades canvien el codi per, tot i acavar fent el mateix, ho facin millor que com originalment es feia.

I fins aquí aquesta primera part de la história de la programació. Espero haver estat entenedor i rebre algún comentari amb opinions, preguntes, etc...

Próximament les evolucions a partir de C; paradigmes de programació (funcional, orientat a objectes, scripts, etc...)

continua en História vertical de la programació II