Crea tu propio lenguaje de programaciĆ³n (I)

La evoluciĆ³n de los lenguajes de programaciĆ³n

DespuĆ©s de escribir el primer artĆ­culo sobre cĆ³mo crear tu propio sistema operativo, alguien me dijo que si podĆ­a hacer un artĆ­culo sobre cĆ³mo crear un lenguaje de programaciĆ³n. Al principio no hice mucho caso, pero ahora y por otros caminos he aprendido bastante mĆ”s sobre la creaciĆ³n de los lenguajes de programaciĆ³n. AsĆ­ pues, vamos a hacer un lenguaje de programaciĆ³n bĆ”sico, fĆ”cilmente empotrable en otros programas y que funcione con una mĆ”quina virtual que tambiĆ©n diseƱaremos. Hoy nos toca hacer la mĆ”quina virtual mĆ”s bĆ”sica.

Probablemente te preguntes: Ā«Āæuna mĆ”quina virtual? ĀæPero eso no es muy difĆ­cil y ademĆ”s ralentiza los programas?Ā» Al contrario, una mĆ”quina virtual simple es muy sencilla y relativamente rĆ”pida. He elegido Rust como lenguaje para la mĆ”quina virtual. Pero, ĀæquĆ© es Rust?

Rust es un lenguaje de programaciĆ³n que estĆ” enfocado en la seguridad en las ejecuciones, asĆ­ que utilizĆ”ndolo serĆ” prĆ”cticamente imposible que alguien consiga cerrar la mĆ”quina virtual. Es un lenguaje compilado en desarrollo creado por Mozilla. Servo, el sustituto de Gecko, se estĆ” desarrollando en Ć©l. TodavĆ­a puede cambiar su sintaxis pero el cĆ³digo que voy a usar va a mantenerse hasta la primera versiĆ³n estable.

Rust se instala en Linux de manera sencilla. Sin embargo, no hay paqueterĆ­a oficial. Los usuarios de Ubuntu pueden agregar estos dos PPA: ppa:hansjorg/rustĀ  y ppa:cmrx64/cargo, los usuarios de Arch pueden usar AUR (cargo-git es el paquete que instala todo). El resto pueden usar:

curl -s https://static.rust-lang.org/rustup.sh | sudo sh

ĀæCĆ³mo funciona una mĆ”quina virtual?

Si sabes como funciona el mundo en ensamblador es exactamente igual, con el stack o la pila. Si no, te lo explico. ImaginĆ©monos el siguiente cĆ³digo:

print 2+3

El ordenador no entiende lo que significa 2+3, ni tampoco sabe quĆ© orden hay que seguir. Los ordenadores funcionan con pilas o stacks en los que se van acumulando datos y se van sacando continuamente. Ese cĆ³digo en nuestra mĆ”quina virtual deberĆ­a ser algo parecido a esto:

PUSH 2
PUSH 3
ADD
PRINT

BĆ”sicamente, pondrĆ­amos el 2 en la pila en lo alto, el 3 tambiĆ©n. ADD sacarĆ­a (es decir, lo elimina de la pila y obtiene su valor) los 2 Ćŗltimos elementos de la pila y aƱadirĆ­a el resultado en lo alto de la pila. PRINT cogerĆ­a el Ćŗltimo elemento de la pila y lo usarĆ­a para mostrĆ”rnoslo. Ahora hagamos eso en Rust.

Primeramente deberemos definir un lenguaje para el Bytecode, podrƭamos usar uno ya existente como el de Java o el CLR de .NET/Mono, pero vamos a crear nosotros uno mƔs bƔsico.

https://gist.github.com/a01de8904fd39a442c20

Usamos notaciĆ³n hexadecimal para cada instrucciĆ³n. En lo alto hemos puesto #[deriving(FromPrimitive)], es una particularidad de Rust y nos servirĆ” para mĆ”s tarde poder comparar la enumeraciĆ³n con bytes directamente.

