En programación de pronto surgen ideas que tienen un potencial estupendo, el cual se va viendo con el pasar del tiempo. Una de estas ideas es la máquina de código-p, la cual es una máquina virtual, la cual ejecuta códigos binarios de un procesador hipotético, es decir, el diseñador, en lugar de usar el conjunto de instrucciones de un procesador como podría ser el Pentium, el 68000, el 6502, etcétera, utiliza una serie de códigos de un procesador que no existe en el mundo real, pero que se simula a través de un programa de computadora, es decir, de un intérprete que ejecuta las instrucciones de un programa en código-p o pseudo-código.

Ejemplos de máquinas virtuales son la de Java o el código precompilado de lenguajes como MatLab. Otro famoso ejemplo es la implementación de Pascal por la Universidad de California en San Diego, al cual denominaron UCSD Pascal y que fue relevante en los años 80s con las Apple II.

Lo interesante de una máquina virtual es que como genera un pseudo-código de una máquina que no existe, lo único que hay que hacer es escribir un intérprete que pueda ejecutarse en las diferentes plataformas. Es de hecho lo más cercano a cumplir el sueño de todo programador, que es «write once, run everywhere» (escríbase una vez, ejecútese en todas partes). De esta manera no hay que escribir por ejemplo, un compilador para un procesador específico, lo cual es una tarea compleja. En lugar de eso, basta con escribir un intérprete que ejecute las instrucciones de esta máquina virtual y eso es mucho más fácil.

Hay que decir que el concepto de máquina virtual corriendo un pseudo-código se invento alrededor del año 1966, en donde se definió algo que se llamó código-O para BCPL y P, lo que fue el código para el lenguaje Euler. El término código-p se remonta a principios de los años 70s. Dos compiladores que generaban código P fueron el compilador Pascal-P, en 1973, escrito por Nori, Ammann, Jensen, Hageli y Jacobi y el compilador Pascal-S, de 1975, escrito ni más ni menos que por el creador del lenguaje Pascal, Niklaus Wirth.

Los «compiladores» mencionados (incluyendo el de Java), generan un código-p el cual, como dijimos, es interpretado por un programa que simula ser una máquina virtual con el procesador hipotético que hemos definido.

Las ventajas saltan a la vista: un intérprete puede escribirse fácilmente, porque en general son pocas instrucciones que deben simularse. Es mucho más difícil generar código para un procesador comercial porque además, contiene muchas más instrucciones o modos diferentes de las mismas. El código-p no es dependiente del comportamiento de la computadora. Esto permite crear «compiladores» en mucho menor tiempo. Una máquina virtual en general es una máquina ideal, por lo que el código-p es con frecuencia mucho más pequeño que el mismo programa traducido a código binario de un procesador real.

Tal vez el mayor pero que se le puede poner al código-p es que es mucho más lento que el código nativo de un procesador real. Por otra parte, hacer ingeniería en reversa para reconstruir el código fuente es mucho más fácil en una máquina de código-p.

En los años 90s, la traducción a código-p se volvió muy popular como estrategia para implementar lenguajes como Python, código-p en Visual Basic y el bytecode de Java. Un ejemplo de las instrucciones de una máquina virtual de código-p puede verse aquí:

No necesariamente todas las definiciones e máquinas virtuales que ejecutan código-p son idénticas. De hecho, es probable que en muchos casos sean diferentes considerando las necesidades específicas de un proyecto. Sin embargo, si tomamos en cuenta la velocidad actual de las máquinas, las computadoras que corren código-p en máquinas virtuales ya no son exageradamente lentas con respecto a las que corren en código nativo y más aún, podría apostar que para cierto tipo de aplicaciones del uso cotidiano, no hay una diferencia abismal en velocidad de proceso. Desde luego, si se requiere hacer un programa que corra lo más rápidamente posible no habrá mucho más remedio que hacerlo en el ensamblador de una máquina real.

Referencias:

Wikipedia