You are on page 1of 28

Entornos de Desarrollo (1 DAW) IES Severo Ochoa

Unidad 1.

Introduccin

1.1. Teora: los lenguajes de programacin .............................................................................. 1-1 1.2. Prctica: el entorno de desarrollo bsico ........................................................................... 1-9 1.3. Prctica: el depurador de java (jdb) .................................................................................. 1-14 1.4. Prctica: documentacin de cdigo con JavaDoc ........................................................... 1-25

Javier Martn 2011

Entornos de Desarrollo (1 DAW) IES Severo Ochoa

Introduccin

1.1. Teora: los lenguajes de programacin Definicin


Se puede definir un lenguaje de programacin como una notacin para escribir programas, a travs de los cuales es posible establecer comunicacin con el hardware y, as, dar las rdenes adecuadas para la realizacin de un determinado proceso. Viene definido por una gramtica o conjunto de reglas que se aplican a un alfabeto constituido por un conjunto de smbolos. Para estudiar los lenguajes de programacin es necesarios distinguir 3 aspectos del mismo: Nivel lxico: son los smbolos que se pueden usar en el lenguaje. Por ejemplo: las palabras reservadas del lenguaje (for, class, print, import, etc.), operadores (=, +, -, *, /, etc.), nombres de variables y constantes (contador, dni_alumno, i, x, PI, etc.). Nivel sintctico: las construcciones vlidas de esos smbolos. Por ejemplo, el operador de la suma (+) tiene que ir necesariamente acompaado de dos operandos. Nivel semntico: el significado de dichas construcciones. Por ejemplo, la instruccin print hola genera el cdigo necesario para escribir por pantalla el texto hola. Identificadores: nombres simblicos que se darn a ciertos elementos de programacin (por ejemplo: nombres de variables, tipos, mdulos) Constantes: elementos de datos que no cambiarn su valor a lo largo del programa. Operadores: smbolos expresiones. que representan operaciones entre variables, constantes y

Los elementos bsicos de un lenguaje de programacin son los siguientes:

Instrucciones: smbolos especiales que representan estructuras de procesamiento y de definicin de elementos de programacin. Comentarios: texto que se usar para documentar los programas.

Tipos de datos
Tanto las variables como las constantes tomarn valores con respecto a una serie de dominios, llamados tipos de datos. Ejemplos de tipos de datos pueden ser: entero (toman valores enteros: 1, 7, 104, etc.), cadenas de texto (toman valores textuales como Aprieta F1, Son las 23:45, etc.), de coma flotante (toma valores en el dominio de los nmeros reales, como 3.1416, 1.414, etc.). Los tipos de datos simples (carcter, cadena, entero, flotante, etc.) pueden combinarse para formar tipos ms complejos como listas, diccionarios, rboles, colas, pilas, etc.

Caractersticas de los lenguajes de programacin.


Correccin. Un programa es correcto si hace lo que debe hacer tal y como se estableci en las fases previas a su desarrollo. Claridad. Es muy importante que el programa sea lo ms claro y legible posible, para facilitar as su desarrollo y posterior mantenimiento. Eficiencia. Se trata de que el programa, adems de realizar aquello para lo que fue creado (es decir, que sea correcto), lo haga gestionando de la mejor forma posible los recursos que utiliza.
1-1

Javier Martn 2011

Entornos de Desarrollo (1 DAW) IES Severo Ochoa

Introduccin

Portabilidad. Un programa es portable cuando tiene la capacidad de poder ejecutarse en una plataforma, ya sea hardware o software, diferente a aquella en la que se elabor.

Etapas en el desarrollo de software.


Hay distintas metodologas para la elaboracin de software, pero las siguientes son las fases ms comunes: Fase de anlisis: Durante esta fase se documentan los requisitos que debe cumplir el programa para dar solucin al problema dado. El anlisis da respuesta a la pregunta qu debe hacer el programa? Diseo: durante el diseo se descompone el problema en subproblemas ms pequeos y se documenta el comportamiento que debe tener cada uno de los componentes del software y las interacciones entre ellos. Responde a la pregunta cmo debe resolver el problema? La etapa de programacin o codificacin, tambin denominada implementacin, consiste en traducir a un lenguaje de programacin el diseo de la fase anterior. Esta etapa suele llevar la mayor parte del trabajo de la creacin del software. Un punto a tener en cuenta es que cuanto menor es el nivel del lenguaje (es decir, cuanto ms prximo sea al lenguaje mquina), mayor ser el tiempo de programacin requerido. En la etapa de pruebas se comprueba la validez del programa, es decir, que su funcionamiento es correcto y el programa se comporta conforme a su diseo. Las pruebas suelen hacerse a medida que se va programando, y la mayora de metodologas actuales ponen nfasis en su automatizacin. Algunas, incluso, exigen que esta fase tenga lugar antes de la programacin propiamente dicha. Por ejemplo, en TDD (Test-Driven Development o Desarrollo Guiado por Pruebas), se sigue el siguiente proceso: primero se escriben los casos de prueba en base al diseo. Al principio fallarn todos, pero a medida que vamos programando, iremos satisfaciendo los requisitos hasta que el programa pase todas las pruebas. Mientras se realiza el software generalmente se van realizando tareas de depuracin. La depuracin consiste en diagnosticar y solucionar los errores revelados por la fase de pruebas. No todos los errores van a tener lugar durante la etapa de programacin sino que tambin puede darse la aparicin de algn error funcional lo que llevar a retomar la fase de diseo.

