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 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.
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.
Y de fortran , nunca lo use , pero no he oido muchas cosas buenas de el …
Yo sĆ, y es especialmente Ćŗtil en ingenierĆa si bien Python se estĆ” abriendo lugar.
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.
+1 a lo de Java
A ver si me gusta esto que le doy algo a la programaciĆ³n pero bĆ”sico a ver si entiendo mĆ”s.
Āæ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.
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.
Muy interesante, muchas gracias. š
Yo no considero a java un lenguaje de programaciĆ³n, mas bien un interpretador de ordenes, ya que no es compilable
[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.
š Espero no haber parecido muy brusco
no tranquilo solo nos destruiste la vida
jjajajajaja, perdoooon. no era mi intenciĆ³n xD
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…
Muy buena informaciĆ³n
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.