martes, 9 de noviembre de 2010

TALLER HILOS

DEFINICION DE UN HILO
Un hilo es una secuencia de código en ejecución dentro del contexto de un proceso.  Los hilos requieren la supervisión  de un proceso padre para correr. Los hilos además son conocidos como un proceso ligero, es muy similar a un proceso a diferencia que este corre siempre corre dentro del contexto de otro programa. Comúnmente, los hilos son implementados a nivel de sistema, requiriendo una interfaz de programación específica separada del núcleo de lenguaje de programación  
CICLO DE VIDA DE UN HILO
Un hilo puede pasar por varios estados durante su vida (CREACION, EJECUCION, PAUSA o TERMINACION)
Recién creada (New thread): entra aquí inmediatamente despues de su creación. Es decir luego del llamado a new. En este estado los datos locales son ubicados e iniciados. Luego de la invocación a start(), el hilo pasa al estado "corrible".

Corrible (Runnable): Aquí el contexto de ejecución existe y el hilo puede ocupar la CPU en cualquier momento. Este estado puede subdividirse en dos: Corriendo y encolado. La transición entre estos dos estados es manejado por lel itinerador de la máquina virtual.
Nota: Un hilo que invoca al método () voluntariamente se mueve asimisma al estado encolado desde el estado corriendo.
Bloqueada (not Runnable): Se ingresa cuando: se invoca suspend(), el hilo invoca el método wait() de algún objeto, el hilo invoca sleep(), el hilo espera por alguna operación de I/O, o el hilo invoca join() de otro hilo para espera por su término. El hilo vuelve al estado Corrible cuando el evento por que espera ocurre.

Muerta (Dead): Se llega a este estado cuando el hilo termia su ejecución (concluye el método run) o es detenida por otro hilo llamando al su método stop(). Esta última acción no es recomendada.
La prioridad de un hilo tiene el efecto de:

1. Si hay 2 hilos para ejecutarse, se ejecuta primero el de mayor prioridad.
2. Si hay 1 hilo ejecutándose y entra un hilo de mayor prioridad, el primer hilo sale de ejecución y entra este ultimo.


Hilos demonio: Son hilos de muy baja prioridad (llamados servicios) que normalmente se ejecutan en periodos muy largos usando pocos recurso. Para crear un demonio se usa setDaemon(): true o false.
SINTAXIS DE CREACION DE UN HILO
Hay dos modos de conseguir threads en Java. Una es implementando la interface Runnable, la otra es extender la clase Thread.
La implementación de la interface Runnable es la forma habitual de crear threads. Las interfaces proporcionan al programador una forma de agrupar el trabajo de infraestructura de una clase. Se utilizan para diseñar los requerimientos comunes al conjunto de clases a implementar. La interface define el trabajo y la clase, o clases, que implementan la interface realizan ese trabajo. Los diferentes grupos de clases que implementen la interface tendrán que seguir las mismas reglas de funcionamiento.
Hay una cuantas diferencias entre interface y clase. Primero, una interface solamente puede contener métodos abstractos y/o variables estáticas y finales (constantes). Las clases, por otro lado, pueden implementar métodos y contener variables que no sean constantes. Segundo, una interface no puede implementar cualquier método. Una clase que implemente una interface debe implementar todos los métodos definidos en esa interface. Una interface tiene la posibilidad de poder extenderse de otras interfaces y, al contrario que las clases, puede extenderse de múltiples interfaces. Además, una interface no puede ser instanciada con el operador new; por ejemplo, la siguiente sentencia no está permitida:
Runnable a = new Runnable();   // No se permite
El primer método de crear un thread es simplemente extender la clase Thread:
class MiThread extends Thread {
    public void run() {
        . . .
        }

El ejemplo anterior crea una nueva clase MiThread que extiende la clase Thread y sobrecarga el método Thread.run() por su propia implementación. El método run() es donde se realizará todo el trabajo de la clase. Extendiendo la clase Thread, se pueden heredar los métodos y variables de la clase padre. En este caso, solamente se puede extender o derivar una vez de la clase padre. Esta limitación de Java puede ser superada a través de la implementación de Runnable:
public class MiThread implements Runnable {
    Thread t;
    public void run() {
        // Ejecución del thread una vez creado
        }
    }
En este caso necesitamos crear una instancia de Thread antes de que el sistema pueda ejecutar el proceso como un thread. Además, el método abstracto run() está definido en la interface Runnable tiene que ser implementado. La única diferencia entre los dos métodos es que este último es mucho más flexible. En el ejemplo anterior, todavía tenemos oportunidad de extender la clase MiThread, si fuese necesario. La mayoría de las clases creadas que necesiten ejecutarse como un thread , implementarán la interface Runnable, ya que probablemente extenderán alguna de su funcionalidad a otras clases.
No pensar que la interface Runnable está haciendo alguna cosa cuando la tarea se está ejecutando. Solamente contiene métodos abstractos, con lo cual es una clase para dar idea sobre el diseño de la clase Thread. De hecho, si vemos los fuentes de Java, podremos comprobar que solamente contiene un método abstracto:
package java.lang;
public interface Runnable {
    public abstract void run() ;
}
Y esto es todo lo que hay sobre la interface Runnable. Como se ve, una interface sólo proporciona un diseño para las clases que vayan a ser implementadas. En el caso de Runnable, fuerza a la definición del método run(), por lo tanto, la mayor parte del trabajo se hace en la clase Thread. Un vistazo un poco más profundo a la definición de la clase Thread nos da idea de lo que realmente está pasando:
public class Thread implements Runnable {
    ...
    public void run() {
        if( tarea != null )
            tarea.run() ;
            }
        }
    ...
    }