Tipos de cdigo
Durante la fase de programacin se generan distintos tipos de cdigo: Cdigo fuente: es el escrito directamente por los programadores en editores de texto, Se compone de uno o ms ficheros de texto, cada uno de los cuales contiene un conjunto de instrucciones codificadas en algn lenguaje de alto nivel. Cdigo objeto: es el cdigo binario resultante de compilar el cdigo fuente. Por tanto, el responsable de generar cdigo objeto es el compilador. El cdigo objeto no es inteligible por el ser humano (generalmente est en formato binario), sin embargo, tampoco es directamente ejecutable por el ordenador. El compilador genera un fichero de cdigo objeto por cada fichero de cdigo fuente. Aquellos ficheros de cdigo objeto que comparten una finalidad comn se suelen agrupar en libreras. Cdigo ejecutable: es el resultante de enlazar uno o ms fragmentos de cdigo objeto con las libreras necesarias. El resultado es un archivo que el sistema operativo es capaz de cargar y ejecutar en memoria. El responsable de construir el ejecutable es el enlazador o linker. Los

Javier Martn 2011

1-2

Entornos de Desarrollo (1 DAW) IES Severo Ochoa

Introduccin

ficheros con cdigo ejecutable tambin tienen formato binario, y un ejemplo de ellos en arquitecturas windows son los archivos con extensiones exe o dll.

Proceso de compilacin de un programa


Para que la mquina pueda leer y ejecutar las instrucciones de un programa escrito en un lenguaje de alto nivel, es necesario que stas se traduzcan a instrucciones mquina. En general, el proceso es el siguiente: Compilador Enlazador

Cdigo fuente

Cdigo objeto

Cdigo ejecutable

El cdigo fuente se compila produciendo un cdigo objeto. Ese cdigo objeto se enlaza con las bibliotecas que contienen los cdigos de funciones que se han empleado en el cdigo fuente, produciendo el cdigo ejecutable directamente por la computadora. Una vez que tenemos el cdigo ejecutable ya no necesitamos disponer del cdigo fuente para que el programa se ejecute. Si nos metemos un poco ms a fondo vemos que el proceso de compilacin consta de dos fases: Anlisis: se comprueba que el programa fuente es correcto a nivel lxico, sintctico y semntico. Traduccin: se realiza la traduccin propiamente dicha. Dependiendo de en qu momento se realice esta traduccin se tienen dos tipos distintos de traductores: compiladores e intrpretes.

Compilador
El proceso de compilacin se compone de los siguientes pasos: El analizador lxico examina en el programa fuente los tokens (elementos o cadenas con significado propio), como por ejemplo: palabras reservadas del lenguaje, identificadores, operadores, etc. Si se produce algn error, lo muestra. Si no se produce ningn error, el analizador sintctico toma la salida del analizador lxico y comprueba que la sintaxis del cdigo fuente es correcta segn la gramtica del lenguaje. En caso de errores, el compilador mostrar el tipo de error (por ejemplo: falta cerrar parntesis, el operador + necesita dos sumandos, etc.) y en qu punto del cdigo aproximado se encuentra. El resultado de este paso es el rbol sintctico del programa, y es anlogo a los rboles resultantes del anlisis sintctico de oraciones en el lenguaje humano. El analizador semntico es el encargado de dar significado al rbol sintctico. En este paso se hacen comprobaciones de tipos, se verifica que las variables tienen asignado algn valor antes de utilizarse, o que las constantes no cambien a lo largo del programa, entre otras. Ante cualquier error, se emite el error o advertencia correspondientes. Generador de cdigo intermedio: en esta fase se toma el rbol sintctico y se genera un cdigo intermedio, que es independiente del procesador de destino. De esta forma se pueden aprovechar todas las fases anteriores del compilador para generar cdigo lo ms portable posible.
1-3

Javier Martn 2011

Entornos de Desarrollo (1 DAW) IES Severo Ochoa

Introduccin

El optimizador toma el cdigo intermedio y lo optimiza para su ejecucin en el procesador de destino, con el fin de minimizar el tiempo de ejecucin o el tamao del ejecutable final. Por ltimo, el generador de cdigo final traduce el cdigo optimizado a lenguaje mquina, produciendo como resultado un archivo de cdigo objeto.