Ahora debemos hacer una funciĆ³n que ejecute cada una de esas instrucciones. Para ello debemos leer un byte y compararlo con las instrucciones que tenemos en la enumeraciĆ³n. Si se encuentra alguna que exista se debe ejecutar su acciĆ³n.

https://gist.github.com/8950ce212a2de2f397f9

Eso hacemos para leer cada byte individualmente y para ejecutarlas:

https://gist.github.com/12e24a1f0dd65e4cd65d

Como vƩn, diferenciamos si antes se nos dio la orden de PUSH (nuestra orden INTEGER), el siguiente byte serƔ llevado completamente a la pila. Ahƭ estamos usando dos funciones que no les he enseƱado, self.pop() y self.push(), que se encargan obviamente de manejar el stack.

https://gist.github.com/54147f853a8a2b8c01d9

No son muy complejas, pero la funciĆ³n de pop tiene mecanismos de detecciĆ³n de errores. De hecho, en Rust, si quitĆ”semos esos mecanismos nos darĆ­a un error de compilaciĆ³n. Ahora simplemente debemos llamar en un programa a Perin (nuestra mĆ”quina virtual) y que ejecute un bytecode.

https://gist.github.com/99b1ab461318b3a644d0

Ese bytecode puede ser leĆ­do de un fichero, pero aquĆ­ para simplificar lo he almacenado en una variable. Si lo ejecutamos nos darĆ” el resultado esperado:

Perin v0.1
Perin VM executes FlopFlip bytecode
Starting PerinVM instance
PerinVM v0.1.0
Integer value 5

Todo el cĆ³digo estĆ” disponible en GitHub bajo la Apache License 2.0: https://github.com/AdrianArroyoCalle/perin. Para compilar deben tener Cargo instalado y poner:

cargo build && ./target/main

En el siguiente capĆ­tulo veremos mĆ”s sobre nuestro lenguaje de programaciĆ³n.


Deja tu comentario

Tu direcciĆ³n de correo electrĆ³nico no serĆ” publicada. Los campos obligatorios estĆ”n marcados con *

*

