Ya señores, a partir de la encuesta del post anterior, podemos obtener las siguientes conclusiones, por lo menos siete personas leen el blog, lo que me parece una audiencia más que amplia pensando que escribo poco y siempre escribo lo primero que se me ocurre, de esas siete personas solo una lee el blog atentamente, ya que solo una me pide que deje de escribir, y cuatro personas indican que quieren seguir con el tema de lenguajes de programación… no se por que … pero bueno… como resultado de eso otro post más con el apasionante tema de los lenguajes de programación.

Bueno antes de los lenguajes propiamente tal, definiremos la máquina abstracta, que nos va a servir para entender como funcionan o trabajan los lenguajes de programación en general. ¿Qué es la máquina abstracta?, es una máquina que sirve como simplificación de un computador real, se le llama máquina abstracta porque no necesariamente tiene que ser electrónica ni ser una computadora, podría ser completamente mecánica (lo que sería muy cool y muy steam punk… yo me compraría una), y tiene las separaciones de los diferentes niveles de abstracción que debe tener una máquina, en el diagrama que sigue se muestra una máquina abstracta básica.

Máquina Abstracta

Como vemos la máquina está separada en tres grandes grupos, el grupo de la memoria, el grupo del interprete y el grupo de las operaciones, cada uno de estos grupos cumple una función diferente.

El grupo de la memoria, en una máquina real se puede asociar con la memoria RAM, pero es una simplificación de una cadena de tecnologías, ya que en la realidad se implementan dentro de la CPU niveles de cache para hacer más rápida esta extracción de datos y espacios en la memoria RAM reservados especiales, pese a que es una simplificación, se puede separar conceptualmente en dos, Datos y Programas, en los datos, se almacenan los elementos que se usan en el programa, variables primitivas que se están usando para alguna operatoria, clases, variables encoladas, etc. en los programas se guardan las instrucciones mismas a ser ejecutadas, los programas, esto es porque debe quedar almacenado en algún lugar ya que no se pueden ejecutar todas las instrucciones al mismo tiempo.

El grupo del Interprete es el corazón de la máquina abstracta, en un hardware real sería la CPU, igual que en lo anterior es una simplificación de una cadena de tecnologías ya que en general las CPU modernas implementan pipeline y más de un core para realizar este conjunto de acciones, nuevamente pese a que se simplifica podemos separarlo esta vez en tres partes, el controlador de secuencia corresponde a la pieza que se dedica a controlar y manejar la secuencia en la que se ejecuta un programa dentro de la máquina abstracta, decide en base a las variables del programa mismo como se ejecutan las secuencias y los loops del programa, esta pieza hace uso del Controlador de Datos, que es un elemento especial que se dedica a representar en formato binario los datos usados en un programa, como por ejemplo la representación de una variable entera, una variable string o incluso una instrucción del programa mismo a ser ejecutada posteriormente, además de esto esta pieza trabaja en conjunto con el Manejador de memoria, que es el que se dedica a utilizar la memoria, tanto utilizando espacio como dejándolo disponible, es la pieza que trabaja directamente con la memoria, tanto para los datos guardados como para las instrucciones del programa, extrayendo y guardando en memoria esta información.

Por último el grupo de las operaciones, en CPU real debería corresponder a una ALU, que es el lugar donde se realizan las instrucciones básicas que deben ser realizadas a nivel de máquina.

En un programa completo que suma dos números (de manera muy simplificada y solo para ver como interactuan) las variables que se van a sumar están en la memoria, en la parte de datos, la instrucción de suma en la memoria de igual modo pero en la parte de programas, el controlador de flujo le pide al manejador de memoria la próxima instrucción, el manejador de memoria entrega la instrucción se interpreta por el controlador de datos el control de flujo (luego de un milagro), le pide las variables para ser sumadas al manejador de memoria, luego de ser interpretadas por el controlador de datos este le entrega las variables al controlador de programas (no es tan así … pero bueno…) y este le entrega la información al grupo de operaciones para efectivamente realizar la suma.

Eso es básicamente una máquina abstracta, y si cree que es complicada y engorrosa… la verdad no sabe nada porque no puse ni la mitad de los pasos lógicos que se utilizan realmente para realizar la suma de dos números.

Eso, espero que les guste y que se entienda como trabaja por detrás un lenguaje de programación… a groso modo.