Archive for the 'Opinión' Category

La paradoja de la máquina virtual y el interprete

Nota: durante todo el artículo se habla de máquina virtual de proceso, es decir, por ejemplo, la de Java, no de sistema, por ejemplo, VirtualBox.

Hace tiempo, estaba hablando con un amigo, y hablando hablando, se de pronto nos surgió una paradoja, que nos dejó de piedra…

Todo empezó cuando uno de los dos (no recuerdo cual) dijo que no era lo mismo una máquina virtual, que un interprete, y el otro, le contestó: claro que no, joder, eso es de informática básica, por dios.

Pero se hizo el silencio, ambos estábamos buscando rápidamente en nuestra cabeza una diferencia clave, una diferencia demoledora entre máquina virtual e interprete, pero no dábamos con ella, dimos con algunas, evidentemente, pero todas, nos dimos cuenta enseguida, o bien eran diferencias entre implementaciones concretas, por ejemplo, entre la VM de Java y el interprete de PHP, o bien eran diferencias filosóficas, en plan: la VM está pensada para ser…

Tras un rato de silencio, uno de los dijo:

¿Y cual es la diferencia técnica de base, entre una máquina virtual, y un interprete?

La pregunta sonaba de los mas absurdo, ambos sabíamos perfectamente lo que es un compilador, un pre-compilador, etc, vaya, no era un problema de falta de conocimientos en ese ámbito, pero notábamos que algo fallaba…que no dábamos con esa diferencia de base, que diferencia cosas que todo informático, sabe que son como la noche y el día.

Tras pensarlo un rato, yo dije: está claro! La máquina virtual ejecuta código medio, mientras que el interprete procesa código de alto nivel. Es decir, uno procesa código de bajo nivel, y otro de alto nivel. Pero mi amigo enseguida desmontó mi teoría hablando de Javascript.

Los interpretes de javascript, por como funcionan, son llamados máquinas virtual, por ejemplo:

http://code.google.com/p/v8/

Se puede leer claramente como google se refiere a su V8 como VM (virtual machine).

Bueno, entonces si ambos pueden procesar el mismo tipo de código, que diferencia hay?

Tras pensar un rato, mi colega dijo: la VM está pensada para abstraer al programa del hardware, y yo contesté: y PHP no? y perl no? Es exactamente lo mismo.

Durante mucho rato, fueron surgiendo ideas e ideas, pero todas, eran diferencias filosóficas, diferencias entre cierto interprete, y cierta VM…pero nunca algo genérico, aplicable a cualquier VM.

Al llegar a casa, fui a wikipedia, a sentir como si volviese a estudiar informática de nuevo, y abrí la siguiente página en el navegador:

http://en.wikipedia.org/wiki/Virtual_machine#Process_virtual_machines

Y leo la siguiente frase, muy interesante: Process VMs are implemented using an interpreter;

Según la wikipedia, lo que sucede es que una VM utiliza internamente un interprete, es decir, una VM es un interprete, y algo mas, veamos que mas:

A process VM, sometimes called an application virtual machine, runs as a normal application inside an OS and supports a single process

Eso, se puede aplicar al interprete de Python, de perl, etc.

It is created when that process is started and destroyed when it exits.

Vale, igual que el interprete de python o php.

Its purpose is to provide a platform-independent programming environment that abstracts away details of the underlying hardware or operating system, and allows a program to execute in the same way on any platform.

Vale, como TCL, por ejemplo, que es un interprete. O cualquier otro interprete, vaya.

performance comparable to compiled programming languages is achieved by the use of just-in-time compilation.

Vale, tal como hace python, no? los famosos .pyc

Después de todo esto, al final llegamos a la siguiente conclusión: no existe una diferencia técnica entre máquina virtual de proceso e interprete, es una diferencia de concepto, es decir, quien hace una VM, tiene una forma de pensar, y quien hace un interprete, otra, y eso, se refleja en el resultado final, pero como conceptos base, no encontramos diferencia.

Aprovechando una charla con un developer de mono, mi colega le preguntó sobre esta paradoja, que parece algo evidente, pero que no conseguimos resolver, y no nos dejaba vivir, el developer, tras pensarlo un buen rato, nos dijo que la diferencia era en como finaliza un interprete, y como finaliza una máquina virtual, al finalizar, la máquina virtual puede no finalizar (a diferencia de lo que nos había dicho wikipedia) y el interprete debe finalizar.

Pero esto no nos convencía, es algo mas de implementación que de concepto, y podría existir un interprete que no finalizase, sino esperase mas scripts para ejecutar.