Los distintos ficheros de cdigo objeto pueden ser enlazados entre s para construir cdigo ejecutable directamente por el microprocesador. En algunos lenguajes, como Java, sin embargo, el resultado del compilador es un cdigo especial cercano al lenguaje mquina (bytecode), pero independiente de ste. El responsable de ejecutar el bytecode es una mquina virtual (en el caso de Java, la Mquina Virtual Java, o JVM). Esta mquina es la que se encarga de traducir el bytecode a las instrucciones especficas para cada microprocesador y enlazar el cdigo objeto con las libreras. La ventaja de introducir un paso intermedio entre el cdigo objeto y el lenguaje mquina es la portabilidad: el mismo cdigo compilado se puede ejecutar en miltiples plataformas sin tener que volver a compilarlo. Ejemplos de lenguajes que generalmente son compilados directamente a lenguaje mquina: C, C++, Pascal. Lenguajes que se compilan a bytecode para su ejecucin por JVM: Java, Scala, JRuby o Jython.

Intrprete
El interprete lee el cdigo fuente de un programa lnea a lnea, ejecutando las instrucciones contenidas en cada lnea. Cada vez que lanzamos un programa interpretado se realizan el anlisis lxico, sintctico, semntico, optimizacin y ejecucin. Por tanto, un intrprete no genera cdigo ejecutable como un compilador. La ventaja de los lenguajes interpretados es que agilizan el desarrollo porque no es necesario el paso de la compilacin previo a la ejecucin del programa. Adems, favorecen la portabilidad de los programas, ya que el mismo cdigo puede ejecutarse en plataformas distintas siempre y cuando exista un intrprete en dichas plataformas. Como inconveniente, los programas interpretados suelen ser ms lentos porque implican el anlisis del cdigo fuente cada vez que se ejecutan. No obstante, muchos intrpretes hoy en da incorporan optimizaciones para evitar realizar el anlisis del cdigo fuente cada vez que se lanza el programa. Por ejemplo, Python genera un fichero .pyc con el rbol sintctico ya optimizado la primera vez que se ejecuta un programa. En sucesivas veces se comprueba que el cdigo fuente no haya cambiado, en cuyo caso reaprovecha el anlisis anterior para ahorrar tiempo. Ejemplos de lenguajes normalmente interpretados: PHP, Perl, BASIC, Python o Ruby, aunque algunos de estos lenguajes tambin poseen compiladores que generan cdigo ejecutable (phc para PHP, por ejemplo).

Clasificacin de los lenguajes


Se pueden realizar varias clasificaciones en funcin de una serie de parmetros:

Clasificacin segn la abstraccin


1GL: lenguaje mquina, originalmente introducido mediante interruptores. Su uso actual est relegado principalmente a los compiladores, que se encargan de traducir lenguajes de alto
1-4

Javier Martn 2011

Entornos de Desarrollo (1 DAW) IES Severo Ochoa

Introduccin

nivel a lenguaje mquina. Ejemplo: la secuencia binaria EB11 en la arquitectura x86 produce un salto a la posicin relativa 0x11. 2GL: lenguaje ensamblador. El lenguaje ensamblador permite programar utilizando las instrucciones del microprocesador. Cada instruccin en ensamblador corresponde con una instruccin en cdigo mquina. Se suele emplear en rutinas que requieren una especial optimizacin, o para interactuar directamente con el hardware. Algunos ejemplos de su uso: o Los ncleos (kernel) de los sistemas operativos suelen tener partes escritas en lenguaje ensamblador para aprovechar caractersticas de la CPU no accesibles desde lenguajes de ms alto nivel Tambin se utiliza en la programacin de microcontroladores o sistemas empotrados donde se persigue un mayor control sobre la CPU o hay severas limitaciones de memoria. Muchos juegos de las primeras videoconsolas estaban escritos en ensamblador para sacarle todo el partido al hardware.

Ejemplo: la instruccin MOV EAX, 5 en ensamblador del 80386 asigna el valor 5 al registro EAX. 3GL: son lenguajes que buscan la aproximacin al lenguaje natural. Cada sentencia en un lenguaje 3GL suele estar asociada a varias instrucciones en cdigo mquina. Ejemplos: ALGOL, COBOL, Fortran (1950), C, C++, Perl, PHP, Python, Java, Lua. 4GL: son lenguajes diseados para un fin concreto. Abstraen al programador de los detalles algortmicos. Ejemplos: SQL, PL/SQL, Coldfusion, MATLAB.

Clasificacin segn el paradigma


Lenguajes imperativos: Son lenguajes en los que el programador, para resolver un problema, ha de disear un algoritmo y concretarlo en un programa que le diga a la mquina, paso a paso, lo que debe hacer para resolver dicho problema. Se fundamentan en la asignacin de variables para almacenar valores y en la realizacin de operaciones con los datos almacenados. Los lenguajes imperativos se pueden clasificar, a su vez en: Estructurados: son lenguajes que se basan en tres estructuras bsicas: o o o Secuencia (una serie de instrucciones que se ejecutan ordenadamente), Seleccin (permite la ejecucin de unas sentencias u otras en funcin de una decisin, por ejemplo: si x = 1, imprime x vale 1, si no, imprime x no vale 1) Repeticin (estructuras repite mientras ..., repite hasta que , etc.).

Los primeros lenguajes estructurados fueron ALGOL (muy importante por sus contribuciones al resto de lenguajes), Pascal (muy utilizado en la enseanza sistemtica de la programacin), ADA o C. No estructurados: carecen de alguna de las estructuras anteriores. Por ejemplo: Fortran (para aplicaciones cientficas), Cobol y RPG (aplicaciones de gestin), o BASIC (propsito general).

