08 agosto 2008

Java: la mera mata de la programada

Voy a comenzar a aventurarme en los reinos oscuros de la programación orientado a objetos con Java, así que en mi blog comenzarán a aparecer algunos mensajes sobre el tema.

Antes que nada, voy a platicar un poco sobre la tecnología de Java, cosa que es muy interesante. Para entender su funcionamiento, hay que hablar un poco sobre los lenguajes de programación existentes. Todos los lenguajes de programación usan el código fuente en un lenguaje determinado siguiendo cierta sintáxis (reglas impuestas por C, C++, Visual Basic, COBOL, FORTRAN, Ensamblador u otro). Este es un buen avance, sin embargo a la computadora como tal no le sirve de nada porque sólo entiende ceros y unos, puro binario, y, aunque es posible codificar en puro binario, es cosa de locos. Entonces para que todo funcione, es necesario traducir este código a unos y ceros.

Para hacer esto, básicamente hay dos tipos de lenguajes: los interpretados y los compilados. Los interpretados, usados por lenguajes como GW-BASIC, Logo, JavaScript, Lisp, VBScript, etc., necesitan de un programa traductor entre el código fuente y la computadora. Lo que hace es leer la primera línea del código, lo traduce para que lo entienda la computadora, lo envía a la computadora, recibe la respuesta de la computadora, lo traduce para que lo entienda el programa y da el resultado al programa. Luego lee la siguiente línea del código fuente y vuelve a hacer el mismo proceso y así sucesivamente hasta terminar todas las instrucciones del programa. Esto es como si me quisiera comunicar con una persona que sólo habla kuskoy y yo no tengo ni la más remota idea de cómo se habla. Lo mejor sería conseguirme un intérprete que sepa kuskoy y así yo le digo algo en español, él le dice lo mismo al cuate con el que pretendo comunicarme, éste le contesta al intérprete y éste último me dice la respuesta en español. Luego yo le digo otra cosa y así nos la llevamos durante toda la conversación. Es obvio que no puedo hacer nada si el intérprete no va conmigo. Lo mismo sucede con el programa hecho en un lenguaje interpretado: si no estoy corriendo el software intérprete, no funciona mi programa. Hice el siguiente dibujito para resumir lo que acabo de escribir:


Otra manera de hacer que el programa fuente pueda ser ejecutado por la computadora es por medio de un compilador (o sea, los lenguajes compilados). Algunos ejemplos de este tipo de lenguajes son el C, C++, Pascal o Fortran. El compilador es un programita que traduce el código fuente de golpe y porrazo a binario, por lo que ya no necesitas el compilador para ejecutar tu magna aplicación que sorprenderá al mundo entero. Es como si, en lugar de un intérprete para comunicarme con el que habla kuskoy, a alguien que traduce todo un documento al kuskoy para que lo pueda leer el extranjero. Una vez traducido el documento, no requiero los servicios del traductor para seguirme comunicando.

Una nota técnica sobre lo que dije del compilador: el compilador realmente no lo convierte a binario sino que convierte el código fuente a un código objeto, algo intermedio entre el código fuente y binario. Al tener el código objeto, se usa un programa llamado linker que sirve para convertir el código objeto al código binario de la computadora en cuestión. Ten cuidado aquí porque el código binario de cada tipo de sistema operativo es diferente, o sea que no es lo mismo un ejecutable para una PC corriendo Windows Vistagüácala!) que para una Mac usando MacOS X o para una computadora ejecutando Ubuntu (una distribución de Linux). Lo chido es que tienes un sólo codigo fuente que puedes compilar con diferentes compiladores para su uso en diferentes sistemas, por decir un programa en C++ puedes compilarlo con Visual C++ o Borland C++ para obtener una aplicación que funcione bajo Windows o compilarlo con el compilador C++ 9.1 para MacOS para que funcione en esa plataforma o con el GCC para que funcione bajo Linux. Aquí dejo un diagrama para ejemplificar el proceso de compilar un programa:


¿Y cuál es la diferencia entre ambos mundos? Los lenguajes compilados son mucho más rápidos que ñps interpretados, pero solo funcionan bajo un sistema operativo. La mayor parte de los lenguajes hechos para desarrollar aplicaciones "serias" son de este tipo. Sin embargo, teniendo el intérprete, un programa hecho en un lenguaje interpretado funciona en cualquier máquina, en cualquier sistema operativo (por ejemplo, el ActionScript que viene con el Flash funciona en todas las computadoras que tienen instalado el Flash Player).

Java une lo mejor de dos mundos. El código fuente que escribes en Java es compilado a un lenguaje ejecutable, llamado P-Code, que se ejecuta en una máquina virtual, o sea, una computadora "de mentiritas", totalmente funcional pero físicamente inexistente. A la hora de correr el programa, se necesita una máquina virtual de Java instalado para el sistema operativo en cuestión para que sirva de intérprete entre la aplicación Java y la computadora y ¡listo! el programa ejecutable se ejecuta (valga la redundancia). Aquí les dejo un último diagrama de cómo funciona todo este relajo de Java:


¿Qué ventajas trae esto, probablemente te preguntarás? Fácil. Con el famoso código P, se puede llevar esa aplicación a cualquier máquina y funciona, sea una PC, Mac, Servidor, Palm, teléfono celular, refrigerador, cafetera inteligente, máquina expendedora de refrescos o casi cualquier cosa que tenga un procesador. Sun, la compañía detrás de Java, tiene máquinas virutales para casi todas las plataformas que son gratuitas. Como verás, la desventaja de este lenguaje compilado-interpretado es la velocidad, pero la gran ventaja es que tu programa ejecutable puede correr en cualquier lado. Por ejemplo, hace tiempo Sun hizo una suite de aplicaciones gratuita llamada StarOffice (ahora la versión gratuita se llama OpenOffice porque el StarOffice ya se cobra) que funciona sobre Java (querían demostrar que Java era lo suficientemente potente como para realizar casi cualquier aplicación para computadoras). Funciona muy bien y todo es alegría y felicidad pero si lo comparas con Microsoft Office en una PC vas a ver que el OpenOffice es más lento, pero necesitas una copia de MS Office diferente si lo quieres ejecutar en la Mac (versión que difiere de la versión para PC) y es inexistente en Linux. OpenOffice funciona bajo cualquier plataforma.
Referencias:

Aquí te dejo algunas referencias padres que te pueden ayudar. Hay dos libros que hasta ahorita me han gustado y son útiles:

Introduction to Java and Software Design de Nell Dale, Chip Weems y Mark Headington de Jones and Bartlett Publishers

Java: How to program de los Deitel (padre e hijo)

El mejor material que he visto hasta ahorita en línea es The Java Tutorials. Vale la pena que le eches un vistazo.

Aquí les pongo ligas a estos libros por si les interesa. Si tienes dudas, sugerencias, propuestas o lo que sea, deja un comentario. ¡Hasta la próxima!

5 comentarios:

Anónimo dijo...

Gracias por la gran información! Yo no habría descubierto esto de otra manera!

Anónimo dijo...

Como novato, siempre estoy buscando en línea para los artículos que me puede ayudar. Gracias Wow! ¡Gracias! Siempre quise escribir en mi sitio algo así. ¿Puedo tomar parte de tu post en mi blog?

Tony Valderrama dijo...

Claro que puedes tomar parte y ponerlo en tu blog... si te agradecería una liga de regreso :)

Anónimo dijo...

Muy agradable de hecho probablemente voy a descargarlo. Gracias

luz dijo...

gracias est muy chido todo lo que escribes la verdad esperaba encontrar un poco de programas para ver como se desarrollan por que voy empezando en estio de java.

pero muy bien ojala puedas publicar algunos programas.

El Tony y sus ondas...

Related Posts Plugin for WordPress, Blogger...