Al final, comido por las dudas, viví agobiado un tiempo, hasta que un día, di con la respuesta, y era bastante tonta, ciertamente.

Una vez con la respuesta, se me ocurrió una idea, llevar la pregunta al meneame (craso error):

http://meneame.net/notame/jcarlosn/119061

Y un par de usuarios, tal como me esperaba, ante lo evidente que parece la pregunta en primera instancia, me tacharon de ignorante, de no saber lo que era un compilador, etc etc…pero a la hora de dar una respuesta, me dieron la siguiente: Una máquina virtual ejecuta código intermedio, no entendible por el ser humano, mientras que un interprete ejecuta código de alto nivel, entendible por el ser humano.

Esta respuesta se cae por su propio peso, en primer lugar, eso depende de la implementación de VM, por ejemplo, la V8 de google, incluida en chrome, ejecuta código javascript, de alto nivel, en segundo lugar, para procesar el MSIL, por poner un ejemplo, la plataforma .net, utiliza un interprete, eso es evidente.

Al final, después de mucho dolor de cabeza e intrigas, tengo una bonita paradoja que me sirve para diferenciar a informáticos que van de superdioses, de la gente que realmente sabe.

Siempre que he hecho está pregunta a un desarrollador de algún proyecto de software libre, se lo ha pensado, a contestado, y alguno, ha dado en el clavo, mientras que siempre (al menos de momento) que se la he hecho a un estudiante o joven informático español, se ha réido de mi, me ha descalificado, se ha reído de la pregunta, pero finalmente, no la ha contestado.

De hecho, otro dato curioso de la paradoja, es que de momento el 100% de los preguntados estudiantes de informática españoles, responden asumiendo que hablamos de la VM de Java, enhorabuena a los de marketing de SUN. 🙂

Por cierto, una nota para que nadie se ofenda, no quiero decir que ningún estudiante de informática español pueda contestar esto, sino que yo he tenido una mala experiencia 🙂

Anuncios

Richard Stallman critica el cloud computing

Bueno, sintiéndolo mucho, y por culpa de que el trabajo me tiene demasiado ocupado, tengo que intercalar un post de opinión (yo prefiero los posts con código, los posts prácticos) antes de publicar la versión 1.1 del img2xhtml, una pena.

El caso es que según leo en meneame, Richard Stallman advierte que el Cloud Computing es una trampa.

Se conoce como cloud computing, dicho de una forma generalizada, al hecho de que la computación reside en internet, en algún sitio externo a la organización, y se consume en forma de servicio, ejemplos de esto lo tenemos en Amazon EC2, pero como mis dotes explicativas acerca de estos términos tan modernos y cools, son muy limitadas, si no sabéis lo que es cloud computing, os recomiendo este artículo y este otro.

Pero volviendo al tema de que Stallman crítica el cloud computing, y lo tacha de trampa, la verdad es que no me extraña demasiado, se veía venir de lejos.

El Cloud computing está atacando de lleno al software libre, como muchas otras cosas entorno a la web 2.0, y que nadie se escandalice cuando digo esto.

Si bien mucha gente desarrolla cosas entorno a la filosofía o estilo (o moda) de la web 2.0, y además lo hace usando software libre, y compartiendo luego sus desarrollos con la comunidad, existen muchos otros casos, como fresqui, en el cual, alguien coge un drupal (software libre), lo modifica, crea un nuevo producto en base a un producto libre, pero nunca comparte los cambios, ni enriquece a la comunidad: recibe, pero no devuelve nada.

Si bien la licencia de drupal (tristemente) permite hacer esto, es éticamente reprochable, y la realidad, es que no es raro que en la web 2.0 exista mucha gente que sigue esa tendencia: la mayoría de webs 2.0, incluso usando software libre, no son libres, estás obligado a consumirlas como servicio.

Y el cloud computing no es mas que la máxima expresión de todo esto, en lo que todo es un servicio, en el que el usuario va viendo recortado no solo su libertad, sino también su control sobre los datos que maneja.

Pero bueno, es solo una opinión, esto también depende mucho de lo que pase en los proximos años, y de muchos otros factores, aunque así de entrada, el cloud computing no me inspira confianza, y comparto la idea de Richard Stallman.

Por cierto, como ejemplo de webs 2.0 que comparten la filosofía del software libre, para demostrar que no es algo contradictorio, pondría a meneame, sin lugar a dudas, y a eyeOS.

Ambos son servicios que todos sus competidores son software privativo, salvo ellos.