Lenguajes declarativos En estos lenguajes, el programador slo tiene que declarar o especificar el problema (qu hay que resolver), siendo el propio traductor del lenguaje el que se encarga de construir el algoritmo que dar
Javier Martn 2011 1-5

Entornos de Desarrollo (1 DAW) IES Severo Ochoa

Introduccin

solucin al problema (cmo resolverlo). Por ejemplo, en una consulta a una base de datos en SQL: select * from articulos where precio > 5, le decimos al intrprete de SQL lo que debe buscar en la tabla (artculos cuyo precio sea mayor que 5), no cmo debe hacerlo. Otros ejemplos de lenguajes declarativos son LISP o Prolog, ste ltimo est basado en el clculo de predicados y se emplea para obtener una solucin a un problema en base a una serie de reglas lgicas. Se puede ver un ejemplo sencillo de Prolog en: http://es.wikipedia.org/wiki/Prolog#Ejemplo_simple

Lenguajes Orientados a Objetos Los objetos son entidades que tienen un determinado comportamiento (mtodos) y una serie de atributos. Por ejemplo, un objeto Lavadora puede tener los mtodos Prelavar, Lavar, Enjuagar y Centrifugar, que corresponden a acciones que puede llevar a cabo el objeto. Tambin almacenar una serie de atributos como tiempo_restante, peso_de_la_carga, y estado_actual. Ejemplos de lenguajes orientados a objetos: Smalltalk, Java, Python o Ruby. Algunos lenguajes imperativos se han ampliado para ofrecer caractersticas de los orientados a objetos: C++ (es un superconjunto de la sintaxis de C), Objective-C, PHP o Perl. Respecto a los imperativos, los lenguajes orientados a objetos destacan por su capacidad para reutilizar programas en la construccin de otros nuevos. Las caractersticas ms importantes de los lenguajes orientados a objetos son: Abstraccin: Es la capacidad de un objeto de cumplir sus funciones independientemente del contexto en el que se lo utilice; por ejemplo el objeto Lavadora siempre expondr sus mismas propiedades y dar los mismos resultados a travs de sus eventos, sin importar el mbito en el cual se lo haya creado. Encapsulamiento: Esta caracterstica es la que denota la capacidad del objeto de responder a peticiones a travs de sus mtodos sin la necesidad de exponer los medios utilizados para llegar a brindar estos resultados. Por ejemplo, el mtodo Lavar del objeto Lavadora se pondr a lavar sin que nosotros tengamos por qu conocer su estado interno, el peso de la carga o cualquier otra propiedad encapsulada en el objeto. Herencia: Es la caracterstica por la cual unos objetos pueden adquirir (heredar) los mtodos y atributos de sus antecesores, modificndolos y/o aadiendo nuevos. Por ejemplo, el objeto LavadoraSecadora puede heredar los mtodos propios del objeto Lavadora y, a su vez, implementar nuevos mtodos relativos a las funciones de secado. Polimorfismo: El trmino de polimorfismo est ligado con la herencia. Define la capacidad de que varias clases derivadas de una antecesora utilicen un mismo mtodo de forma diferente. Por ejemplo, un telfono mvil, uno fijo y otro inalmbrico pueden tener un mismo mtodo Marcar, pero la implementacin interna ser distinta segn el tipo de telfono.

Clasificacin segn la tipificacin de los datos


Internamente, el ordenador nicamente es capaz de trabajar con nmeros binarios que se pueden agrupar para formar bytes, cadenas de texto, nmeros de coma flotante o estructuras ms complejas. A cada una de las distintas estructuras en las que se pueden agrupar los bits se denomina tipo de datos, y cada tipo de datos est asociado con una serie de operaciones. Por ejemplo, dos tipos de datos muy comunes en casi todos los lenguajes de programacin son el tipo entero y el tipo cadena (de texto). Un entero se puede sumar, multiplicar, dividir, etc. Por el contrario una cadena se puede concatenar con otra, trocear, invertir, etc.
Javier Martn 2011 1-6

Entornos de Desarrollo (1 DAW) IES Severo Ochoa

Introduccin

Los lenguajes utilizan variables y constantes para almacenar los datos que varan a lo largo de la ejecucin de un programa. En funcin del tratamiento de estas variables y constantes y sus tipos tenemos dos clasificaciones de lenguajes: Fuertemente tipificados: en el momento de escribir el programa, cada variable tendr asignado un tipo, y generalmente las operaciones entre tipos distintos estn prohibidas, siendo responsabilidad del programador hacer las conversiones pertinentes. Por ejemplo, en C, la operacin 5 (cadena de texto) + 6 (nmero entero) est prohibida y sera necesario convertir 5 a entero previamente. Otros ejemplos de lenguajes fuertemente tipificados son: Pascal, C++ o Java. Dbilmente tipificados: el programador no tiene que definir el tipo de las variables, y las conversiones entre stos suelen hacerse de forma automtica por el compilador o intrprete. Por ejemplo, en Perl, la operacin anterior (5 + 6) estara permitida: el compilador convierte automticamente la cadena 5 en el entero 5. Otro ejemplo de lenguaje dbilmente tipificado: PHP.

