En 1936, Alan Turing publicó un trabajo en Londres llamado “On computable numbers, with an application to the Entscheidungsproblem” tratando sobre la duda matemática sobre si es posible encontrar un método que indique, para cualquier sentencia matemática, si esta es cierta o no.
Curiosamente el señor Turing, sin saberlo, abrió las puertas a la Sociedad de la Información y a toda la revolución social y tecnológica en la que la humanidad, en su conjunto, está actualmente inmersa.
Y cimentó las bases teóricas de una futura profesión, más cercana a la magia que a la ciencia: el desarrollador de aplicaciones informáticas.
La máquina de Turing
Cojamos una cinta plana infinita de papel, dividamosla en celdas por medio de líneas. Pongamos un dispositivo que pueda leer o escribir el contenido de dichas celdas. Digamos que el contenido de ellas son símbolos de un lenguaje finito, más un símbolo para representar un espacio en blanco. Digamos que este dispositivo puede mover la cinta, o moverse el, una sola celda a izquierda o derecha.
Como hemos dicho, el dispositivo puede leer el lector, pero además puede acceder a una tabla de estados y de acciones. Por ejemplo: si en la celda actual leo la letra A, y estoy en el estado “Primera Lectura”, escribo el símbolo espacio y muevo el dispositivo a la celda de la derecha.
Fíjate que el concepto parece extraordinariamente simple… pero es la base de la informática actual. De hecho, está demostrado matemáticamente que con esta máquina podrías completar cualquier algoritmo computacional, en un tiempo finito. Aunque pudiera ser más bien largo.
La siguiente evolución lógica de este juego matemático fue la definición de una Máquina de Turing que en vez de computar el alfabeto finito que hemos definido, lo que procese son otras máquinas de Turing. Llegando a la idea de la Maquina de Turing Universal y al primer acercamiento al concepto de Sistema Operativo, en donde un programa puede controlar a otros programas.
A partir de este punto la ciencia de la algorítmica computacional ha ido evolucionando y desarrollándose en una continuidad que llega a nuestros días, en un crecimiento exponencial en complejidad y profundidad.
Lenguaje binario y código máquina
Al principio de las computadoras, estás ocupaban una gran habitación con miles de tubos de vacío, relés y cables de conexión.
La llegada del transistor y de los diodos de estado sólido permitió ir disminuyendo el tamaño y aumentando la potencia del hardware. Hasta que, a principios de los años 70 del siglo XX se llega al microprocesador, el corazón de los ordenadores actuales y del futuro cercano.
Los semiconductores que componen los micros, configuran un complejo entramado de puertas lógicas que funcionan entre dos estados; dejando pasar la electricidad o bloqueándola. Así se define entonces el lenguaje de información básico de todos los ordenadores actuales: el binario, compuesto por unos y ceros.
En 1945, John von Neumann, desde el mismo laboratorio de donde salió la primera bomba atómica, publica la descripción de una arquitectura de construcción de computadores que aún es la base de toda la industria de hardware. Esta arquitectura está dividida en una CPU (ULA y UC), una memoria principal y un sistema I/O, todo ello comunicado por un Bus de Datos.
El mayor inconveniente de la arquitectura Von Neumann, y que aún no ha sido resuelto de forma completa, es el cuello de botella que se forma en el Bus de Datos entre la memoria, la CPU y los dispositivos I/O. Por lo cual los primeros programas informáticos basados en microprocesadores, buscaban la manera más eficiente de transmitir la información a través de este punto crítico.
Como la escritura de inmensas ristras de uno y ceros es algo muy dificultoso y tedioso, los microprocesadores actuales permiten utilizar el llamado lenguaje máquina, que son conjuntos de instrucciones que han sido grabadas de forma física en el dispositivo para poder ser invocadas desde la pila de ejecución y así evitar el tener que bajar al nivel del lenguaje binario, que es, finalmente, el que utiliza la unidad de cómputo.
Esto sigue siendo una forma muy ardua y costosa de programar, pero es cuando se obtienen los mayores rendimientos de un microprocesador y cuando tenemos a nuestro alcance el convertirlo en un ardiente recuerdo si hacemos mal las cosas.
Recapitulando
Para dar por finalizado este primer capítulo de iniciación básica a la programación, quiero dejar claro los conceptos básicos que todo programador debe de conocer: * Toda la programación, finalmente, es secuencial y en código binario. * La capa de código máquina, que está por encima del punto anterior, permite obtener los mejores resultados sobre un procesador pero con un alto coste de creación y mantenimiento. * El Sistema Operativos es, muy básicamente, el programa que controla a los programas. * Las maravillas tecnológicas que tenemos a nuestro alcance como herramientas de trabajo o de ocio, son el resultado de la suma de muchas pequeñas genialidades.
En una próxima entrega entraré en los fundamentos básicos que componen todo lenguaje de programación como son las variables, las iteraciones y los condicionales.
Espero que sea de utilidad,
Imágenes | Wikipedia en Español En GenbetaDev | Alan Turing, padre de la informática moderna y paria social