Es mostren els missatges amb l'etiqueta de comentaris história de la programació. Mostrar tots els missatges
Es mostren els missatges amb l'etiqueta de comentaris história de la programació. Mostrar tots els missatges

dimarts, 11 de maig del 2010

Petita, incompleta i majoritàriament incorrecta história dels llenguatges de programació.

Primer de tot, indicar que aquesta és només una traducció de l'original a data de 11/5/2010.

L'original es trova a: http://james-iry.blogspot.com/2009/05/brief-incomplete-and-mostly-wrong.html

1801 - Joseph Marie Jacquard utilitza unes quantes tarjetes perforades per fer que un teler cusi "hola món" sobre un tapís. Redditers del temps no es mostres impresionats, degut a la falta de recursivitat, concurrència o correcte ús de les majúscules.

1842 - Ada Lovelace escriu el primer programa. És obstaculitzada per el petit inconvenient de que no existeix cap ordinador on fer funcionar el seu codi. Arquitectes empresarials aprendràn posteriorment de les seves tècniques per tal de fer funcionar programes escrits en UML.

1936 - Alan Turing inventa tot llenguatge de programació que mai serà inventat, però és segrestat per el servei d'intel·ligència britànica per ser 007 abans de poder-los patentar.

1936 - Alonzo Church també inventa tot llenguatge de programació que mai serà inventat, però millor. El seu càlcul lambda és ignorat degut a que no és prou semblant a C. Aquestes crítiques continuen malgrat el fet de que C encara no ha estat inventat.

1940s - Diversos "ordinadors" són "programats" usant conneccions directes i switchos. Enginers ho fan així per tal d'evitar el debat de "tabulació" vs "espais".

1957 - John Backus i IBM creen FORTRAN. No hi ha res de divertit sobre IBM o FORTRAN. És un error de sintaxis escriure FORTRAN si no es du una corbata blava.

1958 - John McCarthy i Paul Graham inventen LISP. Degut als alts costos provocats per la exaustió post-guerra de la reserva estratègica de parèntesis, LISP no és mai popular [1]. Malgrat la seva manca de popularitat, LISP (ara "Lisp" o a vegades "Arc") continua sent un llenguatge influencial en "tècniques algoritmiques clau com la recursivitat i la condensació"[2].

1959 - Després de perdre una juguesca amb L. Ron Hubbard, Grace Hopper i altres sadistes inventen el "Llenguatge Orientat a la Capitalització de lo Repetitiu" (COBOL - Capitalization Of Boilerplate Oriented Language) . Anys més tard, en una malintencionada i sexista revenja contra la feina d'Adm. Hopper en COBOL, conferències de Ruby sovint contenen material misògin.

1964 - John Kemeny i Thomas Kurtz creen BASIC, un llenguatge desestructurat per a no-informàtics.

1965 - Kemeny i Kurtz go to 1964.

1970 - Guy Steele and Gerald Sussman creen Scheme. La seva feina porta a una série de documents "Lambda el Definiu" culminant en "Lambda el Definitiu Estri de Cuina." Aquest document científic es converteix en la base de una sèrie de llargs però inefectius anuncis de matinada. Les Lambdas són condemnades a un relatiu oblid fins que Java els fa populars no tenint-ne.

1970 - Niklaus Wirth crea Pascal, a un llenguatge procedural. Els crítics denuncien inmediatament Pascal perquè usa la sintàxi "x := x + y" en comptes de la més familiar estil C "x = x + y". Aquestes crítiques continuen malgrat el fet de que C encara no ha estat inventat.

1972 - Dennis Ritchie inventa una potent pistola que dispara endavant i enrere a la vegada. No satisfet amb la quantitat de morts i lisiats permanents que això causa, inventa C i Unix.

1972 - Alain Colmerauer dissenya el llenguatge lògic Prolog. El seu objectiu és crear un llenguatge amb l'intel·ligència d'un nen de 2 anys. Demostra haver aconseguit el seu objectiu mostrant una sessió de Prolog que respon "No." a cada pregunta.

1973 - Robin Milner crea ML, un llenguatge basat en la teoria M&M de tipus. ML engendra SML, que té una semàntica formal especificada. Quan és preguntat per una semàntica formal de la semàntica formal, el cap de Miller explota. Altres coneguts llenguatges de la família de ML són OCalm, F# i Visual Basic.

1980 - Alan Kay crea Smalltalk i inventa el terme "orientació a objecte" Quan és preguntat per què vol dir respon: "Els programes d'Smalltalk nomès són objectes." Quan és preguntat per de què estàn fets els objectes respon: "objectes". Quan és preguntat una altra vegada diu "mira, és objectes tota l'estona. Fins que arrives a les tortugues."