Clasificacin segn el propsito Lenguajes de propsito general:


Los lenguajes de propsito general son los que tienen un amplio dominio de aplicacin. Permiten, por tanto, escribir programas para dar solucin a problemas de lo ms variopinto. Ejemplos de lenguajes de propsito general: C, C++, Java, Perl, PHP, Ruby, Python, Pascal, Cobol, Ensamblador.

Lenguajes de propsito especfico:


Estn especializados en funciones concretas. A destacar: Lenguajes grficos: tienen como propsito especfico la manipulacin de imgenes, objetos y formas geomtricas. Por ejemplo, graphviz. Lenguajes de procesamiento de texto: se utilizan para componer, estructurar y formatear texto e imgenes. Por ejemplo: TeX y LaTeX Lenguajes de consulta de bases de datos: permiten la consulta de bases de datos abstrayendo al programador de la estructura interna en que se organiza la informacin. Ejemplo: SQL. Lenguajes para programacin web: son lenguajes que, si bien se pueden considerar de propsito general, fueron diseados explcitamente para la construccin de aplicaciones web. Por ejemplo: PHP y Coldfusion.

Cuestiones
1. Cules son los elementos de un programa que toman valores pero no cambian a lo largo del programa? 2. Cules son los elementos de un programa que toman valores que pueden cambiar a lo largo del programa? 3. Cules son los elementos de un programa que permiten hacer operaciones entre expresiones? 4. Cul es la caracterstica de un lenguaje que permite ejecutar sus programas en varias plataformas?
Javier Martn 2011 1-7

Entornos de Desarrollo (1 DAW) IES Severo Ochoa

Introduccin

5. Cul es la fase del desarrollo dedicada a encontrar errores de funcionamiento de un programa para solucionarlos? 6. Cul es la fase del desarrollo dedicada a verificar el funcionamiento correcto del programa en base al diseo? 7. Qu tipo de cdigo es el que da como resultado un compilador? 8. Qu tipo de cdigo es el que escribe un programador, generalmente en editores de texto? 9. En qu paso de la compilacin se intenta que el programa resultante sea lo ms pequeo posible o bien lo ms rpido posible? 10. Qu diferencia hay entre un intrprete y un compilador? 11. Supongamos un programa en Java que da solucin al problema X. Se podra reescribir dicho programa en lenguaje ensamblador de forma que d una solucin igualmente vlida sea cual sea el problema X? 12. Y al revs? Sera posible traducir un programa en ensamblador a Java en cualquier caso? 13. Qu caracterstica de los lenguajes orientados a objetos permite que los objetos adquieran funcionalidad de sus antecesores? 14. Cmo se llaman los lenguajes en los que el programador debe convertir explcitamente las variables de unos tipos a otros? 15. Cmo se llaman los lenguajes que se pueden aplicar a problemas de cualquier tipo?

Javier Martn 2011

1-8

Entornos de Desarrollo (1 DAW) IES Severo Ochoa

Introduccin

1.2. Prctica: el entorno de desarrollo bsico Objetivos


Instalar el JDK de Sun/Oracle Escribir un programa sencillo en Java Compilar el programa utilizando el compilador javac en lnea de comandos Ejecutar el programa utilizando la JVM java.

El entorno de desarrollo ms bsico


En su forma ms simple, el entorno de Java est conformado por una Mquina Virtual de Java o JVM, un conjunto de bibliotecas Java y otros componentes necesarios para que una aplicacin escrita en lenguaje Java pueda ser ejecutada. El JRE (Java Runtime Environment) acta como un "intermediario" entre el sistema operativo y el lenguaje. La JVM es el programa que ejecuta el cdigo Java previamente compilado (bytecode) mientras que las libreras de clases estndar son las que implementan el API (Aplication Programming Interface) de Java. Ambas JVM y API deben ser consistentes entre s, de ah que sean distribuidas de modo conjunto. Un usuario slo necesita el JRE para ejecutar las aplicaciones desarrolladas en lenguaje Java, mientras que para desarrollar nuevas aplicaciones en dicho lenguaje es necesario un entorno de desarrollo, denominado JDK, que adems del JRE (mnimo imprescindible) incluye, entre otros, un compilador para Java. En Ubuntu, para instalar el JDK debemos activar el repositorio Socios de Canonical desde Sistema Administracin Gestor de paquetes Synaptic Configuracin Repositorios Otro software:

Javier Martn 2011

1-9

Entornos de Desarrollo (1 DAW) IES Severo Ochoa

Introduccin

Tras activar el repositorio, cerramos Synaptic y procedemos a instalar el JDK:


sudo apt-get update sudo apt-get install sun-java6-jdk

Aunque slo le hayamos indicado que instale el JDK, el gestor de paquetes de Ubuntu resolver las dependencias e instalar el JRE automticamente:

Javier Martn 2011

1-10

Entornos de Desarrollo (1 DAW) IES Severo Ochoa

Introduccin

El primer programa en Java


