domingo, 9 de marzo de 2014

Compiladores II - Material de Ayuda

Parte 1 (Lectura para los Cursos: (6º, 5º,4º)
El lenguaje de programación Java

Java es un lenguaje de programación de alto nivel que tiene las siguientes características:
  • Orientado a objetos
  • Distribuido y dinámico
  • Robusto
  • Seguro
  • Multitarea
  • Portable
La mayoría de los lenguajes de programación se caracterizan por ser interpretados o compilados, lo que determina la manera en como serán ejecutados en una computadora.

Java tiene la característica de ser al mismo tiempo compilado e interpretado. El compilador es el encargado de convertir el código fuente de un programa en un código intermedio llamado bytecode que es independiente de la plataforma en que se trabaje y que es ejecutado por el intérprete de Java que forma parte de la Máquina Virtual de Java.

Compilación y ejecución de programas en Java.
 
La plataforma Java

Una plataforma es el ambiente de hardware o software en el cual se ejecutan los programas. En general, la mayoría de las plataformas pueden ser descritas como una combinación de hardware y sistema operativo. Algunas de las plataformas más populares son Windows, Solaris, Linux y MacOS.

La plataforma Java difiere de las anteriores en que ésta es una plataforma basada únicamente en software que corre por encima de las plataformas basadas en hardware.

La plataforma Java consta de dos componentes:
  • La Máquina Virtual de Java (JVM)
  • La Interfaz de Programación de Aplicaciones de Java (API Java)


Tipos de programas en Java

Los programas en Java suelen estar en una de las siguientes categorías:
  • Applets
Los applets son pequeños programas que se incorporan en una página Web y que por lo tanto, necesitan de un Navegador Web compatible con Java para poder ejecutarse. A menudo los applets se descargan junto con una página HTML desde un Servidor Web y se ejecutan en la máquina cliente.
  • Aplicaciones
Las aplicaciones son programas standalone de propósito general que normalmente se ejecutan desde la línea de comandos del sistema operativo. Con Java se puede realizar cualquier programa que normalmente se crearía con algún otro lenguaje de programación.
  • Servlets
Los servlets al contrario de los applets son programas que están pensados para trabajar en el lado del servidor y desarrollar aplicaciones Web que interactúen con los clientes. Los servlets son una alternativa de la programación CGI tradicional.
Compilación y ejecución de programas Java (1 de 4)

El Kit de desarrollo de Java (JDK) contiene las herramientas y librerías necesarias para crear y ejecutar applets y aplicaciones en Java.

A continuación se listas algunas de las utilidades que se pueden encontrar en el JDK:
  • javac. Es el compilador de Java. Se encarga de convertir el código fuente escrito en Java a bytecode.

  • java. Es el intérprete de Java. Ejecuta el bytecode a partir de los archivos class.

  • appletviewer. Es un visor de applets. En la mayoría de las ocasiones puede utilizarse en lugar de un Navegador Web.

  • javadoc. Se utiliza para crear documentación en formato HTML a partir de el código fuente Java y los comentarios que contiene.

  • javap. Es un desensamblador de Java.

  • jar. Es una herramienta utilizada para trabajar con los archivos JAR.


Sintaxis de Java

La sintaxis de un lenguaje define cómo se usarán las palabras claves, los operadores y las variables para construir y evaluar expresiones. La sintaxis de Java especifica como se escribirán los siguientes elementos:
  • Comentarios.

  • Identificadores.

  • Palabras clave.

  • Literales.

  • Expresiones y operadores.

  • Variables y tipos de datos.

  • Bloques y sentencias.

Comentarios

Java ofrece tres tipos de comentarios: dos para comentarios regulares en el código fuente y uno para la documentación especial del sistema javadoc.
  • Comentarios de varias líneas.
Los comentarios de varias líneas se incluyen entre los símbolos /* y */, como en C y C++.
/*
Este es un ejemplo de
un comentario de varias
líneas.
*/
  • Comentarios de una sola línea.
Para comentariar una sola línea se utiliza la doble diagonal //. El comentario se inicia cuando se encuentra la doble diagonal y continua hasta el final de la línea.
// Este es un comentario de una sola linea
         //Este es otro comentario
  • Comentarios para documentación.
Realmente este tipo de comentario es el mismo que el de varias líneas con la diferencia de que la información que contenga será usada para un procesamiento especial que lleva a cabo la herramienta javadoc.

Se distingue del comentario de varias líneas porque se agrega un asterisco adicional al inicio del comentario.
/**
Este tipo de comentarios
los utiliza la
herramienta javadoc
*/
Identificadores

Un identificador es una secuencia de caracteres comenzando por una letra y conteniendo letras y números. Los identificadores no se limitan a los caracteres ASCII, si el editor de texto lo soporta, se pueden escribir identificadores utilizando caracteres Unicode.

Las letras Java incluyen los caracteres ASCII A-Z y a-z. Los digitos Java incluyen los digitos ASCII 0-9. Para propósitos de construir identificadores, los caracteres ASCII $ y _ son también considerados letras Java.

No hay un límite en lo concerniente al número de caracteres que pueden tener los identificadores.

Estos son algunos ejemplos de identificadores válidos:
_varx         $var1        MAX_NUM     var2               


Palabras clave

La siguiente tabla muestra las palabras claves de Java, éstas son reservadas y no pueden ser utilizadas como identificadores.
abstract
default
if
private
this
boolean
do
implements
protected
throw
break
double
import
public
throws
byte
else
instanceof
return
transient
case
extends
int
short
try
catch
final
interface
static
void
char
finally
long
strictfp**
volatile
class
float
native
super
while
const*
for
new
switch

continue
goto*
package
synchronized


* Son palabras claves de Java que no son usadas actualmente.
** Palabra clave agregada en Java 2

true, false, and null no son palabras claves pero son palabras reservadas, así que tampoco pueden ser utilizadas como identificadores.

Literales

Una literal es un valor constante formado por una secuencia de caracteres. Cualquier declaración en Java que defina un valor constante -un valor que no pueda ser cambiado durante la ejecución del programa- es una literal.

Son ejemplos de literales los números, los caracteres y las cadenas de caracteres.
  • Literales numéricas
    Se pueden crear literales numéricas a partir de cualquier tipo de dato primitivo.
·         Ej.
·         123              //literal int
·         123.456          //literal double
·         123L             //literal long
·         123.456F //literal float
  • Literales booleanas
    Las literales boolenas consisten de las palabras reservadas true y false.
  • Literales de caracteres
    Las literales de caracteres se expresan por un solo caracter entre comillas sencillas
Ej.      'a',    '%',    '7'
  • Literales de cadena
    Una cadena es una combinación de caracteres. Las cadenas en Java son instancias de la clase String, por ello cuentan con métodos que permiten combinar, probar y modificar cadenas con facilidad.
    Las literales de cadena se representan por una secuencia de caracteres entre comillas dobles.
Ej.   "hola",   "cadena123",   "12345"
Expresiones y Operadores
  • Expresión
Una expresión es una combinación de variables, operadores y llamadas de métodos construida de acuerdo a la sintaxis del lenguaje que devuelve un valor.

El tipo de dato del valor regresado por una expresión depende de los elementos usados en la expresión.
  • Operadores
Los operadores son símbolos especiales que por lo común se utilizan en expresiones.
La tabla siguiente muestra los distintos tipos de operadores que utiliza Java.
Operador
Significado
Ejemplo
Operadores aritméticos


+
Suma
a + b
-
Resta
a - b
*
Multiplicación
a * b
/
División
a / b
%
Módulo
a % b
Operadores de asignación


=
Asignación
a = b
+=
Suma y asignación
a += b (a=a + b)
-=
Resta y asignación
a -= b (a=a - b)
*=
Multiplicación y asignación
a *= b (a=a * b)
/=
División y asignación
a / b (a=a / b)
%=
Módulo y asignación
a % b (a=a % b)
Operadores relacionales


==
Igualdad
a == b
!=
Distinto
a != b
< 
Menor que
a < b
>
Mayor que
a > b
<=
Menor o igual que
a <= b
>=
Mayor o igual que
a >= b
Operadores especiales


++
Incremento
a++ (postincremento)
++a   (preincremento)
--
Decremento
a-- (postdecremento)
--a  (predecremento)
(tipo)expr
Cast
a = (int) b
+
Concatenación de cadenas
a = "cad1" + "cad2"
.
Acceso a variables y métodos
a = obj.var1
( )
Agrupación de expresiones
a = (a + b) * c


La tabla siguiente muestra la precedencia asignada a los operadores, éstos son listados en orden de precedencia.

Los operadores en la misma fila tienen igual precedencia
Operador
Notas
.   []   ()
Los corchetes se utilizan para los arreglos
++   --   !   ~
! es el NOT lógico y ~ es el complemento de bits
new (tipo)expr
new se utiliza para crear instancias de clases
*   /   %
Multiplicativos
+ -
Aditivos
<<   >>   >>>
Corrimiento de bits
<   >   <=   >=
Relacionales
==   !=
Igualdad
&
AND (entre bits)
^
OR exclusivo (entre bits)
|
OR inclusivo (entre bits)
&&
AND lógico
||
OR lógico
? :
Condicional
=   +=   -=   *=   /=   %=   &=   ^=   |=   <<=   >>=   >>>=
Asignación
Todos los operadores binarios que tienen la misma prioridad (excepto los operadores de asignación) son evaluados de izquierda a derecha.

Los operadores de asignación son evaluados de derecha a izquierda.
Variables y tipos de datos (1 de 3)

Las variables son localidades de memoria en las que pueden almacenarse datos. Cada una tiene un nombre, un tipo y valor. Java tiene tres tipos de variables: de instancia, de clase y locales.
  • Variables de instancia.

    Se utilizan para definir los atributos de un objeto.
  • Variables de clase.

    Son similares a las variables de instancia, con la excepción de que sus valores son los mismos para todas las instancias de la clase.
  • Variable locales.

    Se declaran y se utilizan dentro de las definiciones de los métodos.
* A diferencia de otros lenguajes, Java no tiene variables globales, es decir , variables que son vistas en cualquier parte del programa.
Variables y tipos de datos (2 de 3)

Java es un lenguaje "fuertemente tipeado o tipificado" por lo que es necesario especificar el tipo de dato para cada una de las variables que se vayan a utilizar en un programa. El nombre de la variable debe de ser un identificador válido, y se usa para referirse a los datos que contiene una variable.

El tipo de una variable determina los valores que puede almacenar y las operaciones que se pueden hacer sobre ella. Para dar a una variable un tipo y un nombre, se escribe una declaración de una variable, que tiene la siguiente forma:
TipoDato nombreVariable;

Ej.

String nombre;         // variable de tipo String
int edad;   // variable de tipo int
Punto p;   // variable del tipo Punto
Se pueden escribir varios nombres de variables del mismo tipo en una sola línea,
int x, y, z;  
String nombre, apellido;  
También se puede asignar un valor inicial a las variables al momento de crearlas,
String nombre, apellido="MiApellido";
int edad = 24;
Variables y tipos de datos (3 de 3)

Las variables en Java pueden ser uno de los siguientes tipos:
  • Tipo primitivo.
Una variable de tipo primitivo contiene un solo valor del tamaño y formato apropiado de su tipo: un número, un carácter, o un valor booleano.
La tabla siguiente lista los tipos de datos primitivos soportados por Java.
Tipo
Descripción
Tamaño/Formato
Números enteros


byte
Entero byte
8-bit 2's
short
Entero corto
16-bit 2's
int
Entero
32-bit 2's
long
Entero largo
64-bit 2's
Números reales


float
Punto flotante
32-bit IEEE 754
double
Punto flotante de doble presición
64-bit IEEE 754
Otros tipos


char
Un solo carácter
16-bit caracteres Unicode
boolean
Un valor booleano
true o false

En Java, cualquier numérico con punto flotante automáticamente se considera double. Para que sea considerado float se agrega una letra "f" o "F" al final del valor.
double d = 10.50;
float f = 10.50F;

  • Referencia.
Los arreglos, las clases y las interfaces son del tipo referencia. El valor de una variable del tipo referencia es una dirección de un conjunto de valores representados por una variable.

Las referencias en Java no son como en C++, éstas son identificadores de instancias de alguna clase en particular.
Ej.

String  cad;     //referencia a un objeto de la clase String
Punto  p;     //referencia a un objeto de la clase Punto      
int[]  var_arreglo;   //referencia a un arreglo de enteros
Bloques y sentencias (1 de 6)
  • Sentencia

    Una instrucción o sentencia representa la tarea más sencilla que se puede realizar en un programa.
  • Sentencias de expresión
Los siguientes tipos de expresiones pueden ser hechas dentro de una sentencia terminando la expresión con punto y coma (;):

* Expresiones de asignación
* Cualquier uso de los operadores ++ y --
* Llamada de métodos
* Expresiones de creación de objetos

Esta clase de sentencias son llamadas sentencias de expresión.
Ej.

valorA = 8933.234;           // asignación
valorA++;                    // incremento
System.out.println(valorA);  // llamada a un método
Integer objInt = new Integer(4); // creación de objetos
  • Sentencias de declaración de variables
Las sentencias de declaración de variables se utilizan para declarar variables.
Ej.

int  bValue;
double  aValue = 8933.234; 
String varCad;
  • Sentencias de control de flujo
Las sentencias de control de flujo determinan el orden en el cual serán ejecutadas otro grupo de sentencias. Las sentencias if y for son ejemplos de sentencias de control de flujo.
  • Bloque de sentencias
Un bloque es un grupo de cero o más sentencias encerradas entre llaves ( { y } ). Se puede poner un bloque de sentencias en cualquier lugar en donde se pueda poner una sentencia individual.
Bloques y sentencias (2 de 6)

Las sentencias de control de flujo se pueden utilizar para ejecutar sentencias condicionalmente, para ejecutar de manera repetida un bloque de sentencias y en general para cambiar la secuencia normal de un programa.
  • La sentencia if

    La sentencia if permite llevar a cabo la ejecución condicional de sentencias.
·         if ( Expresion ){
·            sentencias;
·         }
Se ejecutan las sentencias si al evaluar la expresión se obtiene un valor booleano true.
if ( Expresion ){
   sentenciasA;
}
else{
   sentenciasB;
}
Si al evaluar la expresión se obtiene un valor booleano true se ejecutarán las sentenciasA, en caso contrario se ejecutarán las sentenciasB.
Bloques y sentencias (3 de 6)
  • La sentencia switch
Cuando se requiere comparar una variable con una serie de valores diferentes, puede utilizarse la sentencia switch, en la que se indican los posibles valores que puede tomar la variable y las sentencias que se tienen que ejecutar sí es que la variable coincide con alguno de dichos valores.
switch( variable ){
  case valor1:
         sentencias;
  break;
  case valor2:
         sentencias;
  break;

         ...
        
  case valorN:
         sentencias;
  break; 
  default:
         sentencias;
}
Cada case ejecutará las sentencias correspondientes, con base en el valor de la variable, que deberá de evaluarse con valores de tipo byte, char, short o int.

Si el valor de la variable no coincide con ningún valor, entonces se ejecutan las sentencias por default, sí es que las hay.

La sentencia break al final de cada case transfiere el control al final de la sentencia switch; de esta manera, cada vez que se ejecuta un case todos los enunciados case restantes son ignorados y termina la operación del switch.
Bloques y sentencias (4 de 6)
  • El ciclo for
El ciclo for repite una sentencia, o un bloque de sentencias, mientras una condición se cumpla. Se utiliza la mayoría de las veces cuando se desea repetir una sentencia un determinado número de veces.

La forma general de la sentencia for es la siguiente;
for(inicialización;condición;incremento){
   sentencias;
}
* En su forma más simple, la inicialización es una sentencia de asignación que se utiliza para establecer una variable que controle el ciclo.

* La condición es una expresión que comprueba la variable que controla el ciclo y determinar cuando salir del ciclo.

* El incremento define la manera en como cambia la variable que controla el ciclo.
Bloques y sentencias (5 de 6)

Los ciclos while y do-while, al igual que los ciclos for repiten la ejecución de un bloque de sentencias mientras se cumpla una condición específica.
  • La sentencia while

    El formato de la sentencia while es la siguiente:
·         while (condición){
·            sentencias;
·         }
La condición es una condición booleana, que mientras tenga el valor true permite que se ejecuten las sentencias correspondientes.
  • La sentencia do-while
Al contrario de los ciclos for y while que comprueban una condición en lo alto del ciclo, el ciclo do-while la examina en la parte más baja del mismo. Esta característica provoca que un ciclo do-while siempre se ejecute por lo menos una vez.

El formato de la sentencia do-while es el siguiente:
do{
   sentencias;
}while (condición);




Bloques y sentencias (6 de 6)
  • break
La sentencia break tiene dos usos. El primer uso es terminar un case en la sentencia switch. El segundo es forzar la terminación inmediata de un ciclo, saltando la prueba condicional normal del ciclo.
  • continue
La sentencia continue es similar a la sentencia break. Sin embargo, en vez de forzar la terminación del ciclo, continue forza la siguiente iteración y salta cualquier código entre medias.
  • return
Se utiliza la sentencia return para provocar la salida del método actual; es decir, return provocará que el programa vuelva al código que llamó al método.

La sentencia return puede regresar o no un valor. Para devolver un valor, se pone el valor después de la palabra clave return.
   return valor;
El tipo de dato del valor regresado debe ser el mismo que el que se especifica en la declaración del método.

Cuando un método es declarado void, el método no regresa ningún valor.
   return;


Parte 2 (Lectura para los cursos: 3º y 2º)
LIBRERIAS JAVA
La palabra clave package permite agrupar clases e interfaces. Los nombres de los paquetes son palabras separadas por puntos y se almacenan en directorios que coinciden con esos nombres.
Por ejemplo, los ficheros siguientes, que contienen código fuente Java:
Applet.java, AppletContext.java, AppletStub.java, AudioClip.java
contienen en su código la línea:
    package java.applet;
Y las clases que se obtienen de la compilación de los ficheros anteriores, se encuentran con el nombre nombre_de_clase.class, en el directorio:
java/applet


Los paquetes de clases se cargan con la palabra clave import, especificando el nombre del paquete como ruta y nombre de clase (es lo mismo que #include de C/C++). Se pueden cargar varias clases utilizando un asterisco.
    import java.Date;
    import java.awt.*;
Si un fichero fuente Java no contiene ningún package, se coloca en el paquete por defecto sin nombre. Es decir, en el mismo directorio que el fichero fuente, y la clase puede ser cargada con la sentencia import:
    import MiClase;


El lenguaje Java proporciona una serie de paquetes que incluyen ventanas, utilidades, un sistema de entrada/salida general, herramientas y comunicaciones. En la versión actual del JDK, los paquetes Java que se incluyen son:
ü  java.applet
Este paquete contiene clases diseñadas para usar con applets. Hay una clase Applet y tres interfaces: AppletContext, AppletStub y AudioClip.
ü  java.awt
El paquete Abstract Windowing Toolkit (awt) contiene clases para generar widgets y componentes GUI (Interfaz Gráfico de Usuario). Incluye las clases Button, Checkbox, Choice, Component, Graphics, Menu, Panel, TextArea y TextField.
ü  java.io
El paquete de entrada/salida contiene las clases de acceso a ficheros: FileInputStream y FileOutputStream.
ü  java.lang
Este paquete incluye las clases del lenguaje Java propiamente dicho: Object, Thread, Exception, System, Integer, Float, Math, String, etc.
ü  java.net
Este paquete da soporte a las conexiones del protocolo TCP/IP y, además, incluye las clases Socket, URL y URLConnection.
ü  java.util
Este paquete es una miscelánea de clases útiles para muchas cosas en programación. Se incluyen, entre otras, Date (fecha), Dictionary (diccionario), Random (números aleatorios) y Stack (pila FIFO).
----------------------------------------------------------------------------------------------------------
Modelos de Frames y Applets, se pueden construir usando cualquiera de las dos galerias de componentes visuales que proporciona java, estas librerias visuales, son:
1.- JAVA AWT es la libreria visual mas antigua de java usando esta libreria, se podran construir los tres tipos de programas mas comunes como son FRAME, WINDOW y APPLET.
2.- JAVA SWING es la libreria de componentes visuales mas nueva que proporciona java, usando esta libreria se podran construir los tres tipos de programas o aplicaciones que son JFRAME, JWINDOW y JAPPLET.
un applet es un programa un java que se manda a una maquina o pc remota para que lo ejecute o lo corra, cuando este applet le llega a la maquina remota via un browser, dicho browser es quien activa la maquina virtual de java que esta en la pc remota y esta maquina virtual ya da la orden de compilación y ejecución, es decir java programa.applet.
Entonces es importante que la maquina virtual de java, que se encuentra en la pc remota, tenga capacidad de incluir todas las librerias de java, como la de math, la de awt, la de lang, etc.
La triste historia, es que la maquina virtual de java (revisen su folder program files o windows y ahi la encuentran), les llega a travez de microsoft a las pc remotas, y por el pleito sun-microsoft, estos ultimos estan mandando una maquina virtual de java antigua que solo tiene incluido awt y no swing.
Entonces no tiene caso que hagan un programa applet muy bonito con componentes swings, lo manden a una pc remota y esta ultima no lo pueda compilar y ejecutar porque no reconoce la libreria swing.
Lo que esta haciendo la compañia sun para resolver este problema es proporcionar a quien lo pida una maquina virtual de java actualizada (llamada webstar ) gratis y a quien la quiera, pero no podemos construir progamas o applets que no vayan a correr en todas las pcs, mientras ellos arreglan el pleito, estamos condenados a usar JAVA AWT.
Librerías ("Packages") y JAR's.
Conforme empieza a crecer un desarrollo de Software surge la necesidad de reutilizar ciertos componentes que ya han sido escritos, así como dar cierta estructura para mantener una organización de código; al igual que otros lenguajes, esta organización se lleva acabo mediante librerías, denominadas "packages" en el mundo Java .
Java toma una perspectiva nueva respecto a otros lenguajes, adoptando una convención a partir de Dominios en Internet, esto es, nuestros programas y por ende librerías ("packages") estarán basados en el nombre de la empresa/dominio para la cual son diseñados, lo anterior permite evitar la tan conocida Colisión de Nombres en Software.
Esta Colisión de Nombres se da cuando dos Clases llevan el mismo nombre y ambas requieren ser utilizadas dentro de un programa en particular, empleando Dominios en Internet se garantiza que el nombre de la Clase/Librería sea única , puesto que es una característica de Dominios en Internet.
Para que puedan ser asignadas Clases a determinadas librerías es necesario indicar dicha Librería("Package") en la definición inicial de un programa, además de esto, es necesario crear una estructura de directorios para generar las determinadas Clases;
Una vez acumuladas un número substancial de Clases en una Librería("Package") será necesario colocarlas en una estructura que permita una distribución fácil y práctica, esto es, si ha generado 100 o 500 clases sería muy impráctico distribuir la estructura de directorios a un tercero para ser utilizada, para este problema han sido diseñados los archivos JAR ("Java Archives").
La Variable CLASSPATH.
Al utilizar Clases y Librerías en ambientes Java surge otro tema en lo que concierne a su ubicación: Cuales Clases/Librerías están disponibles al momento de Compilar/Ejecutar programas Java ? , la respuesta a esta pregunta es la conocida variable CLASSPATH.
A través de esta variable se indica donde residen las Clases/Librerías("Packages") de nuestro ambiente, en ella se definen los directorios base de Clases así como cualquier archivo JAR que requiera ser cargado al compilar/ejecutar programas Java.
Para definir/alterar esta variable existen dos alternativas: Definirse al nivel de Sistema en variables de ambientales o al tiempo de invocarse un comando Java, ya sea java o javac