CLASE Y METODOS DE UN HILO
Clase Thread: Maneja hilos de ejecución. Hay metodos que controlan si el hilo esta ejecutado, durmiendo, en suspenso o detenido.

Metodos básicos:
1. sleep(milis): Pone en suspenso un hilo en ejecución durante un cierto tiempo.
2. start(): Pone a ejecutar un hilo. Crea un hilo de sistema y ejecuta. Luego llama al metodo run().
3. run(): Lleva el cuerpo del hilo. Es llamado por el metodo start(). Normalmente es un bucle. Hay que redefinirlo.
4. suspend(): Detiene el hilo, pero no lo destruye. Puede ejecutarse de nuevo. Met.de instancia.
5. resume(): Reanuda el hilo de ejecución detenido. Met.de instancia.
6. interrupt(): Detiene el hilo de ejecución, normalmente no se usa, se deja que el hilo termine su correcta ejecución.
7. join(): Fuerza al hilo a esperar la finalizacion de los hilos asociados.

INTERFACE RUNNABLE
Al implementar la interfaz Runnable en una clase, un objeto puede manipular objetos de esa clase como objetos Runnable. Y tal como cuando heredamos de Thread, debemos declarar y sobrecargar el método run().
Cuando una clase utiliza un objeto Runnable para manipular subprocesos, este crea un objeto Thread y asocia el objeto Runnable con ese objeto Thread (¿enredado? para nada; sigue leyendo y verás que es muy sencillo). La clase Thread posee constructores que pueden recibir objetos Runnable, por ejemplo el constructor
public Thread(Runnable objetoRunnable)
especifica que el método run() del objeto objetoRunnable es el que debe invocarse cuando el subproceso comience a ejecutarse. Por otro lado, el construtor
public Thread(Runnable objetoRunnable, String nombreHilo)
crea un objeto Thread con el nombre nombreHilo, y especifica que el método run() del objeto objetoRunnable es el que debe invocarse cuando el subproceso comience a ejecutarse. ¡Veamos un ejemplo para entender mejor!

BIBLIOGRAFIA
http://www.arcos.inf.uc3m.es/~pstr/transparencias/concurren.pdf
http://sunsite.dcc.uchile.cl/java/docs/JavaTut/Cap7/creath.html
http://www.sc.ehu.es/sbweb/fisica/cursoJava/applets/threads/runnable.htm

martes, 7 de septiembre de 2010

CLUSTER DE ALTO RENDIMIENTO

Cuando deceamos mejorar nuestra calificaciones o estudiar para algun tema en especifico lo que podemos hacer es lo siguiente: Estudiar mas intensamente dosificando nuestra horas de estudio, estudiar mas inteligentemente planear, estructurar y mejorar nuestra forma de estudio, incluso llegamos a pedir ayuda para poder estudiar y entender mejor.