*

  1. Responsable de los datos: Miguel Ɓngel GatĆ³n
  2. Finalidad de los datos: Controlar el SPAM, gestiĆ³n de comentarios.
  3. LegitimaciĆ³n: Tu consentimiento
  4. ComunicaciĆ³n de los datos: No se comunicarĆ”n los datos a terceros salvo por obligaciĆ³n legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu informaciĆ³n.

  1.   roader dijo

    Interesante curiosidad , aunque no sea muy util en realidad , no esta de mas saberlo .

    Es genial que le hagas publicidad a Rust , es un lenguaje que promete mucho no solo es mas seguro que c++ , sino que (de momento) mas claro en su sintaxis .

    En cuanto a foto , yo no consideraria java evoluciĆ³n XD.

    1.    roader dijo

      Y de fortran , nunca lo use , pero no he oido muchas cosas buenas de el …

      1.    Phorious dijo

        Yo sĆ­, y es especialmente Ćŗtil en ingenierĆ­a si bien Python se estĆ” abriendo lugar.

      2.    juan dijo

        Fortran es quizƔs el otro gran lenguaje junto con C. Todavƭa hoy en cuestiones realmente crƭticas estarƔn uno u otro.

        Y resultarĆ­a discutible que Fortran estĆ© como ‘evoluciĆ³n’ de C, cuando quizĆ”s deberĆ­a ser al revĆ©s, por ser C mĆ”s nuevo, moderno y con mĆ”s posibilidades; aunque uno no se desprende del otro en lo mĆ”s mĆ­nimo.

        Aunque los puestos finales todos son discutibles desde algĆŗn punto de vista.

    2.    Francisco dijo

      +1 a lo de Java

  2.   portaro dijo

    A ver si me gusta esto que le doy algo a la programaciĆ³n pero bĆ”sico a ver si entiendo mĆ”s.

  3.   usergnulinux dijo

    ĀæCual proposito realmente tiene crear un lenguaje de programaciĆ³n nuevo?, a mi personalmente me parece que es una estratagema para ocultar el codigo fuente.

  4.   Yeily dijo

    Amigo que pasĆ³ con la continuaciĆ³n de Ā«tu propio sistema operativoĀ»? No lo dejes ahĆ­ por favor, continĆŗalo.

    En realidad que eres un master y justo estos dos temas han cautivado por completo mi atenciĆ³n, mas no quisiera que se quedaran a medio camino.

    Se que muchos pensamos igual y estamos a la espera de las continuaciones y conclusiones de estos interesantĆ­simos temas.

  5.   Cristian David dijo

    Muy interesante, muchas gracias. šŸ™‚

  6.   Franco dijo

    Yo no considero a java un lenguaje de programaciĆ³n, mas bien un interpretador de ordenes, ya que no es compilable

    1.    Mario dijo

      [Un lenguaje de programaciĆ³n es un lenguaje formal diseƱado para expresar procesos que pueden ser llevados a cabo por mĆ”quinas como las computadoras.]

      Por esto mismo, Java es un lenguaje de programaciĆ³n. Incluso el lenguaje Bash (lenguaje para el intĆ©rprete de comandos de linux) es un lenguaje de programaciĆ³n en si mismo.

      Hay dos tipos de lenguajes:
      – Compilados
      – Interpretados
      – Mixtos (MĆ”quinas virtuales, se compilan las librerĆ­as nativas y se interpreta el cĆ³digo funcional)

      Los intĆ©rpretes son muy Ćŗtiles a la hora de la multiplataforma y no por ello tienen un rendimiento nefasto. Java, VB.NET, C++ .NET, F#, C# son todos lenguajes mixtos. El lenguaje bash, bat, PHP, Javascript y muchos mĆ”s son lenguajes interpretados.

      Si no consideras Java como lenguaje porque es interpretado (cosa que no es asĆ­) no deberĆ­as considerar otros muchos lenguajes que se utilizan para hacer programas. Es mĆ”s, por esa regla de tres no deberĆ­as considerar que existe ningĆŗn lenguaje de programaciĆ³n a excepciĆ³n del propio lenguaje mĆ”quina.

      Y, Āæpor quĆ© no?, ni siquiera el lenguaje mĆ”quina podrĆ­a ser considerado lenguaje ya que realmente solo es un conjunto de Ć³rdenes Ā«interpretadasĀ» por el procesador.

      Porque efectivamente, TODOS los lenguajes no son mĆ”s que un conjunto Ć³rdenes que se interpretan en un procesador.

      Te puede gustar mĆ”s o menos un lenguaje (Java, en este caso), parecerte mĆ”s o menos Ćŗtil y potente pero decir que no es un lenguaje de programaciĆ³n porque no es compilado… va en contra de todas las definiciones de lenguaje de programaciĆ³n.

    2.    Mario dijo

      šŸ˜ Espero no haber parecido muy brusco

      1.    maria antonieta de manuela cardenas dijo

        no tranquilo solo nos destruiste la vida

      2.    Mario dijo

        jjajajajaja, perdoooon. no era mi intenciĆ³n xD

    3.    carlos dijo

      java es un lenguaje de programacion. porque podes desarrollar una aplicacion y cuando compilas haces un .jar que es interpretado por laJVM.entonces segun tu logica python tampoco porq es iterpretado pero se compila a diferentes ejecutables…

  7.   Elias Mongelos dijo

    Muy buena informaciĆ³n

  8.   carlos Arturo dijo

    buena informaciĆ³n pero tengo una duda, serĆ” posible crea un nuevo lenguaje de programaciĆ³n desde cero sin tener que depender de otras analogĆ­as o software. hablo de la misma forma en la que se otros lenguajes fueron hechos como java o el HTML.
    agradecerĆ­a mucho su ayuda en esta duda.