El Blog de Manu

Chipper: Elección del lenguaje

Programar es divertido :D

El lenguaje que utilicemos para desarrollar un emulador depende de varios factores. En primer lugar, obviamente están nuestras preferencias y conocimientos personales. Puede que nos guste la rapidez de desarrollo utilizando lenguajes interpretados, a lo mejor nos encanta que nuestros programas sean multiplataforma, o quizás somos unos enamorados de la programación orientada a objetos… o, porqué no, todo a la vez. Un emulador no deja de ser un programa más -algo especial, eso sí-, por lo que parte de esta elección tiene un componente subjetivo.

Por otro lado, hay que tener en cuenta la plataforma -o plataformas- sobre la que queremos que funcione, y las limitaciones que ello conlleva. En algunas máquinas -como en una consola portátil-, no andamos sobrados de recursos, para otras no existen intérpretes o compiladores para ciertos lenguajes, y en otras quizás estamos atados a ciertos entornos de desarrollo.

En mi caso, quería hacer algo sencillo de entender, y que funcionase en la mayor cantidad de máquinas y sistemas operativos posible. Así que hice el siguiente repaso mental de los lenguajes que tenía disponibles…

Lenguajes interpretados

Lenguaje interpretados

Ahora la potencia de las máquinas ha dejado de ser un problema, así que no es extraño ver programas relativamente complejos realizados con lenguajes interpretados. Python o Ruby cada vez están más de moda -de hecho un amigo ha hecho un emulador de Chip-8 usando este lenguaje-, e incluso se pueden ver auténticas virguerías hechas con JavaScript.

Sin embargo, personalmente creo que les falta bastante para ganar a un programa compilado, a pesar de que suelen ser excelentes para el prototipado de un proyecto. Además, en un futuro es posible que lleve el emulador a alguna consola portátil, y utilizar un lenguaje interpretado es un pequeño handicap a tener en cuenta.

C

Lenguaje C

Si hay un lenguaje que ha marcado un antes y un después en la historia de la informática, es C. Es la piedra angular de sistemas operativos como GNU/Linux o FreeBSD, y de muchas aplicaciones que utilizamos a diario. Además, su sintaxis ha creado escuela, y muchos de los lenguajes de programación que existen hoy en día se basan en ella.

Sin duda, es una opción muy válida, sobre todo si tenemos en cuenta la velocidad de los programas realizados en C, y el hecho de que exista un compilador para casi cualquier máquina, incluyendo alternativas libres como el megaproyecto GCC.

C++

Lenguaje C++

Por diseño, C es relativamente limitado, y además no está pensado para la programación orientada a objetos. Para suplir estas carencias, Bjarne Stroustrup creó C++, una especie de lenguaje híbrido compatible con los programas escritos en C, que permitía estructuras de datos más avanzadas, una mejor gestión de la memoria, además de tener una biblioteca enorme de clases que nos simplifica el desarrollo de nuevas aplicaciones.

Aunque es una alternativa muy viable, el problema es que no estoy demasiado familiarizado con él, y aunque pretendo suplir esta carencia personal en un futuro cercano, quería hacer el proyecto sin complicarme demasiado la vida.

Java

Lenguaje Java

Aunque es uno de los líderes en el desarrollo web, Java todavía no es demasiado popular para realizar programas de escritorio. A pesar de que cada vez la velocidad de ejecución va dejando de ser un problema, y existe la ventaja de tener programas multiplataforma sin complicarnos la vida, tiene ciertas limitaciones que son difíciles de solventar, como el hecho de que no existe máquina virtual para algunos sistemas operativos, ni para muchas plataformas portátiles.

Además, es una tecnología que uso cada día en el trabajo, por lo que quería probar nuevos aires 😉

Conclusiones

Obviamente, me he dejado muchos lenguajes en el tintero, pero lo cierto es que en este pequeño repaso he cubierto la mayoría de los que se usan en el desarrollo de emuladores.

Por diversos motivos, al final he decidido hacerlo en C, y me he ayudado de la biblioteca SDL para facilitar el acceso al hardware de vídeo y a la lectura de eventos. De esta manera, el código se puede llevar fácilmente entre sistemas operativos, y entre distintas máquinas. El resultado espero publicarlo muy pronto… estad atentos 😉

Comentarios

Dabor

Yo ando más familiarizado con C++ que con C, pues es el que usé para aprender orientación a objetos, y C lo he usado más para sistemas operativos, pero a veces me confunde la sintaxis. Luego Java es una gozada para programar a pesar del rendimiento, pero teniendo buen control de lo que se hace se pueden hacer maravillas…(eso de la herencia de Object da mucho juego)

eltercero

Ahora ando aprendiendo Ruby para mi PFC, y la verdad es que la sencillez se agradece, al igual que con Python.

Para cosas rápidas, la verdad es que este tipo de lenguajes son una gozada. Lo que con C, o Java, necesitas unas decenas de lineas de código, estos lo hacen con apenas un par.

Croc

¿Y no has planteado la opción de C#? Sin duda tiene sus limitaciones, deficiencias, ventajas y virtudes, pero en conjunto es una solución bastante viable.