Algo similar sucede en las entronos de computacion y programacion, cuando queremos desarrollar aplicaciones que requieran muchos procesos, podemos utilizar un software que mejore el tiempo de proceso, utilizar y optimizar los algoritmos para optimizar el rendimiento e incluso podemos conectar los computadores en red para facilitar los procesos y aplicaciones de alto consumo de meoria Ram.

Con la evolucion de la tecnologia informatica se presentaron formas de optimizarlos procesos de una aplicacion o programa, en 1990 se vio un modelo donde se veia como nuestro PC era una cosa muy insignificante Al lado de las supercomputadoras vectoriales, en el año de 1995 se presenta otro modelo donde se muestra una inteconexion de varios PC para formar un MPP, en el año 2000 se ve la interconexion de varios PC asimilandolo a un tamaño mucho mayor que las supercomputadoras vectoriales, de alli sale los terminos de cluster y Grid.
 
En definicion los cluster son una coleccion de computadores independientes que dan la impresion de solo trabajar en un computador, pero con una mayor eficacia y procesamiento  que si se tuviera uno. entre sus procesamientos se encuentra dos tipos de procesamineto (DISTRIBUIDO Y PARALELO). Los cluster permiten aumentar la escabilidad, la disponibilidad y fiabilidad de los recursos.entre los cluster encontramos dos tipos de escabilidad:
  • Escabilidad Vertical (DEL HARDWARE): Agregar o interconectar al equipo otros con el fin de mejorar su rendimiento.
  • Escabilidad Horizontal (DEL SOFTWARE): Instalar programas que mejoren y se optimice la capacidad de cada equipo para sus tareas o aplicaciones.

 Entre los cluster se ve una calsificacion que se dedica a identificar para que fin se pueden usar cada una de ellas, entre estas estan los cluster de alto rendimiento que requieren de un alto nivel de computacion y programacion, los cluster de alta disponibilidad que se ocupan de vender un servicio disponible y confiable y el cluster de alta eficiencia que permiten ejecutar la mayor cantidad de tareas en el menor tiempo posible. Los cluster poseen cierta arquitectura donde se ven los siguientes componentes (Nodos "PROCESADORES", Sofware de base"SISTEMAS OPERATIVOS", Comunicaciones"REDES DE ALTA VELOCIDAD", Middleware"SISTEMAS DE TRADUCTORES", entornos de progrmacion, bibliotecas y herramientas de desarrollo).

Los cluster se desarrollan con los siguientes fines: mejorar el desempeño de los PC, la velocidad de las redes aumenta, almacenamiento de datos redundantes es a mas bajo costo, mejorar los procesadores, permite agregar nuevos procesadores y ejecutarse en diferentes sistemas operativos. Entre los cluster se presentan los siguientes:
MARENOSTRUM (Barcelona)
  • 42 billones de operaciones por segundo
  • 4800 procesadores
  • 2400 nodos duales de 2.2 GHz
  • 9.6 tera bytes de memoria ram
  • 236 tera bytes de almacenamiento en disco
  • 3 redes de interconexion (Myriret, GigabitEthernet, Ethernet 10/100)
THUNDER (California)
  • 1024 nodos
  • 4 Cpu por nodo
  • Itanium 2.14 GHz CPU
  • 19940 Giga flops
  • 8 GB ram/nodo
  • discos 75 GB por nodo
  • Sistema operativo CHAOS
Dentro de poco la Universidad Distrital tendra un Cluster llamado CENTRO PARA LA COMPUTACION DE ALTO DESEMPEÑO contara con 1024 nodos y se inagurara el jueves 30 de septiembre.

Otro ejemplo de mejorar los desempeños son los GRID que consta de computadores de diferentes caracteristicas y marcas, presentan alto nivel de heterogeneidad, una mayor organizacion virtual, una mayor y especializacionde la arquitectura se basa en OGSA, posee ademas un nucleo o niddleware. Los cluster y los Grid son una gran mejora para facilitar el uso de los PC o de la estacion de trabajo, con una mayor eficacia y mayor procesamiento y ejecucion de aplicaciones.