Vamos a crear una carpeta donde iremos guardando todas las prcticas que vayamos haciendo en el directorio Entornos/Tema 1 de nuestra carpeta personal (tambin llamada $HOME o simplemente ~):

Para probar que tenemos el JDK bien instalado, podemos escribir un sencillo programa que imprima por pantalla cualquier mensaje al ejecutarse. Bastar abrir un editor (Aplicaciones Accesorios Editor de textos), y escribir lo siguiente:
Javier Martn 2011 1-11

Entornos de Desarrollo (1 DAW) IES Severo Ochoa

Introduccin

Guardar el archivo con el nombre HolaMundo.java en la carpeta ~/Entornos/Tema 1. Ya tenemos nuestro primer programa Java! Es importante: Respetar las maysculas y minsculas, ya que tanto Linux como Java distinguen entre unas y otras. Obligatoriamente el nombre de la clase (HolaMundo) debe coincidir con el nombre del fichero (HolaMundo.java).

Cmo compilar un programa Java


Java es un lenguaje compilado, lo que significa que los programas deben ser traducidos al lenguaje de la mquina virtual (JVM) antes de poder ejecutarlos. El compilador de Java se llama javac. Para compilar el programa anterior, abrimos un terminal y escribimos:
cd Entornos/Tema 1 javac HolaMundo.java

El resultado de la compilacin debera ser el siguiente:

Si todo ha ido bien, el comando javac nos devuelve al shell sin imprimir ningn error, obedeciendo a la filosofa UNIX: la ausencia de noticias es una buena noticia. Si hacemos un ls, veremos que el compilador ha generado un fichero llamado HolaMundo.class.

Cmo ejecutar un programa Java


Para ejecutar nuestro programa debemos invocar la JVM mediante el comando java seguido del nombre de la clase que contiene la funcin main, en nuestro caso HolaMundo:

Javier Martn 2011

1-12

Entornos de Desarrollo (1 DAW) IES Severo Ochoa

Introduccin

java HolaMundo

El resultado debera ser:

Ejercicios Ejercicio 1
Crea el siguiente programa Java en la carpeta ~/Entornos/Tema 1. Complalo y ejectalo. Cul es su salida por pantalla?
public class Numeros { public static void main(String[] args) { int i = 0; for (i = 0; i < 5; i++) { System.out.println(i); } } }

Ejercicio 2
Crea el siguiente programa en la carpeta ~/Entornos/Tema 1.
public class Error { public static void main(String[] args) { int a = Integer.parseInt(args[0]); int b = Integer.parseInt(args[1]); Systen.out.println(a + b); } }

Esta vez, el compilador javac nos devuelve un error, indicando que hay algo mal escrito en nuestro cdigo fuente. En qu lnea est el error? Sabras solucionarlo?. Una vez solucionado el error, sabras decir qu hace el programa?

Fuentes y bibliografa
http://es.wikipedia.org/wiki/JRE

Javier Martn 2011

1-13

Entornos de Desarrollo (1 DAW) IES Severo Ochoa

Introduccin

1.3. Prctica: el depurador de java (jdb) Objetivos


Aprender los comandos bsicos del jdb: run, stop, step, !!, list, cont, print Ejecutar paso a paso un programa en Java y consultar el valor de sus variables

Cmo depurar un programa Java


Un depurador es una herramienta valiossima que ayuda a encontrar errores durante el desarrollo de una aplicacin. El depurador (o debugger, en ingls) permite, entre otras cosas: Ejecutar el programa lnea por lnea Ver y modificar los valores de las variables en cualquier momento de la ejecucin Poner puntos de ruptura (breakpoints) para interrumpir el programa cuando llegue a una lnea concreta.

Aunque la forma ms cmoda de depurar un programa es desde un entorno integrado de desarrollo (IDE por sus siglas en ingls), el JDK de Java cuenta con un depurador en modo texto cuyas funciones bsicas conviene conocer. Vamos a utilizar como ejemplo el programa Numeros de la prctica anterior:
public class Numeros { public static void main(String[] args) { int i = 0; for (i = 0; i < 5; i++) { System.out.println(i); } } }

Para depurar el programa, en vez de lanzarlo con java, utilizamos el comando jdb:
jdb Numeros

En lugar de ejecutarse el programa, lo que veremos es esto:

El jdb est esperando a que le digamos qu hacer. Para empezar, podemos pedir la ayuda sobre las rdenes disponibles con help:
Javier Martn 2011 1-14

Entornos de Desarrollo (1 DAW) IES Severo Ochoa

Introduccin

El comando run
El comando run ejecuta el programa, como si lo hubiramos llamado con el comando java:

Javier Martn 2011

1-15

Entornos de Desarrollo (1 DAW) IES Severo Ochoa

Introduccin

Aunque aparece ms informacin de lo habitual (Set uncaught , Set deferred ...), la salida de nuestro programa sigue estando ah, justo detrs de VM Started. Cuando el programa termina, el jdb imprime The application exited y nos devuelve al shell de Linux. La verdad es que el comando run por s solo no nos aporta nada nuevo porque el programa se ha ejecutado de tirn y no nos ha dado tiempo a hacer nada con l. Vamos a ver cmo podemos detener la ejecucin y examinar variables o ejecutar lneas paso a paso:

El comando stop
El comando stop sirve para detener el programa en un punto dado. Podemos indicarle que se pare al principio de un mtodo:
stop in Clase.mtodo

O bien en un nmero de lnea concreto:


stop at Clase:4

Veamos un ejemplo de stop in: vamos a hacer que el jdb se pare cuando empiece la ejecucin del programa, es decir, en el mtodo Numeros.main:

Bien! Ahora tenemos control sobre la ejecucin del programa. Si nos fijamos, el jdb se ha parado en la lnea 3. Podramos haber conseguido el mismo efecto utilizando el comando:

Javier Martn 2011

1-16

Entornos de Desarrollo (1 DAW) IES Severo Ochoa

Introduccin

stop at Numeros:3

El comando list
Cuando salta un breakpoint, el jdb nicamente imprime la lnea en que se ha producido la interrupcin. Si queremos situarnos un poco mejor en el contexto del breakpoint, podemos utilizar el comando list:

El comando list muestra las 5 lneas por encima y por debajo de la actual, ayudndonos un poco a ubicarnos.
Javier Martn 2011 1-17

Entornos de Desarrollo (1 DAW) IES Severo Ochoa

Introduccin

El comando step
Para avanzar una lnea, utilizamos el comando step:

El jdb nos informa que el paso se ha completado, y que ahora estamos en la lnea 4.

El comando !!
El comando !! equivale a teclear de nuevo el ltimo comando. Por ejemplo, justo despus de un step, !! equivaldra a otro step:

En el pantallazo anterior hemos ejecutado !! dos veces. La primera nos ha colocado en la lnea 5. Al darle una vez ms a !!, si nos fijamos vemos como se ha ejecutado la lnea System.out.println(i), imprimiendo un 0 (lnea en fondo negro). A continuacin volvemos a la lnea 4 para empezar el bucle de nuevo. El hecho de que la salida del programa salga mezclada con la informacin del propio jdb hace que sea un poco engorroso depurar as. Este problema se resuelve utilizando un IDE con depurador integrado, pero tambin existe una forma de evitarlo con el jdb que veremos ms adelante.

Javier Martn 2011

1-18

Entornos de Desarrollo (1 DAW) IES Severo Ochoa

Introduccin

El comando print
El comando print imprime el valor de una variable. Por ejemplo, si tecleamos print i justo en el estado actual del programa, obtendremos el valor de la variable i. S? Vemoslo:

Vaya! Parece que ha habido un error. La variable i debera valer 1, pero en su lugar sale un error (ParseException), y nos dice que i vale null. Qu est pasando? Lo que ocurre es que para que el jdb pueda mostrar el valor de las variables, hay que compilar el programa con la opcin de depuracin: -g:
javac -g Numeros.java

Recompilemos el programa con la orden anterior, y volvamos a lanzar el programa con el jdb. Esta vez vamos a poner un breakpoint en la lnea 5 (el System.out.println), para que el programa se detenga all:

Esta vez s! El valor de la variable es 0, ya que al reiniciar el programa, es la primera vez que entramos en el bucle.
Javier Martn 2011 1-19

Entornos de Desarrollo (1 DAW) IES Severo Ochoa

Introduccin

El comando cont
El comando cont sirve para continuar la ejecucin. En caso de que el programa se encuentre con algn breakpoint, volveramos al jdb de nuevo:

Efectivamente, al hacer un cont, el programa vuelve a interrumpirse en la lnea 5. Esta vez, si hacemos un print i, el valor que nos da es 1. Si hicieramos otro cont, el valor esperado de i sera 2, y as sucesivamente hasta terminar el bucle.

El comando clear
El comando clear sirve para eliminar breakpoints. Tambin sirve para obtener la lista de breakpoints activos:

Cuando no queremos que el programa se detenga ms en la lnea 5, simplemente eliminamos el breakpoint haciendo:
clear Numeros:5

Si ejecutamos la orden anterior seguida de un cont, veremos como el programa sigue su ejecucin hasta que termina:

Javier Martn 2011

1-20

Entornos de Desarrollo (1 DAW) IES Severo Ochoa

Introduccin

Cmo evitar que se mezclen la salidas


Podemos evitar que la salida del jdb se mezcle con la de nuestro propio programa utilizando dos ventanas distintas. En una escribiremos:
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=4571 Numeros

Y en la otra ejecutaremos el jdb:


jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=4571

Si lanzamos el programa con run, veremos como en la primera ventana nicamente aparece la salida del programa:

Mientras que en la segunda ventana podemos interactuar con el jdb normalmente:


Javier Martn 2011 1-21

Entornos de Desarrollo (1 DAW) IES Severo Ochoa

Introduccin

Conclusin
Esta prctica es una mera toma de contacto con la depuracin de aplicaciones Java. El jdb tiene muchas ms funciones, pero el 99% de las veces utilizaremos un IDE, donde todas las operaciones estn accesibles mediante barras de herramientas, mucho ms intuitivas. En sucesivas prcticas retomaremos la depuracin desde entornos IDE, donde exploraremos ms exhaustivamente las posibilidades del depurador de Java.