Yo como experimento y más tarde como PFC me hice un emulador de GameBoy original en ese lenguaje (http://www.denibol.com/proyectos/csgbe) y la experiencia fue bastante positiva.

Un saludo!

ZeXeL

Este es mi primer comentario, aunque leo tu blog
con mucha frecuenta y me encanta. Tan solo decirte
que me parece fantastica tu eleccion, soy estudiante
de ITI y estaba leyendo el articulo y pensando «que diga
C, que diga C…» por que es el lenguaje que mas me gusta
asi cuando publiques algo podre echarle un «buen» ojo.

Muchas gracias por escribir este fantastico blog.

Manu

Croc, lo malo que tiene C# es que llevar el programa a una plataforma que no tenga .NET Framework o Mono es imposible. En cualquier caso, echaré un vistazo a tu emu 😉

ZeXeL, tampoco te esperes una maravilla, que tampoco soy muy bueno programando xD

carlixyz

hay una web gratutita que se llama videotutoriales ahí tienen un curso bastante avanzado de c++ que yo estoy siguiendo y hasta ahora todo perfecto, 100% recomendado

negora

¿Te has metido a la programación de emuladores? Me dejas de piedra, no sé de dónde sacas tiempo para hacer tantas cosas XD . Me alegro y espero que se dé bien la «obra» 🙂 .

Yo desde luego soy amante (bandido) de Java, y quiero seguir adentrándome más y más en este lenguaje, ya que le veo muchísimo futuro y una versatilidad total (y ya no tan penalizada por el rendimiento, como tú mismo comentas). Me alegraría que por fin apareciesen consolas virtuales para casi cualquier tipo de máquina y que incluso se extendiese su uso en el desarrollo de videojuegos.

Curiosamente comencé odiando Java por lo meticulosas y laboriosas que eran ciertas tareas (todo está muy desgranado), pero con el tiempo me di cuenta de que, una vez adaptado a esa exigencia, el problema no sólo no era tal sino que se convirtió en virtud. Por designios de la vida, mi primer trabajo serio tras los estudios fue con Java, y gracias a esa obligación descubrí las grandes virtudes de este lenguaje. Ahora no quiero otra cosa.

Estoy seguro de que si hubiera tenido una adolescencia vinculada a la programación como muchos han tenido, Java me hubiera gustado desde el comienzo, pero en aquel entonces eran joven, inexperto e impetuoso (esto suena a la Hora Chanante XD ). Y claro, quería las cosas ya y ahora.

Pero vamos, resumiendo, que I LOVE JAVA 😛 .

negora

Ondia, se me han caído los «ojos» al suelo al ver el emulador de MSX sobre JavaScript :S . Sabía que Mozilla estaba potenciando el desarrollo de aplicaciones complejas con JS, pero hacer eso YA me ha sorprendido. Está claro que una vez se implementó el objeto CANVAS las posibilidades comenzaron a ser infinitas. Es lo único que le faltaba a JS para hacer algo más o menos complejo gráficamente: Un lienzo donde dibujar nativamente (sin mapas de bits importados y sin tirar de CSS).

Manu

negora, el emulador realmente lleva un tiempo casi terminado, pero quiero rematar algunos flecos y publicarlo en breve 😉

En cuanto a Java, estoy de acuerdo, pero a veces para hacer un programa pequeño, se matan moscas a cañonazos. Para proyectos de gran envergadura bien diseñados, la verdad es que es una gozada…

eteream

A caso un mecánico primero coge la llave inglesa y después mira lo que le pasa al coche? o es al revés: primero se mira cual es la situación, y luego se cogen las herramientas apropiadas?
No te lo tomes a mal Manu, pero cada lenguaje tiene sus puntos fuertes y sus puntos débiles. Creo que primero deberías situar cuales son los objetivos del proyecto: educacional, poder hacer combos de no se cuantos hits al SF, etc…

Manu

eteream, a lo mejor no has seguido el proceso de los artículos, pero la idea era estudiar un sistema, saber lo que se tiene que emular, ver para que plataformas se quiere emular, y diseñar el emulador teniendo en cuenta todo esto.

De hecho, el código lleva escrito un año, y este artículo no es más que un pequeño repaso de los lenguajes más utilizados a la hora de hacer emuladores 😉

oskarloko

Ya que me comentas que usas Java en el trabajo, te comento

Hay varios emuladores escritos en Java
– JPC, emulador x86 http://www-jpc.physics.ox.ac.uk/index.html
– Jenesis, emulador Megadrive http://www.workingdesign.de/projects/index.php

Y para lenguajes, tienes estos con soporte de la JVM
– Ruby con JRuby ( soportado por SUN )
– Python con Jhyton ( soportado por SUN )
– Groovy, es exclusivo de la plataforma Java, mezcla coceptos de Ruby y Python con la sintaxis de Java
– entre otros…

Y con Java tienes las librerias
– JOGL en java con OpenGL http://en.wikipedia.org/wiki/Java_OpenGL
– JMonkey http://en.wikipedia.org/wiki/JMonkey_Engine

Bueno, de todas maneras C me parece una elección acertada para el tema del emulador.

Animo y suerte !

eteream

Manu, pues no, la verdad no habia seguido mucho el asumpto del chip8.
Habia caido en el error que era el tema recurrente de guerra de lenguajes. Bien, pues me alegro que sea una desición meditada! 😉
Personalmente añadiria pascal como el lenguaje didáctico por exelencia, y asembler que no es ni educativo ni muy portable, pero necesario en algunos casos.
Bien a ver si nos enseñas el código… para poder destriparlo! je-je-je

¿Tienes algo que decir?