domingo, 22 de agosto de 2010

APPLETS


PROGRAMACION DE APPLETS


Un applet es un componente de una aplicación que se ejecuta en el contexto de otro programa, por ejemplo un navegador web. El applet debe ejecutarse en un contenedor, que lo proporciona un programa anfitrión, mediante un plugin, o en aplicaciones como teléfonos móviles que soportan el modelo de programación por applets.
A diferencia de un programa, un applet no puede ejecutarse de manera independiente, ofrece información gráfica y a veces interactúa con el usuario, típicamente carece de sesión y tiene privilegios de seguridad restringidos. Un applet normalmente lleva a cabo una función muy específica que carece de uso independiente. El término fue introducido en AppleScript en 1993.
Ejemplos comunes de applets son las Java applets y las animaciones Flash. Otro ejemplo es el Windows Media Player utilizado para desplegar archivos de video incrustados en los navegadores como el Internet Explorer. Otros plugins permiten mostrar modelos 3D que funcionan con una applet.
Un Java applet es un código JAVA que carece de un método main, por eso se utiliza principalmente para el trabajo de páginas web, ya que es un pequeño programa que es utilizado en una página HTML y representado por una pequeña pantalla gráfica dentro de ésta.
Por otra parte, la diferencia entre una aplicación JAVA y un applet radica en cómo se ejecutan. Para cargar una aplicación JAVA se utiliza el intérprete de JAVA (pcGRASP de Auburn University, Visual J++ de Microsoft, Forte de Sun de Visual Café). En cambio, un applet se puede cargar y ejecutar desde cualquier explorador que soporte JAVA (Netscape, Internet Explorer, Mozilla Firefox...).

CARACTERÍSTICAS DE UN APPLET
  1. Los applets no tienen un método main( ) con el que comience la ejecución.
  2. Todos los applets derivan de la clase java.applet.Applet
  3. Los applets deben redefinir ciertos métodos heredados de Applet que controlan su ejecución: init(), start(), stop(), destroy().
  4. Los métodos gráficos se heredan de Component, mientras que la capacidad de añadir componentes de interfase de usuario de heredan de Container y de Panel.
  5. También suelen redefinir ciertos métodos gráficos: los más importantes son paint(), update() y repaint().
  6. Los applets disponen de métodos relacionados con la obtención de información, como por ejemplo: getAppletInfo(), getAppletContext(), getParameterInfo(), getParameter(),getCodeBase(), getDocumentBase() e isActive().

martes, 17 de agosto de 2010

SERIE DE FIBONACCI (17-08-10)


CAPA LOGICA
package logica;
public class Fibonacci {
private int limite;
private String cadena;
public Fibonacci () {
limite=0;
cadena="1";
}


public String getCadena () {
return cadena;
}


public void setCadena (String val) {
this.cadena = val;
}


public int getLimite () {
return limite;
}


public void setLimite (int val) {
this.limite = val;
}


public boolean verificarpositivo (int dato) {


if(dato>0){
setLimite(dato);
return true;}
else
return false;
}


public String generarserie (int dato) {
int a,b,c;
a=1;
b=1;
c=a+b;
while(c<=dato){
cadena=cadena+" "+c;
a=b;
b=c;
c=a+b;
}
return cadena;}
}


CAPA DE PRESENTACION


package presentacion;
import java.io.*;
import logica.Fibonacci;


public class Formulario {
public Formulario () {
}
public static int leer ()throws IOException{
InputStreamReader entrada =new InputStreamReader(System.in);
BufferedReader lectura= new BufferedReader(entrada);
String cadena=lectura.readLine();
try{
return (Integer.parseInt(cadena));
}
catch(Exception e){
System.out.println("ERROR DIGITO UNA CADENA EN VEZ DE UN NUMERO POSITIVO");
return 0;
}
}
public static void main (String arg[]) throws IOException {
System.out.println("DIGITE LIMITE SUPERIOR (NUMERO POSITIVO)");
int a=leer();
Fibonacci Obj1=new Fibonacci();
if(Obj1.verificarpositivo(a))
System.out.println("SERIE: "+Obj1.generarserie(a));
else
System.out.println("LOS DATOS QUE DIGITO NO PERMITEN GENERAR SERIE");
}
}
DIAGRAMA DE CASOS DE USO