Ejercicios Ejercicio 1
El siguiente programa es un sencillo juego en el que el ordenador nos reta a adivinar un nmero entre el 1 y el 100 en tres intentos. Cuando nos equivocamos nos da una pista diciendo si nos hemos pasado por arriba o por abajo, y nos brinda una nueva oportunidad de acertar, hasta que o bien demos con el nmero, o bien agotemos los tres intentos:
import java.util.Random; import java.util.Scanner; // Compilar con javac -g Adivina.java // Ejecutar con java Adivina public class Adivina { public static void main(String[] args) throws java.io.IOException { Random generador = new Random(); Scanner scanner = new Scanner(System.in); int numero_ordenador = generador.nextInt(100) + 1; int numero_humano; int intentos = 0; System.out.println("Adivina el nmero del 1 al 100"); do {
Javier Martn 2011 1-22

Entornos de Desarrollo (1 DAW) IES Severo Ochoa

Introduccin

// Lee nmero introducido por teclado numero_humano = scanner.nextInt(); // Da una pista si es mayor o menor if (numero_ordenador < numero_humano) { System.out.println("Menos"); } if (numero_ordenador > numero_humano) { System.out.println("Mas"); } // Repite mientras el humano no acierte intentos++; } while (numero_ordenador != numero_humano && intentos < 3); if (numero_ordenador == numero_humano) { System.out.println("CORRECTO!!"); } else { System.out.println("NOOOOO, HAS FRACASADO!"); } } }

Humillados por nuestra incapacidad de vencer al ordenador, decidimos hacerle trampas. Para ello vamos a cargar el programa dentro del jdb y pararlo justo despus de que genere el nmero secreto. Averiguaremos cul es su valor y demostraremos nuestra superioridad a la mquina respondiendo correctamente en el primer intento. Indica cules son los comandos necesarios en el jdb capturando la sesin de depuracin en un fichero de texto.

Ejercicio 2
El matemtico alemn Gottfried Leibniz descubri el siguiente mtodo para calcular el nmero Pi de una forma aproximada:

= 4

4 4 4 + + ... 3 5 7

El siguiente programa obtiene el valor aproximado de Pi utilizando el mtodo de Leibniz:


public class CalculaPi { public static void main(String[] args) { final int MAX_DENOMINADOR = 1000000; double pi = 0; int signo = 1; int denominador = 1; while (denominador <= MAX_DENOMINADOR) { pi = pi + signo * (4.0 / denominador); signo = -signo; denominador += 2; } System.out.println("Pi=" + pi); } }
Javier Martn 2011 1-23

Entornos de Desarrollo (1 DAW) IES Severo Ochoa

Introduccin

Cul es el valor de Pi despus de la primera iteracin? Y despus de la segunda? Y despus de la 10?

Javier Martn 2011

1-24

Entornos de Desarrollo (1 DAW) IES Severo Ochoa

Introduccin

1.4. Prctica: documentacin de cdigo con JavaDoc Objetivos


Documentar las clases y mtodos de un programa Java Generar la documentacin automtica con JavaDoc

Lectura previa
Uso de JavaDoc http://gpd.sip.ucm.es/rafa/docencia/programacion/tema1/javadoc.html

Ejercicios Ejercicio 1
1. Leer la documentacin de JavaDoc anterior. 2. En la carpeta ~/Entornos/Tema 1, crear una carpeta llamada Circulo. 3. Dentro de ~/Entornos/Tem a 1/Circulo, crear un archivo llamado Circulo.java con el cdigo de ejemplo. 4. Generar la documentacin:
ad@tierra:~$ cd Entornos/Tema\ 1/Circulo/ ad@tierra:~/Entornos/Tema 1/Circulo$ javadoc Circulo.java

El resultado debera ser similar a:

Javier Martn 2011

1-25

Entornos de Desarrollo (1 DAW) IES Severo Ochoa

Introduccin

Para comprobar que se ha generado la documentacin correctamente, abrimos con el navegador el fichero index.html:

Ejercicio 2
Escribir la documentacin del programa Error.java de la prctica anterior: Clase Error: o o o o o o Descripcin de la clase: Clase de prueba del tema 1. Ejemplo de uso: javac Error 2 3. Dar como resultado el nmero 5 Autor: tu nombre Version: 1.0 Descripcin del mtodo: Vamos a reutilizar esta clase del tema 1, que originalmente contena un error, para aprender a documentar cdigo Java. Descripcin del parmetro args: Los 2 nmeros a sumar Devuelve: Nada
1-26

Mtodo main:

Javier Martn 2011

Entornos de Desarrollo (1 DAW) IES Severo Ochoa

Introduccin

Para que no se mezcle la documentacin con el resto de archivos de la carpeta Tema 1, podemos pasarle a javadoc el parmetro d con la carpeta donde queremos guardar la documentacin generada:
ad@tierra:~/Entornos/Tema 1$ javadoc Error.java -d Error-doc

Javier Martn 2011

1-27