Al desarrollarse las primeras computadoras electr\u00f3nicas, se vio la necesidad de programarlas, es decir, de almacenar en memoria la informaci\u00f3n sobre la tarea que iban a ejecutar. Las primeras se usaban como calculadoras simples; se les indicaban los pasos de c\u00e1lculo, uno por uno.
John Von Neumann desarroll\u00f3 el modelo que lleva su nombre, para describir este concepto de
"programa almacenado". En este modelo, se tiene una abstracci\u00f3n de la memoria como un
conjunto de celdas, que almacenan simplemente n\u00fameros. Estos n\u00fameros pueden representar dos
cosas: los datos, sobre los que va a trabajar el programa; o bien, el programa en s\u00ed.
\u00bfC\u00f3mo es que describimos un programa como n\u00fameros? Se ten\u00eda el problema de representar las
acciones que iba a realizar la computadora, y que la memoria, al estar compuesta por switches
correspondientes al concepto de bit, solamente nos permit\u00eda almacenar n\u00fameros binarios.
La soluci\u00f3n que se tom\u00f3 fue la siguiente: a cada acci\u00f3n que sea capaz de realizar nuestra
computadora, asociarle un n\u00famero, que ser\u00e1 su c\u00f3digo de operaci\u00f3n (opcode). Por ejemplo, una
calculadora programable simple podr\u00eda asignar los opcodes:
Localidad Opcode Significado Comentario 0 5 5 En esta localidad, tenemos el primer n\u00famero de la f\u00f3rmula 1 3 * En esta localidad, tenemos el opcode que representa la multiplicaci\u00f3n. 2 3 3 En esta localidad, tenemos el segundo n\u00famero de la f\u00f3rmula 3 1 + En esta localidad, tenemos el opcode que representa la suma. 4 2 2 En esta localidad, tenemos el \u00faltimo n\u00famero de la f\u00f3rmula
La descripci\u00f3n y uso de los opcodes es lo que llamamos lenguaje de m\u00e1quina . Es decir, la lista de
c\u00f3digos que la m\u00e1quina va a interpretar como instrucciones, describe las capacidades de
programaci\u00f3n que tenemos de ella; es el lenguaje m\u00e1s primitivo, depende directamente del
hardware, y requiere del programador que conozca el funcionamiento de la m\u00e1quina al m\u00e1s bajo
nivel.
los lenguajes m\u00e1s primitivos fueron los lenguajes de m\u00e1quina. Esto, ya que el hardware se
desarroll\u00f3 antes del software, y adem\u00e1s cualquier software finalmente tiene que expresarse en el
lenguaje que maneja el hardware.
La programaci\u00f3n en esos momentos era sumamente tediosa, pues el programador ten\u00eda que
"bajarse" al nivel de la m\u00e1quina y decirle, paso a pasito, cada punto de la tarea que ten\u00eda que
realizar. Adem\u00e1s, deb\u00eda expresarlo en forma num\u00e9rica; y por supuesto, este proceso era propenso
a errores, con lo que la productividad del programador era muy limitada. Sin embargo, hay que
recordar que en estos momentos, simplemente a\u00fan no exist\u00eda alternativa.
c\u00f3digo m\u00e1quina. Esto redujo los errores triviales, como pod\u00eda ser el n\u00famero que correspond\u00eda a
una operaci\u00f3n, que son sumamente engorrosos y dif\u00edciles de detectar, pero f\u00e1ciles de cometer. Sin
embargo, a\u00fan aqu\u00ed es f\u00e1cil para el programador perderse y cometer errores de l\u00f3gica, pues debe
bajar al nivel de la forma en que trabaja el CPU, y entender bien todo lo que sucede dentro de \u00e9l.
Con el desarrollo en los 50s y 60s de algoritmos de m\u00e1s elevado nivel, y el aumento de poder del
hardware, empezaron a entrar al uso de computadoras cient\u00edficos de otras ramas; ellos conoc\u00edan
mucho de F\u00edsica, Qu\u00edmica y otras ramas similares, pero no de Computaci\u00f3n, y por supuesto, les
era sumamente complicado trabajar con lenguaje Ensamblador en vez de f\u00f3rmulas. As\u00ed, naci\u00f3 el
concepto de Lenguaje de Alto Nivel, con el primer compilador de FORTRAN (FORmula
TRANslation), que, como su nombre indica, inici\u00f3 como un "simple" esfuerzo de traducir un
lenguaje de f\u00f3rmulas, al lenguaje ensamblador y por consiguiente al lenguaje de m\u00e1quina. A partir
de FORTRAN, se han desarrollado innumerables lenguajes, que siguen el mismo concepto: buscar
la mayor abstracci\u00f3n posible, y facilitar la vida al programador, aumentando la productividad,
encarg\u00e1ndose los compiladores o int\u00e9rpretes de traducir el lenguaje de alto nivel, al lenguaje de
computadora.
Hay que notar la existencia de lenguajes que combinan caracter\u00edsticas de los de alto nivel y los de
bajo nivel (es decir, Ensamblador). Mi ejemplo favorito es C: contiene estructuras de programaci\u00f3n
de alto nivel, y la facilidad de usar librer\u00edas que tambi\u00e9n son caracter\u00edsticas de alto nivel; sin
embargo, fue dise\u00f1ado con muy pocas instrucciones, las cuales son sumamente sencillas, f\u00e1ciles
de traducir al lenguaje de la m\u00e1quina; y requiere de un entendimiento apropiado de c\u00f3mo funciona
la m\u00e1quina, el uso de la memoria, etc\u00e9tera. Por ello, muchas personas consideramos a lenguajes
como C (que fue dise\u00f1ado para hacer sistemas operativos), lenguajes de nivel medio.
El lenguaje de programaci\u00f3n Java, fue dise\u00f1ado por la compa\u00f1\u00eda Sun Microsystems Inc, con el prop\u00f3sito de crear un lenguaje que pudiera funcionar en redes computacionales heterog\u00e9neas ( redes de computadoras formadas por m\u00e1s de un tipo de computadora, ya sean PC, MAC's, estaciones de trabajo, etc.),y que fuera independiente de la plataforma en la que se vaya a ejecutar. Esto significa que un programa de Java puede ejecutarse en cualquier m\u00e1quina o plataforma. El lenguaje fue dise\u00f1ado con las siguientes caracter\u00edsticas en mente:
Simple. Elimina la complejidad de los lenguajes como "C" y da paso al contexto de los
lenguajes modernos orientados a objetos. Orientado a Objetos. La filosof\u00eda de
programaci\u00f3n orientada a objetos es diferente a la programaci\u00f3n convencional.
Robusto. El sistema de Java maneja la memoria de la computadora por ti. No te tienes que preocupar por apuntadores, memoria que no se est\u00e9 utilizando, etc. Java realiza todo esto sin necesidad de que uno se lo indique.
Seguro. El sistema de Java tiene ciertas pol\u00edticas que evitan se puedan codificar virus con este lenguaje. Existen muchas restricciones, especialmente para los applets, que limitan lo que se puede y no puede hacer con los recursos cr\u00edticos de una computadora.
Portable. Como el c\u00f3digo compilado de Java (conocido como byte code) es interpretado, un programa compilado de Java puede ser utilizado por cualquier computadora que tenga implementado el interprete de Java.
Independiente a la arquitectura. Al compilar un programa en Java, el c\u00f3digo resultante un
tipo de c\u00f3digo binario conocido como byte code. Este c\u00f3dido es interpretado por diferentes
computadoras de igual manera, solamente hay que implementar un int\u00e9rprete para cada
plataforma. De esa manera Java logra ser un lenguaje que no depende de una arquitectura
computacional definida.
Din\u00e1mico. Java no requiere que compiles todas las clases de un programa para que este funcione. Si realizas una modificaci\u00f3n a una clase Java se encarga de realizar un Dynamic Bynding o un Dynamic Loading para encontrar las clases.
Java puede funcionar como una aplicaci\u00f3n sola o como un "applet", que es un peque\u00f1o programa hecho en Java. Los applets de Java se pueden "pegar" a una p\u00e1gina de Web (HTML), y con esto puedes tener un programa que cualquier persona que tenga un browser compatible podr\u00e1 usar.
Java funciona de la siguiente manera: El compilador de Java deja el programa en un Pseudo-
c\u00f3digo (no es c\u00f3digo maquinal) y luego el int\u00e9rprete de Java ejecuta el programa (lo que se conoce
como el "Java Virtual Machine"). Por eso Java es multiplataforma, existe un int\u00e9rprete para cada
m\u00e1quina diferente. Nota: El c\u00f3digo maquinal es el c\u00f3digo binario que la computadora entiende y
puede ejecutar.
servidor.
3. El servidor env\u00eda el documento HTML y el c\u00f3digo en Java (*.class).
4. En la computadora del usuario remoto llegan ambos, y la M\u00e1quina Virtual de Java, que