DIAGRAMA DE CLASES

martes, 10 de agosto de 2010

RELATORIA 10 DE AGOSTO DE 2010

NUEVOS CONCEPTOS

LENGUAJE DE PROGRAMACION (JORGE LUIS)

Schaum*: El lenguaje de programación Java es un lenguaje moderno, presentado por primera vez por Sun Microsystems en el segundo semestre de 1995. Desde el principio ganó adeptos rápidamente por muy diversas razones, una de las más importantes es su neutralidad frente a la plataforma de ejecución lo que permite, entre otras cosas, añadir programas a una página Web.
MAQUINA VIRTUAL (ANGELA)
Es un software que emula a una computadora y puede ejecutar programas como si fuese una computadora real. Este software en un principio fue definido como "un duplicado eficiente y aislado de una máquina física". La acepción del término actualmente incluye a máquinas virtuales que no tienen ninguna equivalencia directa con ningún hardware real.
RECOLECTOR DE BASURA (TATIANA) 

Liberar espacios de memoria
Agilizar los procesos 
Permite mayor seguridad 
Un objeto que no se utilice el recolector lo borra 
En java no es necesario crear un destructor como en el lenguaje C/C++ 

JDK (ANDRES)

La creación de un programa en Java, ya sean applets o aplicaciones convencionales, necesita la instalación de las herramientas de desarrollo de Java. El Kit de Desarrollo de Java (JDK) es una donación de Sun Mycrosystem a la que podemos acceder visitando el sitio que posee Sun en la Red.
COMPILADOR: Es un traductor que pasa de lenguaje fuente a lenguaje maquina

TIPOS DE DATOS EN JAVA (HARVEY RICARDO Y ERIKA)

El lenguaje java define 8 tipos de datos primitivos:

Datos de Tipo Numérico →
Números Enteros→ byte, short, int, long. →
Números en coma flotante →Float y double.
Datos de tipo carácter → Char.
Datos de tipo Booleano → Boolean

Tipos de datos enteros

Se usan para representar números enteros con signo. Hay cuatro tipos: byte (1Byte -8 bits), short (2 Bytes -16 bits), int (4 Bytes -32 bits) y long (8 Bytes -64 bits).

Tipos de datos en coma flotante
Se usan para representar números con partes fraccionarias. Hay dos tipos de coma flotante: float (4 Byte -32 bits) y double (8 Bytes -64 bits)
Tipo de datos carácter
Se usa para almacenar caracteres Unicode simples. Debido a que el conjunto de caracteres Unicode se compone de valores de 16 bits, el tipo de datos char se almacena en un entero sin signo de 16 bits.
ENTORNO DE PROGRAMACION (YENNY)
Los entornos de programación son el soporte para la preparación de programas, es decir que es un editor de código, compilador, depurador y un constructor de interfaz grafica.

EJERCICIO N°2
PROBLEMA:
Se necesita sumar dos números y calcular el factorial a un numero dado.
Requisitos:
Desarrollado en java
Autónomo
Applet
Con arquitectura multinivel

El diagrama de casos de uso permite establecer las necesidades del sistema

PASOS PARA DESARROLLAR EL EJERCICIO
Abrir el   programa  NetBeans 6.7.1
Para crear un nuevo proyecto siga la siguiente ruta:
ARCHIVO/ PROYECTO NUEVO/ JAVA/ APLICACIÓN JAVA 
Al seleccionar la APLICACIÓN JAVA damos clic en el icono que dice SIGUIENTE, después de ello aparecerá una nueva ventana en la cual le daremos nombre al proyecto y la ubicación donde se guardara todos los archivos y carpetas, en este caso nuestro proyecto se llamara EjemCalculadora. Al destinar la ubicación del proyecto le damos terminar
Al terminar nos dirigimos al panel izquierdo, ponemos el cursor sobre paquetes de fuente y le damos clic derecho y en ello creamos dos nuevos paquetes de java (Lógica y Presentación)
Una vez creados los dos paquetes nos dirigimos a archivo proyecto nuevo y seleccionamos UML/JAVA-PLATAFORM MODEL y luego le damos SIGUIENTE
 