1983 - En honor a l'habilitat d'Ada Lovelace de crear programes que mai són executats, Jean Ichbiah i el Departament de defensa dels EEUU creen el llenguatge de programació Ada. Malgrat la manca d'evidència de que mai algun programa important en Ada és mai completat, els historiadors creuen que és un exitós programa públic que manté a milers d'empleats de defensa fora de les màfies.

1983 - Bjarne Stroustrup afegeix tot el que mai ha sentit a C per crear C++. El llenguatge resultant és tant complexe que els programes han de ser enviats al futur per ser compilats per la IA Skynet. Els temps de compilació ho pateixen. Els motius d'Skynet per fer aquest server són incerts, però un representant del futur diu "no hi ha res de què preocuparse, baby" amb un accent monotó austriac. Hi ha especulacions de que Skynet no és més que un pretenciós "buffer overrun".

1986 - Brad Cox i Tom Love creen Objective-C, anunciant "aquest llenguatge té tant la seguretat de memòria de C combinat amb l'electritzant velocitat d'Smalltalk." Historiadors moderns sospiten que ambdós eren dislèxics.

1987 - Larry Wall cau dormit i el front de Larry Wall topa amb el teclat. Després de llevar-se, Larry Wall decideix que la cadena de caràcters en el monitor de Larry Wall no és aleatòri, sinó un exemple d'un llenguatge de programació que Déu vol que el Seu profeta, Larry Wall, dissenyi. Neix Perl.

1990 - Un comité format per Simon Peyton-Jones, Paul Hudak, Philip Wadler, Ashton Kutcher, i Gent per el Tractament Étic d'Animals crea Haskell, un llenguatge funcional pur i no estricte. Haskell trova certa resistència degut a la complexitat d'utilitzar monads per tal de controlar efectes secundàris. Walder tracta de complaure els crítics explicant que "un monad és un monoide en la categoria dels endofunctors, quin és el problema?"

1991 - El programador holandès Guido van Rossum viatge a Argentina per a una operació misteriosa. Torna amb una gran cicatriu cranial, inventa Python, és declarat Dictador de Per Vida per una legió de seguidors i anuncia al món que "Només Hi Ha Una Manera De Fer-Ho." Polònia es posa nerviosa.

1995 - En un restaurant italià del barri, Rasmus Lerdorf descobreix que un plat d'espaguetis és la metàfora perfecte per entendre el "word wide web" i que les aplicacions web han d'imitar-ho. Al dors del seu tovalló dissenya el "Programmable Hyperlinked Pasta" (PHP). La documentació del PHP continua en aquell tovalló.

1995 - Yukihiro "Mad Matz" Matsumoto crea Ruby per advertir d'un vagament unespecificat apocalipsi que convertirà a Austràlia en un desert controlat per guerrers mohawk i Tina Turner. El llenguatge és després reanomenat Ruby on Rails per el seu inventor real, Davin Heinemeier Hansson. [La part sobre Matsumoto inventant un llenguatge anomenat Ruby mai ha passat i millor esborrar-la en la següent versió d'aquest article - D.H. Hansson].

1995 - Brendan Eich llegeix una llista de tots els errors fets dissenyant un llenguatge de programació, n'afegeix uns quants més i crea LiveScript. Després, amb la idea d'enganxar-se a la popularitat de Java el reanomena "JavaScript". Més després, per tal d'atrapar la popularitat de les malalties de la pell, el reanomena ECMAScript

1996 - James Gosling inventa Java. Java és un llenguatge de programació relativament redundant, estàticament tipat, de crida única i orientat a objecte amb herència única, però amb múltiple herència d'interfícies. Sun pregona la noblesa de Java.

2001 - Anders Hejlsberg inventa C#. C# és un llenguatge de programació relativament redundant, estàticament tipat, de crida única i orientat a objecte amb herència única, però amb múltiple herència d'interfícies. Microsoft pregona la noblesa de C#.

2003 - Un borratxo Martin Odersky veu un anunci de mantega de cacauet mostrant la crema de cacauet d'algú caient sobre el xocolata d'algú altre i té una idea. Crea Scala, un llenguatge que unifica les construccions tant dels llenguatges orientats a objecte com dels llenguatges funcionals. Això molesta a ambdós grups i tots declaren la Jihad.

Notes:
  1. Afortunadament per la informàtica, les reserves de claus d'ator i corxets són altes.
  2. Catch as catch can - Verity Stob

dimarts, 7 d’abril del 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 del 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 del 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