Le damos el nombre de ejemplocalculadorajava, le damos terminar y obtenemos una nueva ventana donde saldrán diferentes opciones, damos clic sobre USE CASE DIAGRAM y la damos TERMINAR

 
Luego de esto saldrá una nueva pantalla en la cual realizaremos el DIAGRAMA DE CASOS DE USO. En el panel derecho hay unos iconos damos clic en el icono ACTOR el cual nos mostrara en la pantalla un muñeco le daremos el nombre de ESTUDIANTE
 
Ahora insertamos los casos de uso los cuales los encontraremos en el panel derecho con el nombre de USE CASE, creamos tres casos de uso con los nombres de SUMAR NUMEROS, CALCULAR FACTORIAL y DIGITAR NUMEROS.
Le damos clic derecho en el actor y le damos ASOCIATION, asociando el actor a los tres casos que ya se habían realizado.
  
SUMAR NÚMEROS y obtenemos un panel con varias funciones, damos clic en la opción INCLUDE, vinculándola al caso de uso de DIGITAR NUMEROS, realizamos el proceso anterior sobre el caso de uso CALCULAR FACTORIAL.
  
Cuando terminamos el proceso anterior nos dirigimos al panel izquierdo, colocamos el cursor sobre la carpeta MODEL damos clic derecho y le damos la opción NEW/DIAGRAM
Saldrá una nueva ventana que nos permitirá crear el DIAGRAMA DE CLASES, con ayuda de los iconos en el panel derecho crearemos las dos clases que se habían realizado en el análisis.
Nos dirigimos al panel izquierdo damos clic sobre el icono CLASS, el programa creara la forma grafica de una clase en la cual le daremos el nombre de Calculadora, damos clic derecho sobre la clase en la parte de ATTRIBUTE y le damos la opción CREATE ATTRIBUTE.
Cuando hemos insertado el private int dato en la parte de OPERATIONS el programa por defecto me creara las funciones set & get, ahora damos clic derecho sobre la parte de OPERATIONS y le damos en la opción CREATE OPERATION, creamos los métodos de SUMAR y FACTORIAL.
 
Luego realizamos el mismo proceso anterior para crear la clase FrmCalculadora con sus métodos y atributos.
Ahora vinculamos la clase Calculadora y la clase FrmCalculadora, una vez este vinculados damos clic derecho sobre la clase Calculadora y le damos la opción GENERATE CODE.
 
Luego de esto saldrá una ventana donde buscaremos la aplicación de java EjmCalculadora y le damos la opción ACEPTAR. Cuando damos esta opción esperamos un momento, minimizamos la pantalla y volvemos a ampliar la pantalla  creara los archivos.
 
CODIGO CALCULADORA


package logica;

public class Calculadora {

    private int dato;

    public Calculadora () {
    }

    public int getDato () {
        return dato;
    }


    public void setDato (int val) {
        this.dato = val;
    }

 
    public int sumar (int dato2) {
        return (dato+dato2);
    }

    public long factorial () {
        int i;
        long totalfactorial=1;
        for(i=dato;i>0;i--)
            totalfactorial*=i;
        return(totalfactorial);
    }

}



CODIGO FRMCALCULADORA


package presentacion;

import java.io.*;

import logica.Calculadora;

public class FrmCalculadora {

    private Calculadora obj1= new Calculadora();
    public FrmCalculadora () {
    }

    public static int leer () throws IOException {
        InputStreamReader entrada =new InputStreamReader(System.in);
        BufferedReader lectura= new BufferedReader(entrada);
        String cadena=lectura.readLine();
        return (Integer.parseInt(cadena));
    }

    public Calculadora getObj () {
        return obj1;
    }

    public void setObj (Calculadora val) {
        this.obj1 = val;
    }


    public static void main (String args[]) throws IOException {
        Calculadora obj1 =new Calculadora();
        System.out.println("digite dos numeros");
        int dato1=leer();
        int dato2=leer();
        obj1.setDato(dato1);
        System.out.println("Suma: "+obj1.sumar(dato2));
        System.out.println("Factorial: "+obj1.factorial());
    }

    }

domingo, 8 de agosto de 2010

SEGUNDO TALLER

1
NUEVOS CONCEPTOS

LENGUAJE DE PROGRAMACION:
Un lenguaje de programación es un idioma artificial diseñado para expresar computaciones que pueden ser llevadas a cabo por máquinas como las computadoras. Pueden usarse para crear programas que controlen el comportamiento físico y lógico de una máquina, para expresar algoritmos con precisión, o como modo de comunicación humana.
Los lenguajes de programación son herramientas que nos permiten crear programas y software. Entre ellos tenemos Delphi, Visual Basic, Pascal, Java, entre otros. Una computadora funciona bajo control de un programa el cual debe estar almacenado en la unidad de memoria; tales como el disco duro. Los lenguajes de programación de una computadora en particular se conocen como código de máquinas o lenguaje de máquinas. Estos lenguajes codificados en una computadora específica no podrán ser ejecutados en otra computadora diferente.
Para que estos programas funcionen para diferentes computadoras hay que realizar una versión para cada una de ellas, lo que implica el aumento del costo de desarrollo. Por otra parte, los lenguajes de programación en código de máquina son verdaderamente difíciles de entender para una persona, ya que están compuestos de códigos numéricos sin sentido nemotécnico. Los lenguajes de programación facilitan la tarea de programación, ya que disponen de formas adecuadas que permiten ser leídas y escritas por personas, a su vez resultan independientes del modelo de computador a utilizar. Los lenguajes de programación representan en forma simbólica y en manera de un texto los códigos que podrán ser leídos por una persona.
JAVA:
El lenguaje de programación Java, fue diseñado por la compañía Sun Microsystems Inc, con el propósito de crear un lenguaje que pudiera funcionar en redes computacionales heterogéneas (redes de computadoras formadas por más 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áquina o plataforma. El lenguaje fue diseñado con las siguientes características 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ía de programación orientada a objetos es diferente a la programación convencional.
  • Familiar. Como la mayoría de los programadores están acostumbrados a programar en C o en C++, el sintaxis de Java es muy similar al de estos.
  • 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é utilizando, etc. Java realiza todo esto sin necesidad de que uno se lo indique.
  • Seguro. El sistema de Java tiene ciertas políticas 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íticos de una computadora.
  • Portable. Como el código 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ódigo resultante un tipo de código binario conocido como byte code. Este código es interpretado por diferentes computadoras de igual manera, solamente hay que implementar un intérprete para cada plataforma. De esa manera Java logra ser un lenguaje que no depende de una arquitectura computacional definida.
  • Multithreaded. Un lenguaje que soporta múltiples threads es un lenguaje que puede ejecutar diferentes líneas de código al mismo tiempo.
  • Interpretado. Java corre en máquina virtual, por lo tanto es interpretado.
  • Dinámico. Java no requiere que compiles todas las clases de un programa para que este funcione. Si realizas una modificación a una clase Java se encarga de realizar un Dynamic Bynding o un Dynamic Loading para encontrar las clases.
MAQUINA VIRTUAL:
Es un software que emula a una computadora y puede ejecutar programas como si fuese una computadora real. Este software en un principio fue definido como "un duplicado eficiente y aislado de una máquina física". La acepción del término actualmente incluye a máquinas virtuales que no tienen ninguna equivalencia directa con ningún hardware real.
Una característica esencial de las máquinas virtuales es que los procesos que ejecutan están limitados por los recursos y abstracciones proporcionados por ellas. Estos procesos no pueden escaparse de esta "computadora virtual".
Uno de los usos domésticos más extendidos de las máquinas virtuales es ejecutar sistemas operativos para "probarlos". De esta forma podemos ejecutar un sistema operativo que queramos probar (Linux, por ejemplo) desde nuestro sistema operativo habitual (Mac OS X por ejemplo) sin necesidad de instalarlo directamente en nuestra computadora y sin miedo a que se reconfigure el sistema operativo primario. 

JDK:
El Java Development Kit, JDK por sus siglas en inglés, es un grupo de herramientas para el desarrollo de software provisto por Sun Microsystems, Inc. Incluye las herramientas necesarias para escribir, testear, y depurar aplicaciones y applets de Java.