Lenguaje de Programación. Java

66
PDF generado usando el kit de herramientas de fuente abierta mwlib. Ver http://code.pediapress.com/ para mayor información. PDF generated at: Sun, 28 Apr 2013 16:20:09 UTC Lenguaje de Programación. Java

Transcript of Lenguaje de Programación. Java

Page 1: Lenguaje de Programación. Java

PDF generado usando el kit de herramientas de fuente abierta mwlib. Ver http://code.pediapress.com/ para mayor información.PDF generated at: Sun, 28 Apr 2013 16:20:09 UTC

Lenguaje de Programación.Java

Page 2: Lenguaje de Programación. Java

ContenidosArtículos

Programación 1Sistema binario 5Lenguaje de programación 17Código fuente 26Compilador 27Intérprete (informática) 34Lenguaje de máquina 37Depuración de programas 38Java (lenguaje de programación) 39

ReferenciasFuentes y contribuyentes del artículo 62Fuentes de imagen, Licencias y contribuyentes 63

Licencias de artículosLicencia 64

Page 3: Lenguaje de Programación. Java

Programación 1

ProgramaciónLa programación es el proceso de diseñar, codificar, depurar y mantener el código fuente de programascomputacionales. El código fuente es escrito en un lenguaje de programación. El propósito de la programación escrear programas que exhiban un comportamiento deseado. El proceso de escribir código requiere frecuentementeconocimientos en varias áreas distintas, además del dominio del lenguaje a utilizar, algoritmos especializados ylógica formal. Programar no involucra necesariamente otras tareas tales como el análisis y diseño de la aplicación(pero sí el diseño del código), aunque sí suelen estar fusionadas en el desarrollo de pequeñas aplicaciones.

HistoriaPara crear un programa, y que la computadora lo interprete y ejecute las instrucciones escritas en él, debe usarse unlenguaje de programación. En sus inicios las computadoras interpretaban sólo instrucciones en un lenguajeespecífico, del más bajo nivel, conocido como código máquina, siendo éste excesivamente complicado paraprogramar. De hecho sólo consiste en cadenas de números 1 y 0 (sistema binario). Para facilitar el trabajo deprogramación, los primeros científicos que trabajaban en el área decidieron reemplazar las instrucciones, secuenciasde unos y ceros, por palabras o letras provenientes del inglés; las codificaron y crearon así un lenguaje de mayornivel, que se conoce como Assembly o lenguaje ensamblador. Por ejemplo, para sumar se usa la letra A de la palabrainglesa add (sumar). En realidad escribir en lenguaje ensamblador es básicamente lo mismo que hacerlo en lenguajemáquina, pero las letras y palabras son bastante más fáciles de recordar y entender que secuencias de númerosbinarios. A medida que la complejidad de las tareas que realizaban las computadoras aumentaba, se hizo necesariodisponer de un método sencillo para programar. Entonces, se crearon los lenguajes de alto nivel. Mientras que unatarea tan trivial como multiplicar dos números puede necesitar un conjunto de instrucciones en lenguajeensamblador, en un lenguaje de alto nivel bastará con solo una. Una vez que se termina de escribir un programa, seaen ensamblador o en un lenguaje de alto nivel, es necesario compilarlo, es decir, traducirlo a lenguaje máquina.[1]

Léxico y programaciónLa programación se rige por reglas y un conjunto más o menos reducido de órdenes, expresiones, instrucciones ycomandos que tienden a asemejarse a una lengua natural acotada (en inglés); y que además tienen la particularidadde una reducida ambigüedad. Cuanto menos ambiguo es un lenguaje de programación, se dice, es más potente. Bajoesta premisa, y en el extremo, el lenguaje más potente existente es el binario, con ambigüedad nula (lo cual lleva apensar así del lenguaje ensamblador).En los lenguajes de programación de alto nivel se distinguen diversos elementos entre los que se incluyen el léxicopropio del lenguaje y las reglas semánticas y sintácticas.

Programas y algoritmosUn algoritmo es una secuencia no ambigua, finita y ordenada de instrucciones que han de seguirse para resolver unproblema. Un programa normalmente implementa (traduce a un lenguaje de programación concreto) uno o másalgoritmos. Un algoritmo puede expresarse de distintas maneras: en forma gráfica, como un diagrama de flujo, enforma de código como en pseudocódigo o un lenguaje de programación, en forma explicativa, etc.Los programas suelen subdividirse en partes menores, llamadas módulos, de modo que la complejidad algorítmica decada una de las partes sea menor que la del programa completo, lo cual ayuda al desarrollo del programa. Esta es unapráctica muy utilizada y se conoce como "refino progresivo".Según Niklaus Wirth, un programa está formado por los algoritmos y la estructura de datos.

Page 4: Lenguaje de Programación. Java

Programación 2

Se han propuesto diversas técnicas de programación cuyo objetivo es mejorar tanto el proceso de creación desoftware como su mantenimiento. Entre ellas, se pueden mencionar las siguientes:•• programación declarativa•• programación estructurada•• programación modular•• programación orientada a objetos

CompilaciónEl programa escrito en un lenguaje de programación (fácilmente comprensible por el programador) es llamadoprograma fuente y no se puede ejecutar directamente en una computadora. La opción más común es compilar elprograma obteniendo un módulo objeto, aunque también puede ejecutarse en forma más directa a través de unintérprete informático.El código fuente del programa se debe someter a un proceso de traducción para convertirlo en lenguaje máquina,código esté directamente ejecutable por el procesador. A este proceso se le llama compilación.Habitualmente la creación de un programa ejecutable (un típico.exe para Microsoft Windows o DOS) conlleva dospasos. El primer paso se llama compilación (propiamente dicho) y traduce el código fuente escrito en un lenguaje deprogramación almacenado en un archivo a código en bajo nivel (normalmente en código objeto, no directamente alenguaje máquina). El segundo paso se llama enlazado en el cual se enlaza el código de bajo nivel generado de todoslos ficheros y subprogramas que se han mandado compilar y se añade el código de las funciones que hay en lasbibliotecas del compilador para que el ejecutable pueda comunicarse directamente con el sistema operativo,traduciendo así finalmente el código objeto a código máquina, y generando un módulo ejecutable.Estos dos pasos se pueden hacer por separado, almacenando el resultado de la fase de compilación en archivosobjetos (un típico.obj para Microsoft Windows, DOS o para Unix); para enlazarlos en fases posteriores, o creardirectamente el ejecutable; con lo que la fase de compilación se almacena sólo temporalmente. Un programa podríatener partes escritas en varios lenguajes (por ejemplo C, C++ y ensamblador), que se podrían compilar de formaindependiente y luego enlazar juntas para formar un único módulo ejecutable.

Programación e ingeniería del softwareExiste una tendencia a identificar el proceso de creación de un programa informático con la programación, que escierta cuando se trata de programas pequeños para uso personal, y que dista de la realidad cuando se trata de grandesproyectos.El proceso de creación de software, desde el punto de vista de la ingeniería, incluye los siguientes pasos:1.1. Reconocer la necesidad de un programa para solucionar un problema o identificar la posibilidad de

automatización de una tarea.2.2. Recoger los requisitos del programa. Debe quedar claro qué es lo que debe hacer el programa y para qué se

necesita.3.3. Realizar el análisis de los requisitos del programa. Debe quedar claro cómo debe realizar el programa las cosas

que debe hacer. Las pruebas que comprueben la validez del programa se pueden especificar en esta fase.4.4. Diseñar la arquitectura del programa. Se debe descomponer el programa en partes de complejidad abordable.5.5. Implementar el programa. Consiste en realizar un diseño detallado, especificando completamente todo el

funcionamiento del programa, tras lo cual la codificación (programación propiamente dicha) debería resultarinmediata.

6.6. Implantar (instalar) el programa. Consiste en poner el programa en funcionamiento junto con los componentesque pueda necesitar (bases de datos, redes de comunicaciones, etc.).

Page 5: Lenguaje de Programación. Java

Programación 3

La ingeniería del software se centra en los pasos de planificación y diseño del programa, mientras que antiguamente(programación artesanal) la realización de un programa consistía casi únicamente en escribir el código, bajo sólo elconocimiento de los requisitos y con una modesta fase de análisis y diseño.

Referencias históricasLa primera programadora de computadoras conocida fue Ada Lovelace, hija de Anabella Milbanke Byron y LordByron. Anabella introdujo en las matemáticas a Ada quien, después de conocer a Charles Babbage, tradujo y amplióuna descripción de su máquina analítica. Incluso, aunque Babbage nunca completó la construcción de cualquiera desus máquinas, el trabajo que Ada realizó con éstas le hizo ganarse el título de primera programadora decomputadoras del mundo. El nombre del lenguaje de programación Ada fue escogido como homenaje a estaprogramadora.Este proceso está aplicado a todos los métodos científicos que actualmente se practican.

Objetivos de la programaciónLa programación debe perseguir la obtención de programas de calidad. Para ello se establece una serie de factoresque determinan la calidad de un programa. Algunos de los factores de calidad más importantes son los siguientes:• Corrección. Un programa es correcto si hace lo que debe hacer tal y como se estableció en las fases previas a su

desarrollo. Para determinar si un programa hace lo que debe, es muy importante especificar claramente qué debehacer el programa antes de desarrollarlo y, una vez acabado, compararlo con lo que realmente hace.

• Claridad. Es muy importante que el programa sea lo más claro y legible posible, para facilitar así su desarrollo yposterior mantenimiento. Al elaborar un programa se debe intentar que su estructura sea sencilla y coherente, asícomo cuidar el estilo en la edición; de esta forma se ve facilitado el trabajo del programador, tanto en la fase decreación como en las fases posteriores de corrección de errores, ampliaciones, modificaciones, etc. Fases quepueden ser realizadas incluso por otro programador, con lo cual la claridad es aún más necesaria para que otrosprogramadores puedan continuar el trabajo fácilmente. Algunos programadores llegan incluso a utilizar ArteASCII para delimitar secciones de código. Otros, por diversión o para impedir un análisis cómodo a otrosprogramadores, recurren al uso de código ofuscado.

• Eficiencia. Se trata de que el programa, además de realizar aquello para lo que fue creado (es decir, que seacorrecto), lo haga gestionando de la mejor forma posible los recursos que utiliza. Normalmente, al hablar deeficiencia de un programa, se suele hacer referencia al tiempo que tarda en realizar la tarea para la que ha sidocreado y a la cantidad de memoria que necesita, pero hay otros recursos que también pueden ser de consideraciónal obtener la eficiencia de un programa, dependiendo de su naturaleza (espacio en disco que utiliza, tráfico de redque genera, etc.).

• Portabilidad. Un programa es portable cuando tiene la capacidad de poder ejecutarse en una plataforma, ya seahardware o software, diferente a aquélla en la que se elaboró. La portabilidad es una característica muy deseablepara un programa, ya que permite, por ejemplo, a un programa que se ha desarrollado para sistemas GNU/Linuxejecutarse también en la familia de sistemas operativos Windows. Esto permite que el programa pueda llegar amás usuarios más fácilmente.

Page 6: Lenguaje de Programación. Java

Programación 4

Ciclo de vida del softwareEl término ciclo de vida del software describe el desarrollo de software, desde la fase inicial hasta la fase final. Elpropósito de este programa es definir las distintas fases intermedias que se requieren para validar el desarrollo de laaplicación, es decir, para garantizar que el software cumpla los requisitos para la aplicación y verificación de losprocedimientos de desarrollo: se asegura de que los métodos utilizados son apropiados. Estos programas se originanen el hecho de que es muy costoso rectificar los errores que se detectan tarde dentro de la fase de implementación. Elciclo de vida permite que los errores se detecten lo antes posible y por lo tanto, permite a los desarrolladoresconcentrarse en la calidad del software, en los plazos de implementación y en los costos asociados. El ciclo de vidabásico de un software consta de los siguientes procedimientos:•• Definición de objetivos: definir el resultado del proyecto y su papel en la estrategia global.•• Análisis de los requisitos y su viabilidad: recopilar, examinar y formular los requisitos del cliente y examinar

cualquier restricción que se pueda aplicar.•• Diseño general: requisitos generales de la arquitectura de la aplicación.•• Diseño en detalle: definición precisa de cada subconjunto de la aplicación.•• Programación (programación e implementación): es la implementación de un lenguaje de programación para

crear las funciones definidas durante la etapa de diseño.•• Prueba de unidad: prueba individual de cada subconjunto de la aplicación para garantizar que se implementaron

de acuerdo con las especificaciones.•• Integración: para garantizar que los diferentes módulos se integren con la aplicación. Éste es el propósito de la

prueba de integración que está cuidadosamente documentada.•• Prueba beta (o validación), para garantizar que el software cumple con las especificaciones originales.•• Documentación: sirve para documentar información necesaria para los usuarios del software y para desarrollos

futuros.•• Mantenimiento: para todos los procedimientos correctivos (mantenimiento correctivo) y las actualizaciones

secundarias del software (mantenimiento continuo).El orden y la presencia de cada uno de estos procedimientos en el ciclo de vida de una aplicación dependen del tipode modelo de ciclo de vida acordado entre el cliente y el equipo de desarrolladores.

Referencias

Enlaces externos• Wikimedia Commons alberga contenido multimedia sobre Programación. Commons• Wikcionario tiene definiciones para programación.Wikcionario• Wikiquote alberga frases célebres de o sobre Programación. WikiquoteWikilibros• Wikilibros alberga un libro o manual sobre Fundamentos de programación.

Page 7: Lenguaje de Programación. Java

Sistema binario 5

Sistema binarioEl sistema binario, en ciencias e informática, es un sistema de numeración en el que los números se representanutilizando solamente las cifras cero y uno (0 y 1). Es el que se utiliza en las computadoras, debido a que trabajaninternamente con dos niveles de voltaje, por lo cual su sistema de numeración natural es el sistema binario(encendido 1, apagado 0).

Historia del sistema binario

Página del artículo Explication de l'Arithmétique Binaire deLeibniz.

El antiguo matemático indio Pingala presentó la primeradescripción que se conoce de un sistema de numeraciónbinario en el siglo tercero antes de nuestra era, lo cualcoincidió con su descubrimiento del concepto del númerocero

Una serie completa de 8 trigramas y 64 hexagramas(análogos a 3 bit) y números binarios de 6 bit eranconocidos en la antigua China en el texto clásico del IChing. Series similares de combinaciones binarias tambiénhan sido utilizadas en sistemas de adivinación tradicionalesafricanos, como el Ifá, así como en la geomancia medievaloccidental.

Un arreglo binario ordenado de los hexagramas del I Ching,representando la secuencia decimal de 0 a 63, y un métodopara generar el mismo fue desarrollado por el erudito yfilósofo Chino Shao Yong en el siglo XI.

En 1605 Francis Bacon habló de un sistema por el cual lasletras del alfabeto podrían reducirse a secuencias de dígitosbinarios, las cuales podrían ser codificadas comovariaciones apenas visibles en la fuente de cualquier textoarbitrario.

El sistema binario moderno fue documentado en su totalidad por Leibniz, en el siglo XVII, en su artículo"Explication de l'Arithmétique Binaire". En él se mencionan los símbolos binarios usados por matemáticos chinos.Leibniz utilizó el 0 y el 1, al igual que el sistema de numeración binario actual.

En 1854, el matemático británico George Boole publicó un artículo que marcó un antes y un después, detallando unsistema de lógica que terminaría denominándose Álgebra de Boole. Dicho sistema desempeñaría un papelfundamental en el desarrollo del sistema binario actual, particularmente en el desarrollo de circuitos electrónicos.

Page 8: Lenguaje de Programación. Java

Sistema binario 6

AplicacionesEn 1937, Claude Shannon realizó su tesis doctoral en el MIT, en la cual implementaba el Álgebra de Boole yaritmética binaria utilizando relés y conmutadores por primera vez en la historia. Titulada Un Análisis Simbólico deCircuitos Conmutadores y Relés, la tesis de Shannon básicamente fundó el diseño práctico de circuitos digitales.En noviembre de 1937, George Stibitz, trabajando por aquel entonces en los Laboratorios Bell, construyó unacomputadora basada en relés —a la cual apodó "Modelo K" (porque la construyó en una cocina, en inglés"kitchen")— que utilizaba la suma binaria para realizar los cálculos. Los Laboratorios Bell autorizaron un completoprograma de investigación a finales de 1938, con Stibitz al mando.El 8 de enero de 1940 terminaron el diseño de una "Calculadora de Números Complejos", la cual era capaz derealizar cálculos con números complejos. En una demostración en la conferencia de la Sociedad Americana deMatemáticas, el 11 de septiembre de 1940, Stibitz logró enviar comandos de manera remota a la Calculadora deNúmeros Complejos a través de la línea telefónica mediante un teletipo. Fue la primera máquina computadorautilizada de manera remota a través de la línea de teléfono. Algunos participantes de la conferencia que presenciaronla demostración fueron John von Neumann, John Mauchly y Norbert Wiener, quien escribió acerca de dicho sucesoen sus diferentes tipos de memorias en la cual alcanzó diferentes logros.

Representaciónejemplo: el sistema binario puede ser representado solo por dos digitosUn número binario puede ser representado por cualquier secuencia de bits (dígitos binarios), que suelen representarcualquier mecanismo capaz de usar dos estados mutuamente excluyentes. Las siguientes secuencias de símbolospodrían ser interpretadas como el mismo valor numérico binario:

1 0 1 0 0 1 1 0 1 0

| - | - - | | - | -

x o x o o x x o x o

y n y n n y y n y n

El valor numérico representado en cada caso depende del valor asignado a cada símbolo. En una computadora, losvalores numéricos pueden representar dos voltajes diferentes; también pueden indicar polaridades magnéticas sobreun disco magnético. Un "positivo", "sí", o "sobre el estado" no es necesariamente el equivalente al valor numérico deuno; esto depende de la nomenclatura usada.De acuerdo con la representación más habitual, que es usando números árabes, los números binarios comúnmenteson escritos usando los símbolos 0 y 1. Los números binarios se escriben a menudo con subíndices, prefijos o sufijospara indicar su base. Las notaciones siguientes son equivalentes:•• 100101 binario (declaración explícita de formato)•• 100101b (un sufijo que indica formato binario)•• 100101B (un sufijo que indica formato binario)•• bin 100101 (un prefijo que indica formato binario)• 1001012 (un subíndice que indica base 2 (binaria) notación)•• %100101 (un prefijo que indica formato binario)•• 0b100101 (un prefijo que indica formato binario, común en lenguajes de programación)

Page 9: Lenguaje de Programación. Java

Sistema binario 7

Conversión entre binario y decimal

Decimal a binarioSe divide el número del sistema decimal entre 2, cuyo resultado entero se vuelve a dividir entre 2, y asísucesivamente hasta que el dividendo sea menor que el divisor, 2. Es decir, cuando el número a dividir sea 1 finalizala división.A continuación se ordenan los restos empezando desde el último al primero, simplemente se colocan en ordeninverso a como aparecen en la división, se les da la vuelta. Éste será el número binario que buscamos.Ejemplo

Transformar el número decimal 131 en binario. El método es muy simple:

131 dividido entre 2 da 65 y el resto es igual a 1

65 dividido entre 2 da 32 y el resto es igual a 1

32 dividido entre 2 da 16 y el resto es igual a 0

16 dividido entre 2 da 8 y el resto es igual a 0

8 dividido entre 2 da 4 y el resto es igual a 0

4 dividido entre 2 da 2 y el resto es igual a 0

2 dividido entre 2 da 1 y el resto es igual a 0

1 dividido entre 2 da 0 y el resto es igual a 1

-> Ordenamos los restos, del último al primero: 10000011

En sistema binario, 131 se escribe 10000011Ejemplo

Transformar el número decimal 100 en binario.

Otra forma de conversión consiste en un método parecido a la factorización en números primos. Es relativamentefácil dividir cualquier número entre 2. Este método consiste también en divisiones sucesivas. Dependiendo de si elnúmero es par o impar, colocaremos un cero o un uno en la columna de la derecha. Si es impar, le restaremos uno yseguiremos dividiendo entre dos, hasta llegar a 1. Después sólo nos queda tomar el último resultado de la columnaizquierda (que siempre será 1) y todos los de la columna de la derecha y ordenar los dígitos de abajo a arriba.Ejemplo

100|0

50|0

25|1 --> 1, 25-1=24 y seguimos dividiendo entre 2

12|0

Page 10: Lenguaje de Programación. Java

Sistema binario 8

6|0

3|1

1|1 -->

Existe un último método denominado de distribución. Consiste en distribuir los unos necesarios entre las potenciassucesivas de 2 de modo que su suma resulte ser el número decimal a convertir. Sea por ejemplo el número 151, parael que se necesitarán las 8 primeras potencias de 2, ya que la siguiente, 28=256, es superior al número a convertir. Secomienza poniendo un 1 en 128, por lo que aún faltarán 23, 151-128 = 23, para llegar al 151. Este valor seconseguirá distribuyendo unos entre las potencias cuya suma dé el resultado buscado y poniendo ceros en el resto.En el ejemplo resultan ser las potencias 4, 2, 1 y 0, esto es, 16, 4, 2 y 1, respectivamente.Ejemplo

20= 1|0

21= 2|0

22= 4|0

23= 8|0

24= 16|0

25= 32|0

26= 64|0

27= 128|1

Decimal (con decimales) a binarioPara transformar un número del sistema decimal al sistema binario:1.1. Se transforma la parte entera a binario. (Si la parte entera es 0 en binario será 0, si la parte entera es 1 en binario

será 1, si la parte entera es 5 en binario será 101 y así sucesivamente).2.2. Se sigue con la parte fraccionaria, multiplicando cada número por 2. Si el resultado obtenido es mayor o igual a 1

se anota como un uno (1) binario. Si es menor que 1 se anota como un 0 binario. (Por ejemplo, al multiplicar 0.6por 2 obtenemos como resultado 1.2 lo cual indica que nuestro resultado es un uno (1) en binario, solo se toma laparte entera del resultado).

3.3. Después de realizar cada multiplicación, se colocan los números obtenidos en el orden de su obtención.4.4. Algunos números se transforman en dígitos periódicos, por ejemplo: el 0.1.Ejemplo

0,3125 (decimal) => 0,0101 (binario).

Proceso:

0,3125 · 2 = 0,625 => 0

0,625 · 2 = 1,25 => 1

0,25 · 2 = 0,5 => 0

0,5 · 2 = 1 => 1

En orden: 0101 -> 0,0101 (binario)

Ejemplo

0,1 (decimal) => 0,0 0011 0011 ... (binario).

Proceso:

0,1 · 2 = 0,2 ==> 0

0,2 · 2 = 0,4 ==> 0

0,4 · 2 = 0,8 ==> 0

0,8 · 2 = 1,6 ==> 1

Page 11: Lenguaje de Programación. Java

Sistema binario 9

0,6 · 2 = 1,2 ==> 1

0,2 · 2 = 0,4 ==> 0 <--se repiten las cuatro cifras, periódicamente

0,4 · 2 = 0,8 ==> 0 <-

0,8 · 2 = 1,6 ==> 1 <-

0,6 · 2 = 1,2 ==> 1 <- ...

En orden: 0 0011 0011 ... => 0,0 0011 0011 ... (binario periódico)

Ejemplo

5.5 = 5,5

5,5 (decimal) => 101,1 (binario).

Proceso:

5 => 101

0,5 · 2 = 1 => 1

En orden: 1 (un sólo dígito fraccionario) -> 101,1 (binario)

Ejemplo

6,83 (decimal) => 110,110101000111 (binario).

Proceso:

6 => 110

0,83 · 2 = 1,66 => 1

0,66 · 2 = 1,32 => 1

0,32 · 2 = 0,64 => 0

0,64 · 2 = 1,28 => 1

0,28 · 2 = 0,56 => 0

0,56 · 2 = 1,12 => 1

0,12 · 2 = 0,24 => 0

0,24 · 2 = 0,48 => 0

0,48 · 2 = 0,96 => 0

0,96 · 2 = 1,92 => 1

0,92 · 2 = 1,84 => 1

0,84 · 2 = 1,68 => 1

En orden: 110101000111 (binario)

Parte entera: 110 (binario)

Encadenando parte entera y fraccionaria: 110,110101000111 (binario)

Binario a decimalPara realizar la conversión de binario a decimal, realice lo siguiente:1. Inicie por el lado derecho del número en binario, cada cifra multiplíquela por 2 elevado a la potencia consecutiva

(comenzando por la potencia 0, 20).2.2. Después de realizar cada una de las multiplicaciones, sume todas y el número resultante será el equivalente al

sistema decimal.Ejemplos:•• (Los números de arriba indican la potencia a la que hay que elevar 2)

Page 12: Lenguaje de Programación. Java

Sistema binario 10

También se puede optar por utilizar los valores que presenta cada posición del número binario a ser transformado,comenzando de derecha a izquierda, y sumando los valores de las posiciones que tienen un 1.EjemploEl número binario 1010010 corresponde en decimal al 82. Se puede representar de la siguiente manera:

entonces se suman los números 64, 16 y 2:

Para cambiar de binario con decimales a decimal se hace exactamente igual, salvo que la posición cero (en la que eldos es elevado a la cero) es la que está a la izquierda de la coma y se cuenta hacia la derecha a partir de -1:

Binario a decimal (con parte fraccionaria binaria)1. Inicie por el lado izquierdo (la primera cifra a la derecha de la coma), cada número multiplíquelo por 2 elevado ala potencia consecutiva a la inversa (comenzando por la potencia -1, 2-1).2.Después de realizar cada una de las multiplicaciones, sume todas y el número resultante será el equivalente alsistema decimal.Ejemplos•• 0,101001 (binario) = 0,640625(decimal). Proceso:

1 · 2 elevado a -1 = 0,5

0 · 2 elevado a -2 = 0

1 · 2 elevado a -3 = 0,125

0 · 2 elevado a -4 = 0

0 · 2 elevado a -5 = 0

1 · 2 elevado a -6 = 0,015625

La suma es: 0,640625

•• 0,110111 (binario) = 0,859375(decimal). Proceso:

1 · 2 elevado a -1 = 0,5

1 · 2 elevado a -2 = 0,25

0 · 2 elevado a -3 = 0

1 · 2 elevado a -4 = 0,0625

1 · 2 elevado a -5 = 0,03125

1 · 2 elevado a -6 = 0,015625

La suma es: 0,859375

Page 13: Lenguaje de Programación. Java

Sistema binario 11

Operaciones con números binarios

Suma de números binariosLa tabla de sumar para números binarios es la siguiente:

+   0   1

0 0 1

1 1 10

Las posibles combinaciones al sumar dos bits son:•• 0 + 0 = 0•• 0 + 1 = 1•• 1 + 0 = 1•• 1 + 1 = 10Note que al sumar 1 + 1 es 102, es decir, llevamos 1 a la siguiente posición de la izquierda (acarreo). Esto esequivalente, en el sistema decimal a sumar 9 + 1, que da 10: cero en la posición que estamos sumando y un 1 deacarreo a la siguiente posición.Ejemplo

1

10011000

+ 00010101

——————————— 10101101

Se puede convertir la operación binaria en una operación decimal, resolver la decimal, y después transformar elresultado en un (número) binario. Operamos como en el sistema decimal: comenzamos a sumar desde la derecha, ennuestro ejemplo, 1 + 1 = 10, entonces escribimos 0 en la fila del resultado y llevamos 1 (este "1" se llama acarreo oarrastre). A continuación se suma el acarreo a la siguiente columna: 1 + 0 + 0 = 1, y seguimos hasta terminar todasla columnas (exactamente como en decimal).

Resta de números binariosEl algoritmo de la resta en sistema binario es el mismo que en el sistema decimal. Pero conviene repasar la operaciónde restar en decimal para comprender la operación binaria, que es más sencilla. Los términos que intervienen en laresta se llaman minuendo, sustraendo y diferencia.Las restas básicas 0 - 0, 1 - 0 y 1 - 1 son evidentes:•• 0 - 0 = 0•• 1 - 0 = 1•• 1 - 1 = 0• 0 - 1 = 1 (se transforma en 10 - 1 = 1) (en sistema decimal equivale a 2 - 1 = 1)La resta 0 - 1 se resuelve igual que en el sistema decimal, tomando una unidad prestada de la posición siguiente: 0 -1 = 1 y me llevo 1, lo que equivale a decir en el sistema decimal, 2 - 1 = 1.Ejemplos

10001 11011001

-01010 -10101011

—————— —————————

Page 14: Lenguaje de Programación. Java

Sistema binario 12

00111 00101110

En sistema decimal sería: 17 - 10 = 7 y 217 - 171 = 46.Para simplificar las restas y reducir la posibilidad de cometer errores hay varios métodos:•• Dividir los números largos en grupos. En el siguiente ejemplo, vemos cómo se divide una resta larga en tres restas

cortas:

100110011101 1001 1001 1101

-010101110010 -0101 -0111 -0010

————————————— = ————— ————— ————— 010000101011 0100 0010 1011

• Utilizando el complemento a dos (C2). La resta de dos números binarios puede obtenerse sumando al minuendo el«complemento a dos» del sustraendo.

EjemploLa siguiente resta, 91 - 46 = 45, en binario es:

1011011 1011011

-0101110 el C2 de 0101110 es 1010010 +1010010

———————— ———————— 0101101 10101101

En el resultado nos sobra un bit, que se desborda por la izquierda. Pero, como el número resultante no puede ser máslargo que el minuendo, el bit sobrante se desprecia.Un último ejemplo: vamos a restar 219 - 23 = 196, directamente y utilizando el complemento a dos:

11011011 11011011

-00010111 el C2 de 00010111 es 11101001 +11101001

————————— ————————— 11000100 111000100

Y, despreciando el bit que se desborda por la izquierda, llegamos al resultado correcto: 11000100 en binario, 196 endecimal.• Utilizando el complemento a uno. La resta de dos números binarios puede obtenerse sumando al minuendo el

complemento a uno del sustraendo y a su vez sumarle el bit que se desborda.

Producto de números binariosLa tabla de multiplicar para números binarios es la siguiente:

Page 15: Lenguaje de Programación. Java

Sistema binario 13

·   0   1

0 0 0

1 0 1

El algoritmo del producto en binario es igual que en números decimales; aunque se lleva a cabo con más sencillez,ya que el 0 multiplicado por cualquier número da 0, y el 1 es el elemento neutro del producto.Por ejemplo, multipliquemos 10110 por 1001:

10110

1001

————————— 10110

00000

00000

10110

————————— 11000110

En sistemas electrónicos, donde suelen usarse números mayores, se utiliza el método llamado algoritmo de Booth.

11101111

111011

__________

11101111

11101111

00000000

11101111

11101111

11101111

______________

11011100010101

División de números binariosLa división en binario es similar a la decimal; la única diferencia es que a la hora de hacer las restas, dentro de ladivisión, éstas deben ser realizadas en binario.EjemploDividir 100010010 (274) entre 1101 (13):

100010010 /1101 = 010101

-0000

——————— 10001

-1101

——————— 01000

- 0000

——————— 10000

Page 16: Lenguaje de Programación. Java

Sistema binario 14

- 1101

——————— 00111

- 0000

——————— 01110

- 1101

——————— 00001

Conversión entre sistema binario y octal

Sistema Binario a octalDebido a que el sistema octal tiene como base 8, que es la tercera potencia de 2, y que dos es la base del sistemabinario, es posible establecer un método directo para convertir de la base dos a la base ocho, sin tener que convertirde binario a decimal y luego de decimal a octal. Este método se describe a continuación:Para realizar la conversión de binario a octal, realice lo siguiente:1) Agrupe la cantidad binaria en grupos de 3 en 3 iniciando por el lado derecho. Si al terminar de agrupar nocompleta 3 dígitos, entonces agregue ceros a la izquierda.2) Posteriormente vea el valor que corresponde de acuerdo a la tabla:

Número en binario 000 001 010 011 100 101 110 111

Número en octal 0 1 2 3 4 5 6 7

3) La cantidad correspondiente en octal se agrupa de izquierda a derecha.Ejemplos•• 110111 (binario) = 67 (octal). Proceso:

111 = 7

110 = 6

Agrupe de izquierda a derecha: 67

•• 11001111 (binario) = 317 (octal). Proceso:

111 = 7

001 = 1

11 entonces agregue un cero, con lo que se obtiene 011 = 3

Agrupe de izquierda a derecha: 317

•• 1000011 (binario) = 103 (octal). Proceso:

011 = 3

000 = 0

1 entonces agregue 001 = 1

Agrupe de izquierda a derecha: 103

Si el número binario tiene parte decimal, se agrupa de tres en tres desde el punto decimal hacia la derecha siguiendolos mismos criterios establecidos anteriormente para números enteros. Por ejemplo:

Page 17: Lenguaje de Programación. Java

Sistema binario 15

0.01101 (binario) = 0.32 (octal) Proceso: 011 = 3 01 entonces agrege 010 = 2 Agrupe de izquierda a derecha: 32Agrege la parte entera: 0.32

Octal a binarioCada dígito octal se convierte en su binario equivalente de 3 bits y se juntan en el mismo orden.Ejemplo•• 247 (octal) = 010100111 (binario). El 2 en binario es 10, pero en binario de 3 bits es Oc(2) = B(010); el Oc(4) =

B(100) y el Oc(7) = (111), luego el número en binario será 010100111.

Conversión entre binario y hexadecimal

Binario a hexadecimalPara realizar la conversión de binario a hexadecimal, realice lo siguiente:1) Agrupe la cantidad binaria en grupos de 4 en 4 iniciando por el lado derecho. Si al terminar de agrupar nocompleta 4 dígitos, entonces agregue ceros a la izquierda.2) Posteriormente vea el valor que corresponde de acuerdo a la tabla:

Número en binario 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

Número en hexadecimal 0 1 2 3 4 5 6 7 8 9 A B C D E F

3) La cantidad correspondiente en hexadecimal se agrupa de derecha a izquierda.Ejemplos•• 110111010 (binario) = 1BA (hexadecimal). Proceso:

1010 = A

1011 = B

1 entonces agregue 0001 = 1

Agrupe de derecha a izquierda: 1BA

•• 11011110101 (binario) = 6F5 (hexadecimal). Proceso:

0101 = 5

1111 = F

110 entonces agregue 0110 = 6

Agrupe de derecha a izquierda: 6F5

Hexadecimal a binarioNote que para pasar de Hexadecimal a binario, se remplaza el número Hexadecimal por el equivalente de 4 bits, deforma similar a como se hace de octal a binario.

Tabla de conversión entre decimal, binario, hexadecimal, octal, BCD, Exceso 3y Gray o Reflejado

Page 18: Lenguaje de Programación. Java

Sistema binario 16

Decimal Binario Hexadecimal Octal BCD Exceso 3 Gray o Reflejado

0 0000 0 0 0000 0011 0000

1 0001 1 1 0001 0100 0001

2 0010 2 2 0010 0101 0011

3 0011 3 3 0011 0110 0010

4 0100 4 4 0100 0111 0110

5 0101 5 5 0101 1000 0111

6 0110 6 6 0110 1001 0101

7 0111 7 7 0111 1010 0100

8 1000 8 10 1000 1011 1100

9 1001 9 11 1001 1100 1101

10 1010 A 12 0001 0000 1111

11 1011 B 13 0001 0001 1110

12 1100 C 14 0001 0010 1010

13 1101 D 15 0001 0011 1011

14 1110 E 16 0001 0100 1001

15 1111 F 17 0001 0101 1000

Factorialización•• Tabla de conversión entre binario, factor binario, hexadecimal, octal y decimal

Binario Factor binario Hexadecimal Octal Decimal

0000 0010 21 2 2 2

0000 0100 22 4 4 4

0000 1000 23 8 10 8

0001 0000 24 10 20 16

0010 0000 25 20 40 32

0100 0000 26 40 100 64

1000 0000 27 80 200 128

Enlaces externos• Convertidor Binario/Hex/Decimal [1]

Referencias[1] http:/ / calc. 50x. eu/

Page 19: Lenguaje de Programación. Java

Lenguaje de programación 17

Lenguaje de programación

Captura de la microcomputadora Commodore PET-32 mostrando unprograma en el lenguaje de programación BASIC, bajo el emulador

VICE en una distribución GNU/Linux.

Un lenguaje de programación es un idioma artificialdiseñado para expresar procesos que pueden serllevadas a cabo por máquinas como las computadoras.

Pueden usarse para crear programas que controlen elcomportamiento físico y lógico de una máquina, paraexpresar algoritmos con precisión, o como modo decomunicación humana.[1]

Está formado por un conjunto de símbolos y reglassintácticas y semánticas que definen su estructura y elsignificado de sus elementos y expresiones. Al procesopor el cual se escribe, se prueba, se depura, se compilay se mantiene el código fuente de un programa informático se le llama programación.

También la palabra programación se define como el proceso de creación de un programa de computadora, mediantela aplicación de procedimientos lógicos, a través de los siguientes pasos:

•• El desarrollo lógico del programa para resolver un problema en particular.•• Escritura de la lógica del programa empleando un lenguaje de programación específico (codificación del

programa).•• Ensamblaje o compilación del programa hasta convertirlo en lenguaje de máquina.• Prueba y depuración del programa.•• Desarrollo de la documentación.Existe un error común que trata por sinónimos los términos 'lenguaje de programación' y 'lenguaje informático'. Loslenguajes informáticos engloban a los lenguajes de programación y a otros más, como por ejemplo HTML (lenguajepara el marcado de páginas web que no es propiamente un lenguaje de programación, sino un conjunto deinstrucciones que permiten diseñar el contenido de los documentos).Permite especificar de manera precisa sobre qué datos debe operar una computadora, cómo deben ser almacenados otransmitidos y qué acciones debe tomar bajo una variada gama de circunstancias. Todo esto, a través de un lenguajeque intenta estar relativamente próximo al lenguaje humano o natural. Una característica relevante de los lenguajesde programación es precisamente que más de un programador pueda usar un conjunto común de instrucciones quesean comprendidas entre ellos para realizar la construcción de un programa de forma colaborativa.

Historia

Código Fortran en una tarjeta perforada,mostrando el uso especializado de las columnas

1-5, 6 y 73-80.

Para que la computadora entienda nuestras instrucciones debe usarseun lenguaje específico conocido como código máquina, el cual lamáquina comprende fácilmente, pero que lo hace excesivamentecomplicado para las personas. De hecho sólo consiste en cadenasextensas de números 0 y 1.

Para facilitar el trabajo, los primeros operadores de computadorasdecidieron hacer un traductor para reemplazar los 0 y 1 por palabras oabstracción de palabras y letras provenientes del inglés; éste se conocecomo lenguaje ensamblador. Por ejemplo, para sumar se usa la letra Ade la palabra inglesa add (sumar). El lenguaje ensamblador sigue la misma estructura del lenguaje máquina, pero lasletras y palabras son más fáciles de recordar y entender que los números.

Page 20: Lenguaje de Programación. Java

Lenguaje de programación 18

La necesidad de recordar secuencias de programación para las acciones usuales llevó a denominarlas con nombresfáciles de memorizar y asociar: ADD (sumar), SUB (restar), MUL (multiplicar), CALL (ejecutar subrutina), etc. Aesta secuencia de posiciones se le denominó "instrucciones", y a este conjunto de instrucciones se le llamó lenguajeensamblador. Posteriormente aparecieron diferentes lenguajes de programación, los cuales reciben su denominaciónporque tienen una estructura sintáctica similar a los lenguajes escritos por los humanos, denominados tambiénlenguajes de alto nivel.La primera programadora de computadora conocida fue Ada Lovelace, hija de Anabella Milbanke Byron y LordByron. Anabella introdujo en las matemáticas a Ada quien, después de conocer a Charles Babbage, tradujo y amplióuna descripción de su máquina analítica. Incluso aunque Babbage nunca completó la construcción de cualquiera desus máquinas, el trabajo que Ada realizó con éstas le hizo ganarse el título de primera programadora decomputadoras del mundo. El nombre del lenguaje de programación Ada fue escogido como homenaje a estaprogramadora.A finales de 1953, John Backus sometió una propuesta a sus superiores en IBM para desarrollar una alternativa máspráctica al lenguaje ensamblador para programar la computadora central IBM 704. El histórico equipo Fortran deBackus consistió en los programadores Richard Goldberg, Sheldon F. Best, Harlan Herrick, Peter Sheridan, RoyNutt, Robert Nelson, Irving Ziller, Lois Haibt y David Sayre.[2]

El primer manual para el lenguaje Fortran apareció en octubre de 1956, con el primer compilador Fortran entregadoen abril de 1957. Esto era un compilador optimizado, porque los clientes eran reacios a usar un lenguaje de alto nivela menos que su compilador pudiera generar código cuyo desempeño fuera comparable al de un código hecho a manoen lenguaje ensamblador.En 1960, se creó COBOL, uno de los lenguajes usados aún en la actualidad, en informática de gestión.A medida que la complejidad de las tareas que realizaban las computadoras aumentaba, se hizo necesario disponer deun método más eficiente para programarlas. Entonces, se crearon los lenguajes de alto nivel, como lo fue BASIC enlas versiones introducidas en los microordenadores de la década de 1980. Mientras que una tarea tan sencilla comosumar dos números puede necesitar varias instrucciones en lenguaje ensamblador, en un lenguaje de alto nivelbastará una sola sentencia.

Elementos

Variables y VectoresLas variables podrían calificarse como contenedores de datos y por ello se diferencian según el tipo de dato que soncapaces de almacenar. En la mayoría de lenguajes de programación se requiere especificar un tipo de variableconcreto para guardar un dato concreto. Por ejemplo, en Java, si deseamos guardar una cadena de texto deberemosespecificar que la variable es del tipo "String". Por contra en otros lenguajes como PHP, este tipo de especificaciónde variables no es necesario. Además también existen variables compuestas por varias variables llamadas vectores.Un vector no es más que un conjunto de variables consecutivas en memoria y del mismo tipo guardadas dentro deuna variable contenedor. A continuación añadimos un listado con los tipos de variables y vectores más comunes:-Variables tipo Char: Estas variables contienen un único carácter, es decir, una letra, un signo o un número.-Variables tipo Int: Contienen un número entero.-Variables tipo float: Contienen un número decimal.-Variables tipo String: Contienen cadenas de texto, o lo que es lo mismo, es un vector con varias variables del tipoChar.-Variables del tipo Boolean: Solo pueden contener un 0 o un 1. El cero es considerado para muchos lenguajes comoel literal "False" mientras que el 1 se considera "True".

Page 21: Lenguaje de Programación. Java

Lenguaje de programación 19

CondicionantesLos condicionantes son estructuras de código que indican que, para que cierta parte del programa se ejecute, debencumplirse ciertas premisas; por ejemplo: que dos valores sean iguales, que un valor exista, que un valor sea mayorque otro... Estos condicionantes por lo general solo se ejecutan una vez a lo largo del programa. Los condicionantesmás conocidos y empleados en programación son:• If: Indica una condición para que se ejecute una parte del programa.• Else if: Siempre va precedido de un "If" e indica una condición para que se ejecute una parte del programa

siempre que no cumpla la condición del if previo y si se cumpla con la que el "else if" especifique.• Else: Siempre precedido de "If" y en ocasiones de "Else If". Indica que debe ejecutarse cuando no se cumplan las

condiciones prévias.

BuclesLos bucles son parientes cercanos de los condicionantes, pero ejecutan constantemente un código mientras se cumplauna determinada condición. Los más frecuentes son:• For: Ejecuta un código mientras una variable se encuentre entre 2 determinados parámetros.• While: Ejecuta un código mientras se cumpla la condición que solicita.Hay que decir que a pesar de que existan distintos tipos de bucles, ambos son capaces de realizar exactamente lasmismas funciones. El empleo de uno u otro depende, por lo general, del gusto del programador.

FuncionesLas funciones se crearon para evitar tener que repetir constantemente fragmentos de código. Una función podríaconsiderarse como una variable que encierra código dentro de si. Por lo tanto cuando accedemos a dicha variable (lafunción) en realidad lo que estamos es diciendo al programa que ejecute un determinado código predefinidoanteriormente.Todos los lenguajes de programación tienen algunos elementos de formación primitivos para la descripción de losdatos y de los procesos o transformaciones aplicadas a estos datos (tal como la suma de dos números o la selecciónde un elemento que forma parte de una colección). Estos elementos primitivos son definidos por reglas sintácticas ysemánticas que describen su estructura y significado respectivamente.

Page 22: Lenguaje de Programación. Java

Lenguaje de programación 20

Sintaxis

Con frecuencia se resaltan los elementos de la sintaxis con colores diferentespara facilitar su lectura. Este ejemplo está escrito en Python.

A la forma visible de un lenguaje deprogramación se le conoce como sintaxis. Lamayoría de los lenguajes de programación sonpuramente textuales, es decir, utilizansecuencias de texto que incluyen palabras,números y puntuación, de manera similar alos lenguajes naturales escritos. Por otra parte,hay algunos lenguajes de programación queson más gráficos en su naturaleza, utilizandorelaciones visuales entre símbolos paraespecificar un programa.La sintaxis de un lenguaje de programacióndescribe las combinaciones posibles de lossímbolos que forman un programasintácticamente correcto. El significado que sele da a una combinación de símbolos esmanejado por su semántica (ya sea formal o como parte del código duro de la referencia de implementación). Dadoque la mayoría de los lenguajes son textuales, este artículo trata de la sintaxis textual.

La sintaxis de los lenguajes de programación es definida generalmente utilizando una combinación de expresionesregulares (para la estructura léxica) y la Notación de Backus-Naur (para la estructura gramática). Este es un ejemplode una gramática simple, tomada de Lisp:

expresión ::= átomo | lista

átomo ::= número | símbolo

número ::= [+-]? ['0'-'9']+

símbolo ::= ['A'-'Z'] ['a'-'z'].*

lista ::= '(' expresión* ')'

Con esta gramática se especifica lo siguiente:• una expresión puede ser un átomo o una lista;• un átomo puede ser un número o un símbolo;• un número es una secuencia continua de uno o más dígitos decimales, precedido opcionalmente por un signo más

o un signo menos;• un símbolo es una letra seguida de cero o más caracteres (excluyendo espacios); y• una lista es un par de paréntesis que abren y cierran, con cero o más expresiones en medio.Algunos ejemplos de secuencias bien formadas de acuerdo a esta gramática:'12345', '()', '(a b c232 (1))'No todos los programas sintácticamente correctos son semánticamente correctos. Muchos programas sintácticamentecorrectos tienen inconsistencias con las reglas del lenguaje; y pueden (dependiendo de la especificación del lenguajey la solidez de la implementación) resultar en un error de traducción o ejecución. En algunos casos, tales programaspueden exhibir un comportamiento indefinido. Además, incluso cuando un programa está bien definido dentro de unlenguaje, todavía puede tener un significado que no es el que la persona que lo escribió estaba tratando de construir.Usando el lenguaje natural, por ejemplo, puede no ser posible asignarle significado a una oración gramaticalmenteválida o la oración puede ser falsa:

Page 23: Lenguaje de Programación. Java

Lenguaje de programación 21

•• "Las ideas verdes y descoloridas duermen furiosamente" es una oración bien formada gramaticalmente pero notiene significado comúnmente aceptado.

•• "Juan es un soltero casado" también está bien formada gramaticalmente pero expresa un significado que no puedeser verdadero.

El siguiente fragmento en el lenguaje C es sintácticamente correcto, pero ejecuta una operación que no está definidasemánticamente (dado que p es un apuntador nulo, las operaciones p->real y p->im no tienen ningúnsignificado):

complex *p = NULL;

complex abs_p = sqrt (p->real * p->real + p->im * p->im);

Si la declaración de tipo de la primera línea fuera omitida, el programa dispararía un error de compilación, pues lavariable "p" no estaría definida. Pero el programa sería sintácticamente correcto todavía, dado que las declaracionesde tipo proveen información semántica solamente.La gramática necesaria para especificar un lenguaje de programación puede ser clasificada por su posición en laJerarquía de Chomsky. La sintaxis de la mayoría de los lenguajes de programación puede ser especificada utilizandouna gramática Tipo-2, es decir, son gramáticas libres de contexto. Algunos lenguajes, incluyendo a Perl y a Lisp,contienen construcciones que permiten la ejecución durante la fase de análisis. Los lenguajes que permitenconstrucciones que permiten al programador alterar el comportamiento de un analizador hacen del análisis de lasintaxis un problema sin decisión única, y generalmente oscurecen la separación entre análisis y ejecución. Encontraste con el sistema de macros de Lisp y los bloques BEGIN de Perl, que pueden tener cálculos generales, lasmacros de C son meros reemplazos de cadenas, y no requieren ejecución de código.

Semántica estáticaLa semántica estática define las restricciones sobre la estructura de los textos válidos que resulta imposible o muydifícil expresar mediante formalismos sintácticos estándar. Para los lenguajes compilados, la semántica estáticabásicamente incluye las reglas semánticas que se pueden verificar en el momento de compilar. Por ejemplo elchequeo de que cada identificador sea declarado antes de ser usado (en lenguajes que requieren tales declaraciones) oque las etiquetas en cada brazo de una estructura case sean distintas. Muchas restricciones importantes de este tipo,como la validación de que los identificadores sean usados en los contextos apropiados (por ejemplo no sumar unentero al nombre de una función), o que las llamadas a subrutinas tengan el número y tipo de parámetros adecuado,puede ser implementadas definiéndolas como reglas en una lógica conocida como sistema de tipos. Otras formas deanálisis estáticos, como los análisis de flujo de datos, también pueden ser parte de la semántica estática. Nuevoslenguajes de programación como Java y C# tienen un análisis definido de asignaciones, una forma de análisis deflujo de datos, como parte de su semántica estática.

Sistema de tiposUn sistema de tipos define la manera en la cual un lenguaje de programación clasifica los valores y expresiones en tipos, cómo pueden ser manipulados dichos tipos y cómo interactúan. El objetivo de un sistema de tipos es verificar y normalmente poner en vigor un cierto nivel de exactitud en programas escritos en el lenguaje en cuestión, detectando ciertas operaciones inválidas. Cualquier sistema de tipos decidible tiene sus ventajas y desventajas: mientras por un lado rechaza muchos programas incorrectos, también prohíbe algunos programas correctos aunque poco comunes. Para poder minimizar esta desventaja, algunos lenguajes incluyen lagunas de tipos, conversiones explícitas no checadas que pueden ser usadas por el programador para permitir explícitamente una operación normalmente no permitida entre diferentes tipos. En la mayoría de los lenguajes con tipos, el sistema de tipos es usado solamente para checar los tipos de los programas, pero varios lenguajes, generalmente funcionales, llevan a cabo lo que se conoce como inferencia de tipos, que le quita al programador la tarea de especificar los tipos. Al

Page 24: Lenguaje de Programación. Java

Lenguaje de programación 22

diseño y estudio formal de los sistemas de tipos se le conoce como teoría de tipos.

Lenguajes tipados versus lenguajes no tipados

Se dice que un lenguaje tiene tipos si la especificación de cada operación define tipos de datos para los cuales laoperación es aplicable, con la implicación de que no es aplicable a otros tipos. Por ejemplo, "este textoentre comillas" es una cadena. En la mayoría de los lenguajes de programación, dividir un número por unacadena no tiene ningún significado. Por tanto, la mayoría de los lenguajes de programación modernos rechazarancualquier intento de ejecutar dicha operación por parte de algún programa. En algunos lenguajes, estas operacionessin significado son detectadas cuando el programa es compilado (validación de tipos "estática") y son rechazadas porel compilador, mientras en otros son detectadas cuando el programa es ejecutado (validación de tipos "dinámica") yse genera una excepción en tiempo de ejecución.Un caso especial de lenguajes de tipo son los lenguajes de tipo sencillo. Estos son con frecuencia lenguajes demarcado o de scripts, como REXX o SGML, y solamente cuentan con un tipo de datos; comúnmente cadenas decaracteres que luego son usadas tanto para datos numéricos como simbólicos.En contraste, un lenguaje sin tipos, como la mayoría de los lenguajes ensambladores, permiten que cualquieroperación se aplique a cualquier dato, que por lo general se consideran secuencias de bits de varias longitudes.Lenguajes de alto nivel sin datos incluyen BCPL y algunas variedades de Forth.En la práctica, aunque pocos lenguajes son considerados con tipo desde el punto de vista de la teoría de tipos (esdecir, que verifican o rechazan todas las operaciones), la mayoría de los lenguajes modernos ofrecen algún grado demanejo de tipos. Si bien muchos lenguajes de producción proveen medios para brincarse o subvertir el sistema detipos.

Tipos estáticos versus tipos dinámicos

En lenguajes con tipos estáticos se determina el tipo de todas las expresiones antes de la ejecución del programa(típicamente al compilar). Por ejemplo, 1 y (2+2) son expresiones enteras; no pueden ser pasadas a una función queespera una cadena, ni pueden guardarse en una variable que está definida como fecha.Los lenguajes con tipos estáticos pueden manejar tipos explícitos o tipos inferidos. En el primer caso, el programadordebe escribir los tipos en determinadas posiciones textuales. En el segundo caso, el compilador infiere los tipos delas expresiones y las declaraciones de acuerdo al contexto. La mayoría de los lenguajes populares con tipos estáticos,tales como C++, C# y Java, manejan tipos explícitos. Inferencia total de los tipos suele asociarse con lenguajesmenos populares, tales como Haskell y ML. Sin embargo, muchos lenguajes de tipos explícitos permiten inferenciasparciales de tipo; tanto Java y C#, por ejemplo, infieren tipos en un número limitado de casos.Los lenguajes con tipos dinámicos determinan la validez de los tipos involucrados en las operaciones durante laejecución del programa. En otras palabras, los tipos están asociados con valores en ejecución en lugar de expresionestextuales. Como en el caso de lenguajes con tipos inferidos, los lenguajes con tipos dinámicos no requieren que elprogramador escriba los tipos de las expresiones. Entre otras cosas, esto permite que una misma variable se puedaasociar con valores de tipos distintos en diferentes momentos de la ejecución de un programa. Sin embargo, loserrores de tipo no pueden ser detectados automáticamente hasta que se ejecuta el código, dificultando la depuraciónde los programas. Ruby, Lisp, JavaScript y Python son lenguajes con tipos dinámicos.

Page 25: Lenguaje de Programación. Java

Lenguaje de programación 23

Tipos débiles y tipos fuertes

Los lenguajes débilmente tipados permiten que un valor de un tipo pueda ser tratado como de otro tipo, por ejemplouna cadena puede ser operada como un número. Esto puede ser útil a veces, pero también puede permitir ciertostipos de fallas que no pueden ser detectadas durante la compilación o a veces ni siquiera durante la ejecución.Los lenguajes fuertemente tipados evitan que pase lo anterior. Cualquier intento de llevar a cabo una operación sobreel tipo equivocado dispara un error. A los lenguajes con tipos fuertes se les suele llamar de tipos seguros.Lenguajes con tipos débiles como Perl y JavaScript permiten un gran número de conversiones de tipo implícitas. Porejemplo en JavaScript la expresión 2 * x convierte implícitamente x a un número, y esta conversión es exitosainclusive cuando x es null, undefined, un Array o una cadena de letras. Estas conversiones implícitas sonútiles con frecuencia, pero también pueden ocultar errores de programación.Las características de estáticos y fuertes son ahora generalmente consideradas conceptos ortogonales, pero su tratoen diferentes textos varia. Algunos utilizan el término de tipos fuertes para referirse a tipos fuertemente estáticos o,para aumentar la confusión, simplemente como equivalencia de tipos estáticos. De tal manera que C ha sido llamadotanto lenguaje de tipos fuertes como lenguaje de tipos estáticos débiles.

Implementación

Código fuente de un programa escrito en el lenguaje deprogramación Java.

La implementación de un lenguaje es la que provee unamanera de que se ejecute un programa para una determinadacombinación de software y hardware. Existen básicamentedos maneras de implementar un lenguaje: compilación einterpretación.

• Compilación: es el proceso que traduce un programaescrito en un lenguaje de programación a otro lenguajede programación, generando un programa equivalenteque la máquina será capaz interpretar. Los programastraductores que pueden realizar esta operación se llamancompiladores. Éstos, como los programas ensambladoresavanzados, pueden generar muchas líneas de código demáquina por cada proposición del programa fuente.

• Interpretación: es una asignación de significados a lasfórmulas bien formadas de un lenguaje formal. Como loslenguajes formales pueden definirse en términos puramente sintácticos, sus fórmulas bien formadas pueden no sermás que cadenas de símbolos sin ningún significado. Una interpretación otorga significado a esas fórmulas.

Se puede también utilizar una alternativa para traducir lenguajes de alto nivel. En lugar de traducir el programafuente y grabar en forma permanente el código objeto que se produce durante la compilación para utilizarlo en unaejecución futura, el programador sólo carga el programa fuente en la computadora junto con los datos que se van aprocesar. A continuación, un programa intérprete, almacenado en el sistema operativo del disco, o incluido demanera permanente dentro de la máquina, convierte cada proposición del programa fuente en lenguaje de máquinaconforme vaya siendo necesario durante el procesamiento de los datos. El código objeto no se graba para utilizarloposteriormente.La siguiente vez que se utilice una instrucción, se la deberá interpretar otra vez y traducir a lenguaje máquina. Porejemplo, durante el procesamiento repetitivo de los pasos de un ciclo o bucle, cada instrucción del bucle tendrá quevolver a ser interpretada en cada ejecución repetida del ciclo, lo cual hace que el programa sea más lento en tiempode ejecución (porque se va revisando el código en tiempo de ejecución) pero más rápido en tiempo de diseño (porqueno se tiene que estar compilando a cada momento el código completo). El intérprete elimina la necesidad de realizar

Page 26: Lenguaje de Programación. Java

Lenguaje de programación 24

una compilación después de cada modificación del programa cuando se quiere agregar funciones o corregir errores;pero es obvio que un programa objeto compilado con antelación deberá ejecutarse con mucha mayor rapidez que unoque se debe interpretar a cada paso durante una ejecución del código.La mayoría de lenguajes de alto nivel permiten la programación multipropósito, aunque muchos de ellos fuerondiseñados para permitir programación dedicada, como lo fue el Pascal con las matemáticas en su comienzo. Tambiénse han implementado lenguajes educativos infantiles como Logo mediante una serie de simples instrucciones. En laactualidad son muy populares algunos lenguajes especialmente indicados para aplicaciones web, como Perl, PHP,Ruby, Python o JavaScript.

Técnica

Libros sobre diversos lenguajes de programación.

Para escribir programas que proporcionen los mejores resultados,cabe tener en cuenta una serie de detalles.• Corrección. Un programa es correcto si hace lo que debe hacer

tal y como se estableció en las fases previas a su desarrollo.Para determinar si un programa hace lo que debe, es muyimportante especificar claramente qué debe hacer el programaantes de desarrollarlo y, una vez acabado, compararlo con loque realmente hace.

• Claridad. Es muy importante que el programa sea lo más claroy legible posible, para facilitar así su desarrollo y posteriormantenimiento. Al elaborar un programa se debe intentar que su estructura sea sencilla y coherente, así comocuidar el estilo en la edición; de esta forma se ve facilitado el trabajo del programador, tanto en la fase de creacióncomo en las fases posteriores de corrección de errores, ampliaciones, modificaciones, etc. Fases que pueden serrealizadas incluso por otro programador, con lo cual la claridad es aún más necesaria para que otrosprogramadores puedan continuar el trabajo fácilmente. Algunos programadores llegan incluso a utilizar ArteASCII para delimitar secciones de código. Otros, por diversión o para impedir un análisis cómodo a otrosprogramadores, recurren al uso de código ofuscado.

• Eficiencia. Se trata de que el programa, además de realizar aquello para lo que fue creado (es decir, que seacorrecto), lo haga gestionando de la mejor forma posible los recursos que utiliza. Normalmente, al hablar deeficiencia de un programa, se suele hacer referencia al tiempo que tarda en realizar la tarea para la que ha sidocreado y a la cantidad de memoria que necesita, pero hay otros recursos que también pueden ser de consideraciónal obtener la eficiencia de un programa, dependiendo de su naturaleza (espacio en disco que utiliza, tráfico de redque genera, etc.).

• Portabilidad. Un programa es portable cuando tiene la capacidad de poder ejecutarse en una plataforma, ya seahardware o software, diferente a aquella en la que se elaboró. La portabilidad es una característica muy deseablepara un programa, ya que permite, por ejemplo, a un programa que se ha desarrollado para sistemas GNU/Linuxejecutarse también en la familia de sistemas operativos Windows. Esto permite que el programa pueda llegar amás usuarios más fácilmente.

Page 27: Lenguaje de Programación. Java

Lenguaje de programación 25

ParadigmasLos programas se pueden clasificar por el paradigma del lenguaje que se use para producirlos. Los principalesparadigmas son: imperativos, declarativos y orientación a objetos.Los programas que usan un lenguaje imperativo especifican un algoritmo, usan declaraciones, expresiones ysentencias.[3] Una declaración asocia un nombre de variable con un tipo de dato, por ejemplo: var x:

integer;. Una expresión contiene un valor, por ejemplo: 2 + 2 contiene el valor 4. Finalmente, una sentenciadebe asignar una expresión a una variable o usar el valor de una variable para alterar el flujo de un programa, porejemplo: x := 2 + 2; if x == 4 then haz_algo();. Una crítica común en los lenguajes imperativoses el efecto de las sentencias de asignación sobre una clase de variables llamadas "no locales".[4]

Los programas que usan un lenguaje declarativo especifican las propiedades que la salida debe conocer y noespecifica cualquier detalle de implementación. Dos amplias categorías de lenguajes declarativos son los lenguajesfuncionales y los lenguajes lógicos. Los lenguajes funcionales no permiten asignaciones de variables no locales, así,se hacen más fácil, por ejemplo, programas como funciones matemáticas.[4] El principio detrás de los lenguajeslógicos es definir el problema que se quiere resolver (el objetivo) y dejar los detalles de la solución al sistema.[5] Elobjetivo es definido dando una lista de sub-objetivos. Cada sub-objetivo también se define dando una lista de sussub-objetivos, etc. Si al tratar de buscar una solución, una ruta de sub-objetivos falla, entonces tal sub-objetivo sedescarta y sistemáticamente se prueba otra ruta.La forma en la cual se programa puede ser por medio de texto o de forma visual. En la programación visual loselementos son manipulados gráficamente en vez de especificarse por medio de texto.

Referencias[2] http:/ / www. softwarepreservation. org/ projects/ FORTRAN/ index. html#By_FORTRAN_project_members[3][3] (en inglés).[4][4] (en inglés).[5][5] (en inglés).

Enlaces externos• Wikimedia Commons alberga contenido multimedia sobre Lenguaje de programación. Commons• Wikiversidad alberga proyectos de aprendizaje sobre Lenguaje de programación.WikiversidadWikilibros• Wikilibros alberga un libro o manual sobre Fundamentos de programación.• Árbol genealógico de los lenguajes de programación (http:/ / www. levenez. com/ lang/ ) (en inglés)• Lista de lenguajes de programación (http:/ / people. ku. edu/ ~nkinners/ LangList/ Extras/ langlist. htm) (en

inglés)• Lenguajes clasificados por paradigmas de programación: definiciones, ventajas y desventajas. (http:/ / www.

alegsaonline. com/ art/ 13. php)

Page 28: Lenguaje de Programación. Java

Código fuente 26

Código fuenteEl código fuente de un programa informático (o software) es un conjunto de líneas de texto que son las instruccionesque debe seguir la computadora para ejecutar dicho programa. Por tanto, en el código fuente de un programa estádescrito por completo su funcionamiento.El código fuente de un programa está escrito por un programador en algún lenguaje de programación, pero en esteprimer estado no es directamente ejecutable por la computadora, sino que debe ser traducido a otro lenguaje (ellenguaje máquina o código objeto) que sí pueda ser ejecutado por el hardware de la computadora. Para estatraducción se usan los llamados compiladores, ensambladores, intérpretes y otros sistemas de traducción.El término código fuente también se usa para hacer referencia al código fuente de otros elementos del software,como por ejemplo el código fuente de una página web que está escrito en el lenguaje de marcado HTML o enJavascript u otros lenguajes de programación web y que es posteriormente ejecutado por el navegador web paravisualizar dicha página cuando es visitada.El área de la informática que se dedica a la creación de programas y, por tanto a la creación de su código fuente, es laprogramación.

LicenciamientoUn aspecto interesante a tener en cuenta cuando se habla del código fuente de un programa informático es si sulicencia permite que dicho código fuente esté disponible para que cualquiera pueda estudiarlo, modificarlo oreutilizarlo. Cuando se cumple este aspecto se dice que el programa es de Código abierto y son, en general, softwarelibre, en contraposición al software privativo sobre el cual no se tiene ninguno de estos permisos. Este código esescrito mediante el uso de un lenguaje de programación.

Enlaces externos• Wikcionario tiene definiciones para código fuente.Wikcionario

Page 29: Lenguaje de Programación. Java

Compilador 27

Compilador

Diagrama a bloques de la operación de un buen compilador.

Un compilador es un programa informáticoque traduce un programa escrito en unlenguaje de programación a otro lenguaje deprogramación, generando un programaequivalente que la máquina será capaz deinterpretar. Usualmente el segundo lenguajees lenguaje de máquina, pero también puedeser un código intermedio (bytecode), osimplemente texto. Este proceso de traducciónse conoce como compilación.[1]

Un compilador es un programa que permitetraducir el código fuente de un programa enlenguaje de alto nivel, a otro lenguaje de nivelinferior (típicamente lenguaje de máquina).De esta manera un programador puede diseñarun programa en un lenguaje mucho máscercano a como piensa un ser humano, paraluego compilarlo a un programa másmanejable por una computadora.

Partes de un compilador

La construcción de un compilador involucra ladivisión del proceso en una serie de fases quevariará con su complejidad. Generalmente estas fases se agrupan en dos tareas: el análisis del programa fuente y lasíntesis del programa objeto.• Análisis: Se trata de la comprobación de la corrección del programa fuente, e incluye las fases correspondientes al

Análisis léxico (que consiste en la descomposición del programa fuente en componentes léxicos), Análisissintáctico (agrupación de los componentes léxicos en frases gramaticales ) y Análisis semántico (comprobaciónde la validez semántica de las sentencias aceptadas en la fase de Análisis Sintáctico).

• Síntesis: Su objetivo es la generación de la salida expresada en el lenguaje objeto y suele estar formado por una ovarias combinaciones de fases de Generación de Código (normalmente se trata de código intermedio o de códigoobjeto) y de Optimización de Código (en las que se busca obtener un código lo más eficiente posible).

Alternativamente, las fases descritas para las tareas de análisis y síntesis se pueden agrupar en Front-end y Back-end:• Front-end: es la parte que analiza el código fuente, comprueba su validez, genera el árbol de derivación y rellena

los valores de la tabla de símbolos. Esta parte suele ser independiente de la plataforma o sistema para el cual sevaya a compilar, y está compuesta por las fases comprendidas entre el Análisis Léxico y la Generación de CódigoIntermedio.

• Back-end: es la parte que genera el código máquina, específico de una plataforma, a partir de los resultados de lafase de análisis, realizada por el Front End.

Esta división permite que el mismo Back End se utilice para generar el código máquina de varios lenguajes de programación distintos y que el mismo Front End que sirve para analizar el código fuente de un lenguaje de programación concreto sirva para generar código máquina en varias plataformas distintas. Suele incluir la generación

Page 30: Lenguaje de Programación. Java

Compilador 28

y optimización del código dependiente de la máquina.El código que genera el Back End normalmente no se puede ejecutar directamente, sino que necesita ser enlazadopor un programa enlazador (linker)

HistoriaEn 1946 se desarrolló la primera computadora digital. En un principio, estas máquinas ejecutaban instruccionesconsistentes en códigos numéricos que señalaban a los circuitos de la máquina los estados correspondientes a cadaoperación, lo que se denominó lenguaje máquina.Pronto los primeros usuarios de estos ordenadores descubrieron la ventaja de escribir sus programas mediante clavesmás fáciles de recordar que esos códigos; al final, todas esas claves juntas se traducían manualmente a lenguajemáquina. Estas claves constituyen los llamados lenguajes ensambladores.Pese a todo, el lenguaje ensamblador seguía siendo el de una máquina, pero más fácil de manejar. Los trabajos deinvestigación se orientaron hacia la creación de un lenguaje que expresara las distintas acciones a realizar de unamanera lo más sencilla posible para una persona. El primer compilador fue escrito por Grace Hopper, en 1952 para ellenguaje de programación A-0. En 1950 John Backus dirigió una investigación en IBM sobre un lenguaje algebraico.En 1954 se empezó a desarrollar un lenguaje que permitía escribir fórmulas matemáticas de manera traducible por unordenador; le llamaron FORTRAN (FORmulae TRANslator). Fue el primer lenguaje de alto nivel y se introdujo en1957 para el uso de la computadora IBM modelo 704.Surgió así por primera vez el concepto de un traductor como un programa que traducía un lenguaje a otro lenguaje.En el caso particular de que el lenguaje a traducir es un lenguaje de alto nivel y el lenguaje traducido de bajo nivel,se emplea el término compilador.La tarea de realizar un compilador no fue fácil. El primer compilador de FORTRAN tardó 18 años-persona enrealizarse y era muy sencillo. Este desarrollo de FORTRAN estaba muy influenciado por la máquina objeto en la queiba a ser implementado. Como un ejemplo de ello tenemos el hecho de que los espacios en blanco fuesen ignorados,debido a que el periférico que se utilizaba como entrada de programas (una lectora de tarjetas perforadas) no contabacorrectamente los espacios en blanco.El primer compilador autocontenido, es decir, capaz de compilar su propio código fuente fue el creado para Lisp porHart y Levin en el MIT en 1962. Desde 1970 se ha convertido en una práctica común escribir el compilador en elmismo lenguaje que este compila, aunque Pascal y C han sido alternativas muy usadas.Crear un compilador autocontenido genera un problema llamado bootstrapping, es decir el primer compilador creadopara un lenguaje tiene que o bien ser compilado por un compilador escrito en otro lenguaje o bien compilado alejecutar el compilador en un intérprete.

Tipos de compiladoresEsta taxonomía de los tipos de compiladores no es excluyente, por lo que puede haber compiladores que se adscribana varias categorías:• Compiladores cruzados: generan código para un sistema distinto del que están funcionando.• Compiladores optimizadores: realizan cambios en el código para mejorar su eficiencia, pero manteniendo la

funcionalidad del programa original.• Compiladores de una sola pasada: generan el código máquina a partir de una única lectura del código fuente.• Compiladores de varias pasadas: necesitan leer el código fuente varias veces antes de poder producir el código

máquina.• Compiladores JIT (Just In Time): forman parte de un intérprete y compilan partes del código según se necesitan.

Page 31: Lenguaje de Programación. Java

Compilador 29

Pauta de creación de un compilador: En las primeras épocas de la informática, el software de los compiladores eraconsiderado como uno de los más complejos existentes.Los primeros compiladores se realizaron programándolos directamente en lenguaje máquina o en ensamblador. Unavez que se dispone de un compilador, se pueden escribir nuevas versiones del compilador (u otros compiladoresdistintos) en el lenguaje que compila ese compilador.Actualmente existen herramientas que facilitan la tarea de escribir compiladores ó intérpretes informáticos. Estasherramientas permiten generar el esqueleto del analizador sintáctico a partir de una definición formal del lenguaje departida, especificada normalmente mediante una gramática formal y barata, dejando únicamente al programador delcompilador la tarea de programar las acciones semánticas asociadas.

Proceso de compilaciónEs el proceso por el cual se traducen las instrucciones escritas en un determinado lenguaje de programación alenguaje máquina. Además de un traductor, se pueden necesitar otros programas para crear un programa objetoejecutable. Un programa fuente se puede dividir en módulos almacenados en archivos distintos. La tarea de reunir elprograma fuente a menudo se confía a un programa distinto, llamado preprocesador. El preprocesador también puedeexpandir abreviaturas, llamadas a macros, a proposiciones del lenguaje fuente.Normalmente la creación de un programa ejecutable (un típico.exe para Microsoft Windows o DOS) conlleva dospasos. El primer paso se llama compilación (propiamente dicho) y traduce el código fuente escrito en un lenguaje deprogramación almacenado en un archivo a código en bajo nivel (normalmente en código objeto, no directamente alenguaje máquina). El segundo paso se llama enlazado en el cual se enlaza el código de bajo nivel generado de todoslos ficheros y subprogramas que se han mandado compilar y se añade el código de las funciones que hay en lasbibliotecas del compilador para que el ejecutable pueda comunicarse directamente con el sistema operativo,traduciendo así finalmente el código objeto a código máquina, y generando un módulo ejecutable.Estos dos pasos se pueden hacer por separado, almacenando el resultado de la fase de compilación en archivosobjetos (un típico.obj para Microsoft Windows, DOS o para Unix); para enlazarlos en fases posteriores, o creardirectamente el ejecutable; con lo que la fase de compilación se almacena sólo temporalmente. Un programa podríatener partes escritas en varios lenguajes (por ejemplo C, C++ y Asm), que se podrían compilar de formaindependiente y luego enlazar juntas para formar un único módulo ejecutable.

Etapas del procesoEl proceso de traducción se compone internamente de varias etapas o fases, que realizan distintas operacioneslógicas. Es útil pensar en estas fases como en piezas separadas dentro del traductor, y pueden en realidad escribirsecomo operaciones codificadas separadamente aunque en la práctica a menudo se integren juntas.

Fase de análisis

Análisis léxico

El análisis léxico constituye la primera fase, aquí se lee el programa fuente de izquierda a derecha y se agrupa encomponentes léxicos (tokens), que son secuencias de caracteres que tienen un significado. Además, todos losespacios en blanco, líneas en blanco, comentarios y demás información innecesaria se elimina del programa fuente.También se comprueba que los símbolos del lenguaje (palabras clave, operadores, etc.) se han escrito correctamente.Como la tarea que realiza el analizador léxico es un caso especial de coincidencia de patrones, se necesitan los métodos de especificación y reconocimiento de patrones, se usan principalmente los autómatas finitos que acepten expresiones regulares. Sin embargo, un analizador léxico también es la parte del traductor que maneja la entrada del código fuente, y puesto que esta entrada a menudo involucra un importante gasto de tiempo, el analizador léxico

Page 32: Lenguaje de Programación. Java

Compilador 30

debe funcionar de manera tan eficiente como sea posible.

Análisis sintáctico

En esta fase los caracteres o componentes léxicos se agrupan jerárquicamente en frases gramaticales que elcompilador utiliza para sintetizar la salida. Se comprueba si lo obtenido de la fase anterior es sintácticamentecorrecto (obedece a la gramática del lenguaje). Por lo general, las frases gramaticales del programa fuente serepresentan mediante un árbol de análisis sintáctico.La estructura jerárquica de un programa normalmente se expresa utilizando reglas recursivas. Por ejemplo, se puedendar las siguientes reglas como parte de la definición de expresiones:1. Cualquier identificador es una expresión.2. Cualquier número es una expresión.3. Si expresión

1 y expresión

2 son expresiones, entonces también lo son:

• expresión1

+ expresión2

• expresión1

* expresión2

• ( expresión1

)Las reglas 1 y 2 son reglas básicas (no recursivas), en tanto que la regla 3 define expresiones en función deoperadores aplicados a otras expresiones.La división entre análisis léxico y análisis sintáctico es algo arbitraria. Un factor para determinar la división es si unaconstrucción del lenguaje fuente es inherentemente recursiva o no. Las construcciones léxicas no requierenrecursión, mientras que las construcciones sintácticas suelen requerirla. No se requiere recursión para reconocer losidentificadores, que suelen ser cadenas de letras y dígitos que comienzan con una letra. Normalmente, se reconocenlos identificadores por el simple examen del flujo de entrada, esperando hasta encontrar un carácter que no sea niletra ni dígito, y agrupando después todas las letras y dígitos encontrados hasta ese punto en un componente léxicollamado identificador. Por otra parte, esta clase de análisis no es suficientemente poderoso para analizar expresioneso proposiciones. Por ejemplo, no podemos emparejar de manera apropiada los paréntesis de las expresiones, o laspalabras begin y end en proposiciones sin imponer alguna clase de estructura jerárquica o de anidamiento a laentrada.

Análisis semántico

La fase de análisis semántico revisa el programa fuente para tratar de encontrar errores semánticos y reúne lainformación sobre los tipos para la fase posterior de generación de código. En ella se utiliza la estructura jerárquicadeterminada por la fase de análisis sintáctico para identificar los operadores y operandos de expresiones yproposiciones.Un componente importante del análisis semántico es la verificación de tipos. Aquí, el compilador verifica si cadaoperador tiene operandos permitidos por la especificación del lenguaje fuente. Por ejemplo, las definiciones demuchos lenguajes de programación requieren que el compilador indique un error cada vez que se use un número realcomo índice de una matriz. Sin embargo, la especificación del lenguaje puede imponer restricciones a los operandos,por ejemplo, cuando un operador aritmético binario se aplica a un número entero y a un número real.[] Revisa que losarreglos tengan definido el tamaño correcto.

Fase de síntesisConsiste en generar el código objeto equivalente al programa fuente. Sólo se genera código objeto cuando el programa fuente está libre de errores de análisis, lo cual no quiere decir que el programa se ejecute correctamente, ya que un programa puede tener errores de concepto o expresiones mal calculadas. Por lo general el código objeto es código de máquina relocalizable o código ensamblador. Las posiciones de memoria se seleccionan para cada una de las variables usadas por el programa. Después, cada una de las instrucciones intermedias se traduce a una secuencia

Page 33: Lenguaje de Programación. Java

Compilador 31

de instrucciones de máquina que ejecuta la misma tarea. Un aspecto decisivo es la asignación de variables aregistros.

Generación de código intermedio

Después de los análisis sintáctico y semántico, algunos compiladores generan una representación intermediaexplícita del programa fuente. Se puede considerar esta representación intermedia como un programa para unamáquina abstracta. Esta representación intermedia debe tener dos propiedades importantes; debe ser fácil de produciry fácil de traducir al programa objeto.La representación intermedia puede tener diversas formas. Existe una forma intermedia llamada «código de tresdirecciones» que es como el lenguaje ensamblador de una máquina en la que cada posición de memoria puede actuarcomo un registro. El código de tres direcciones consiste en una secuencia de instrucciones, cada una de las cualestiene como máximo tres operandos. Esta representación intermedia tiene varias propiedades:• Primera.- Cada instrucción de tres direcciones tiene a lo sumo un operador, además de la asignación, por tanto,

cuando se generan estas instrucciones, el traductor tiene que decidir el orden en que deben efectuarse lasoperaciones.

• Segunda.- El traductor debe generar un nombre temporal para guardar los valores calculados por cada instrucción.• Tercera.- Algunas instrucciones de «tres direcciones» tienen menos de tres operandos, por ejemplo, la asignación.

Optimización de códigoLa fase de optimización de código consiste en mejorar el código intermedio, de modo que resulte un código máquinamás rápido de ejecutar. Esta fase de la etapa de síntesis es posible sobre todo si el traductor es un compilador(difícilmente un interprete puede optimizar el código objeto). Hay mucha variación en la cantidad de optimización decódigo que ejecutan los distintos compiladores. En los que hacen mucha optimización, llamados «compiladoresoptimizadores», una parte significativa del tiempo del compilador se ocupa en esta fase. Sin embargo, hayoptimizaciones sencillas que mejoran sensiblemente el tiempo de ejecución del programa objeto sin retardardemasiado la compilación.[]

Estructura de datos principalesLa interacción entre los algoritmos utilizados por las fases del compilador y las estructuras de datos que soportanestas fases es, naturalmente, muy fuerte. El escritor del compilador se esfuerza por implementar estos algoritmos deuna manera tan eficaz como sea posible, sin aumentar demasiado la complejidad. De manera ideal, un compiladordebería poder compilar un programa en un tiempo proporcional al tamaño del mismo.

Componentes léxicos o tokensCuando un analizador léxico reúne los caracteres en un token, generalmente representa el token de manera simbólica,es decir, como un valor de un tipo de datos enumerado que representa el conjunto de tokens del lenguaje fuente. Enocasiones también es necesario mantener la cadena de caracteres misma u otra información derivada de ella, talcomo el nombre asociado con un token identificador o el valor de un token de número.En la mayoría de los lenguajes el analizador léxico sólo necesita generar un token a la vez. En este caso se puedeutilizar una variable global simple para mantener la información del token. En otros casos (cuyo ejemplo másnotable es FORTRAN), puede ser necesario un arreglo (o vector) de tokens.

Page 34: Lenguaje de Programación. Java

Compilador 32

Árbol sintácticoSi el analizador sintáctico genera un árbol sintáctico, por lo regular se construye como una estructura estándar basadaen un puntero que se asigna de manera dinámica a medida que se efectúa el análisis sintáctico. El árbol entero puedeentonces conservarse como una variable simple que apunta al nodo raíz. Cada nodo en la estructura es un registrocuyos campos representan la información recolectada tanto por el analizador sintáctico como, posteriormente, por elanalizador semántico. Por ejemplo, el tipo de datos de una expresión puede conservarse como un campo en el nododel árbol sintáctico para la expresión.En ocasiones, para ahorrar espacio, estos campos se asignan de manera dinámica, o se almacenan en otras estructurasde datos, tales como la tabla de símbolos, que permiten una asignación y desasignación selectivas. En realidad, cadanodo del árbol sintáctico por sí mismo puede requerir de atributos diferentes para ser almacenado, de acuerdo con laclase de estructura del lenguaje que represente. En este caso, cada nodo en el árbol sintáctico puede estarrepresentado por un registro variable, con cada clase de nodo conteniendo solamente la información necesaria paraese caso.

Tabla de símbolosEsta estructura de datos mantiene la información asociada con los identificadores: funciones, variables, constantes ytipos de datos. La tabla de símbolos interactúa con casi todas las fases del compilador: el analizador léxico, elanalizador sintáctico o el analizador semántico pueden introducir identificadores dentro de la tabla; el analizadorsemántico agregará tipos de datos y otra información; y las fases de optimización y generación de código utilizaránla información proporcionada por la tabla de símbolos para efectuar selecciones apropiadas de código objeto.Puesto que la tabla de símbolos tendrá solicitudes de acceso con tanta frecuencia, las operaciones de inserción,eliminación y acceso necesitan ser eficientes, preferiblemente operaciones de tiempo constante. Una estructura dedatos estándar para este propósito es la tabla de dispersión o de cálculo de dirección, aunque también se puedenutilizar diversas estructuras de árbol. En ocasiones se utilizan varias tablas y se mantienen en una lista o pila.

Tabla de literalesLa búsqueda y la inserción rápida son esenciales también para la tabla de literales, la cual almacena constantes ycadenas utilizadas en el programa. Sin embargo, una tabla de literales necesita impedir las eliminaciones porque susdatos se aplican globalmente al programa y una constante o cadena aparecerá sólo una vez en esta tabla. La tabla deliterales es importante en la reducción del tamaño de un programa en la memoria al permitir la reutilización deconstantes y cadenas. También es necesaria para que el generador de código construya direcciones simbólicas paralas literales y para introducir definiciones de datos en el archivo de código objeto.

Código intermedioDe acuerdo con la clase de código intermedio (por ejemplo, código de tres direcciones o código P) y de las clases deoptimizaciones realizadas, este código puede conservarse como un arreglo de cadenas de texto, un archivo de textotemporal o bien una lista de estructuras ligadas. En los compiladores que realizan optimizaciones complejas debeponerse particular atención a la selección de representaciones que permitan una fácil reorganización.Generación de código intermedioDespués de los análisis sintáctico y semántico, algunos compiladores generan una representación intermediaexplícita del programa fuente. Se puede considerar esta representación intermedia como un programa para unamáquina abstracta. Esta representación intermedia debe tener dos propiedades importantes; debe ser fácil de produciry fácil de traducir al programa objeto.La representación intermedia puede tener diversas formas. Existe una forma intermedia llamada «código de tresdirecciones», que es como el lenguaje ensamblador para una máquina en la que cada posición de memoria puede

Page 35: Lenguaje de Programación. Java

Compilador 33

actuar como un registro. El código de tres direcciones consiste en una secuencia de instrucciones, cada una de lascuales tiene como máximo tres operandos. El programa fuente de (1) puede aparecer en código de tres direccionescomo

temp1 := entarea1(60)

temp2 := id3 * temp1 (2)

temp3 := id2 + temp2

id1 := temp3

Esta representación intermedia tiene varias propiedades. Primera, cada instrucción de tres direcciones tiene a lo sumoun operador, además de la asignación. Por tanto, cuando se generan esas instrucciones el compilador tiene quedecidir el orden en que deben efectuarse, las operaciones; la multiplicación precede a la adición al programa fuentede. Segunda, el compilador debe generar un nombre temporal para guardar los valores calculados por cadainstrucción. Tercera, algunas instrucciones de «tres direcciones» tienen menos de tres operadores, por ejemplo laprimera y la última instrucciones de.Optimización de CódigoLa fase de optimización de código trata de mejorar el código intermedio de modo que resulte un código de máquinamás rápido de ejecutar. Algunas optimizaciones son triviales. Por ejemplo, un algoritmo natural genera el códigointermedio (2) utilizando una instrucción para cada operador de la representación del árbol después del análisissemántico, aunque hay una forma mejor de realizar los mismos cálculos usando las dos instrucciones

temp1 := id3 * 60.0 (3)

id1 := id2 + temp1

Este sencillo algoritmo no tiene nada de malo, puesto que el problema se puede solucionar en la fase de optimizaciónde código. Esto es, el compilador puede deducir que la conversión de 60 de entero a real se puede hacer de una vezpor todas en el momento de la compilación, de modo que la operación entreal se puede eliminar. Además, temp3 seusa sólo una vez, para transmitir su valor a id1. Entonces resulta seguro sustituir a id1 por temp3, a partir de lo cualla última proposición de (2) no se necesita y se obtiene el código de (3).Hay muchas variaciones en la cantidad de optimización de código que ejecutan los distintos compiladores. En lo quehacen mucha optimización llamados «compiladores optimizadores», una parte significativa del tiempo delcompilador se ocupa en esta fase. Sin embargo, hay optimizaciones sencillas que mejoran sensiblemente el tiempode ejecución del programa objeto sin retardar demasiado la compilación.

Archivos temporalesAl principio las computadoras no tenían la suficiente memoria para guardar un programa completo durante lacompilación. Este problema se resolvió mediante el uso de archivos temporales para mantener los productos de lospasos intermedios durante la traducción o bien al compilar «al vuelo», es decir, manteniendo sólo la informaciónsuficiente de las partes anteriores del programa fuente que permita proceder a la traducción.Las limitaciones de memoria son ahora un problema mucho menor, y es posible requerir que una unidad decompilación entera se mantenga en memoria, en especial si se dispone de la compilación por separado en el lenguaje.Con todo, los compiladores ocasionalmente encuentran útil generar archivos intermedios durante alguna de lasetapas del procesamiento. Algo típico de éstos es la necesidad de direcciones de corrección hacia atrás durante lageneración de código.

Page 36: Lenguaje de Programación. Java

Compilador 34

Referencias

Enlaces externos• Wikcionario tiene definiciones para compilador.Wikcionario• Let's Build a Compiler (http:/ / compilers. iecc. com/ crenshaw/ ). Tutorial de Jack W. Crenshaw sobre cómo

hacer un compilador• Java a tope: Traductores y Compiladores con Lex/Yacc, JFlex/Cup y JavaCC. (http:/ / www. lcc. uma. es/

~galvez/ Compiladores. html) Libro básico sobre compiladores

Intérprete (informática)En ciencias de la computación, intérprete o interpretador es un programa informático capaz de analizar y ejecutarotros programas, escritos en un lenguaje de alto nivel. Los intérpretes se diferencian de los compiladores en quemientras estos traducen un programa desde su descripción en un lenguaje de programación al código de máquina delsistema, los intérpretes sólo realizan la traducción a medida que sea necesaria, típicamente, instrucción porinstrucción, y normalmente no guardan el resultado de dicha traducción.Usando un intérprete, un solo archivo fuente puede producir resultados iguales incluso en sistemas sumamentediferentes (ej. una PC y un PlayStation 3). Usando un compilador, un solo archivo fuente puede producir resultadosiguales solo si es compilado a distintos ejecutables específicos a cada sistema.Los programas interpretados suelen ser más lentos que los compilados debido a la necesidad de traducir el programamientras se ejecuta, pero a cambio son más flexibles como entornos de programación y depuración (lo que setraduce, por ejemplo, en una mayor facilidad para reemplazar partes enteras del programa o añadir móduloscompletamente nuevos), y permiten ofrecer al programa interpretado un entorno no dependiente de la máquinadonde se ejecuta el intérprete, sino del propio intérprete (lo que se conoce comúnmente como máquina virtual).Para mejorar el desempeño, algunas implementaciones de programación de lenguajes de programación puedeninterpretar o compilar el código fuente original en una más compacta forma intermedia y después traducir eso alcódigo de máquina (ej. Perl, Python, MATLAB, y Ruby). Algunos aceptan los archivos fuente guardados en estarepresentación intermedia (ej. Python, UCSD Pascal y Java).Comparando su actuación con la de un ser humano, un compilador equivale a un traductor profesional que, a partirde un texto, prepara otro independiente traducido a otra lengua, mientras que un intérprete corresponde al intérpretehumano, que traduce de viva voz las palabras que oye, sin dejar constancia por escrito.En la actualidad, uno de los entornos más comunes de uso de los intérpretes informáticos es Internet, debido a laposibilidad que estos tienen de ejecutarse independientemente de la plataforma.

Interpretadores de bytecodeHay un espectro de posibilidades entre la interpretación y la compilación, dependiendo de la cantidad de análisisrealizados antes de que el programa sea ejecutado. Por ejemplo, el Emacs Lisp es compilado a bytecode, que es unarepresentación altamente comprimida y optimizada del código fuente del Lisp, pero no es código de máquina (y porlo tanto no está atado a cualquier hardware particular). Este código "compilado" es entonces interpretado por uninterpretador de bytecode (que está escrito en C). En este caso, el código compilado es el código de máquina parauna máquina virtual, que no está implementada en el hardware, sino en el interpretador de bytecode. El mismoacercamiento es utilizado con el código Forth usado en sistemas Open Firmware: el lenguaje fuente es compilado en"código F" (un bytecode), que entonces es interpretado por una máquina virtual.

Page 37: Lenguaje de Programación. Java

Intérprete (informática) 35

EficienciaLa desventaja principal de los interpretadores es que cuando se interpreta un programa, típicamente corre máslentamente que si hubiera sido compilado. La diferencia en velocidades puede ser minúscula o grande; a menudo unorden de magnitud y a veces más. Generalmente toma más tiempo correr un programa bajo un interpretador quecorrer el código compilado, pero puede tomar menos tiempo para interpretarlo que el tiempo total requerido paracompilarlo y ejecutarlo. Esto es especialmente importante si se está haciendo y probando un código prototipo cuandoun ciclo de editar, interpretar y depurar del interpretador, a menudo puede ser mucho más corto que el ciclo de editar,compilar, ejecutar y depurar del compilador.La interpretación de código es más lenta que la ejecución de código compilado porque el interpretador debe analizarcada sentencia en el programa cada vez que es ejecutada y entonces realizar la acción deseada, mientras que elcódigo compilado solo realiza la acción dentro de un determinado contexto fijo por la compilación. Este análisis entiempo de ejecución se conoce como "sobrecarga interpretativa". En un interpretador, el acceso a las variables estambién más lento porque el mapeo de identificadores hacia las localizaciones de almacenamiento debe hacerserepetidamente en tiempo de ejecución en vez de en el tiempo de compilación. Hay varios compromisos entre lavelocidad de desarrollo al usar un interpretador y la velocidad de ejecución al usar un compilador. Algunos sistemas(ej., algunos LISPs) permiten al código interpretado y al compilado llamarse el uno al otro y compartir variables.Esto significa que una vez que una rutina ha sido probada y depurada bajo el interpretador puede ser compilada y porlo tanto beneficiarse de una ejecución más rápida mientras que otras rutinas están siendo desarrolladas. Muchosinterpretadores no ejecutan el código fuente tal y como está sino que lo convierten en una forma interna máscompacta. Por ejemplo, algunos interpretadores BASIC reemplazan palabras clave (keywords) con tokens de unsimple byte que pueden ser usados para encontrar la instrucción en una tabla de saltos. Un interpretador puede bienusar el mismo analizador lexicográfico y el analizador sintáctico (parser) que el compilador y entonces interpretar elárbol de sintaxis abstracta resultante.

Interpretadores de árbol de sintáxis abstractaEn el espectro entre la interpretación y la compilación, otro acercamiento está transformando el código fuente en unárbol de sintaxis abstracta optimizado (AST), y después procediendo a ejecutar el programa siguiendo esta estructuraarborescente.[1] En este acercamiento cada sentencia necesita ser analizada (parsed) solo una vez. Como una ventajasobre el bytecode, el AST mantiene la estructura y las relaciones globales del programa entre las sentencias (que sepierden en una representación de bytecode), y proporciona una representación más compacta.[2]

Así, el AST se ha propuesto como un mejor formato intermedio para los compiladores justo a tiempo que elbytecode. También, permite realizar un mejor análisis durante tiempo de ejecución. Un interpretador Java basado enAST ha demostrado ser más rápido que un interpretador similar basado en bytecode,[3] gracias a las más poderosasoptimizaciones permitidas al tener la estructura completa del programa, así como tipos de datos de alto nivel,disponibles durante la ejecución.

Compilación justo a tiempoPara desdibujar más la distinción entre los interpretadores, los interpretadores de bytecode y la compilación, está lacompilación justo a tiempo (o JIT), una técnica en la cual la representación intermedia es compilada a código demáquina nativo en tiempo de ejecución. Esto confiere la eficiencia de ejecutar el código nativo, al costo de tiempo deinicio y de un uso creciente de la memoria cuando el bytecode o el AST es compilado por primera vez. Laoptimización adaptativa es una técnica complementaria en la cual el interpretador hace un análisis de desempeño delprograma que está corriendo (profiling) y compila sus partes más frecuentemente ejecutadas a código nativo. Ambastécnicas tienen algunas décadas, apareciendo en lenguajes tales como Smalltalk en los años 1980.

Page 38: Lenguaje de Programación. Java

Intérprete (informática) 36

En años recientes, la compilación justo a tiempo ha ganado la atención de la mayoría de los implementadores delenguajes de programación, con Java, Python, y el Microsoft .NET Framework todos ahora incluyendo JITs.

EjemplosAlgunos ejemplos de lenguajes que son normalmente interpretados en vez de compilados son:•• Perl•• PHP•• Javascript•• Logo• ASP (hasta la versión 3)•• Python•• Tcl•• Ruby•• J#•• ASP

Notas y referencias[1] AST intermediate representations (http:/ / lambda-the-ultimate. org/ node/ 716), Lambda the Ultimate forum[2] A Tree-Based Alternative to Java Byte-Codes (http:/ / citeseer. ist. psu. edu/ article/ kistler97treebased. html), Thomas Kistler, Michael Franz[3] Trees Versus Bytes (http:/ / central. kaserver5. org/ Kasoft/ Typeset/ JavaTree/ index. html), BComp Honours thesis by Kade Hansson

Enlaces externos• DrPubaGump (http:/ / drpubagump. ouaibou. info) A tiny Interpreter written in Scheme, which provides to

interpret PUBA-GUMP (a subset of BASIC) in Scheme• IBM Card Interpreters (http:/ / www. columbia. edu/ acis/ history/ interpreter. html) page at Columbia University

Page 39: Lenguaje de Programación. Java

Lenguaje de máquina 37

Lenguaje de máquina

Lenguaje de máquina del Intel 8088. El código de máquina en hexadecimal se resalta enrojo, el equivalente en lenguaje ensamblador en magenta, y las direcciones de memoriadonde se encuentra el código, en azul. Abajo se ve un texto en hexadecimal y ASCII.

El lenguaje de máquina o códigomáquina es el sistema de códigosdirectamente interpretable por uncircuito microprogramable, como elmicroprocesador de una computadorao el microcontrolador de un autómata.Este lenguaje está compuesto por unconjunto de instrucciones quedeterminan acciones al ser tomadas porla máquina. Un programa consiste enuna cadena de estas instrucciones más un conjunto de datos sobre el cual se trabaja. Estas instrucciones sonnormalmente ejecutadas en secuencia, con eventuales cambios de flujo causados por el propio programa o eventosexternos. El lenguaje de máquina es específico de la arquitectura de la máquina, aunque el conjunto de instruccionesdisponibles pueda ser similar entre arquitecturas distintas.

Los circuitos microprogramables son sistemas digitales, lo que significa que trabajan con dos únicos niveles detensión. Dichos niveles, por abstracción, se simbolizan con los números 0 y 1, por eso el lenguaje de máquina sóloutiliza dichos signos. Esto permite el empleo de las teorías del álgebra booleana y del sistema binario en el diseño deeste tipo de circuitos y en su programación.

Una visión típica de la arquitectura de computadorascomo una serie de capas de abstracción: hardware,firmware, ensamblador, kernel, sistema operativo y

aplicaciones.

Claude Elwood Shannon, en su libro Analysis of Relay andSwitching Circuits, y con sus experiencias en redes deconmutación, sentó las bases para la aplicación del álgebra deBoole a las redes de conmutación. Una red de conmutación es uncircuito de interruptores eléctricos que al cumplir ciertascombinaciones booleanas con las variables de entrada, define elestado de la salida. Este concepto es el núcleo de las puertaslógicas, las cuales son, por su parte, los ladrillos con que seconstruyen sistemas lógicos cada vez más complejos. Shannonutilizaba el relé como dispositivo físico de conmutación en susredes, dado que el relé, a igual que una lámpara eléctrica, poseedos estados: activado (encendido) o desactivado (apagado).

El desarrollo tecnológico ha permitido evolucionar desde las redesde relés electromagnéticos a circuitos con tubos de vacío, luego aredes transistorizadas, hasta llegar a los modernos circuitosintegrados, en cuya cúspide se encuentran los circuitosmicroprogramados.

Page 40: Lenguaje de Programación. Java

Depuración de programas 38

Depuración de programas

Una fotografía del supuestamente primer "bug" (bicho) real, el cualfue depurado ("debugged") en 1947.

Depuración de programas es el proceso de identificary corregir errores de programación. En inglés se leconoce como debugging, es que se asemeja a laeliminación de bichos (bugs), manera en que se conoceinformalmente a los errores de programación. Se diceque el término bug proviene de la época de losordenadores de válvula termoiónica, en los cuales losproblemas se generaban por los insectos que eranatraídos por las luces y estropeaban el equipo. Si bienexisten técnicas para la revisión sistemática del códigofuente y se cuenta con medios computacionales para ladetección de errores (depuradores) y facilidadesintegradas en los sistemas lower CASE y en losambientes de desarrollo integrado, sigue siendo enbuena medida una actividad manual, que desafía lapaciencia, la imaginación y la intuición del programador. Muchas veces se requiere incluir en el código fuenteinstrucciones auxiliares que permitan el seguimiento de la ejecución del programa, presentando los valores devariables y direcciones de memoria y ralentizando la salida de datos (modo de depuración). Dentro de un procesoformal de aseguramiento de la calidad, puede ser asimilado al concepto de prueba unitaria.

OrigenExiste una controversia acerca del origen del término depuración o "debugging" en inglés. Los términos "bug" y"debugging" son atribuidos popularmente a la almirante Grace Murray Hopper cerca de 1940s. Mientras trabajabacon un Mark II en la Universidad de Harvard, ella encontró una polilla atrapada en un relé impidiendo lasoperaciones de dicha computadora, por lo cual ella remarcó que cuando se removió aquella polilla le habían hecho"debugging" al sistema. Sin embargo el término "bug" cómo significado de error técnico data cerca de 1878, y eltermino "debugging" o depuración ha sido usado como un término en aeronáutica antes de entrar al mundo de lascomputadoras.

AplicaciónComo el software y los sistemas electrónicos se vuelven generalmente más complejos, varias técnicas comunes dedepuración han sido desarrolladas para detectar anomalías, corregir funcionalidades y optimizar código fuente.Existen algunos aficionados que consideran a la depuración como una forma de arte.

Page 41: Lenguaje de Programación. Java

Java (lenguaje de programación) 39

Java (lenguaje de programación)

Java

Desarrollador(es)

James Gosling & Sun MicrosystemsPara desarrolladores de Java [1]

Información general

Extensiones comunes .java, .class, .jar

Paradigma Orientado a objetos, imperativo

Apareció en 1995

Diseñado por Sun Microsystems (Oracle Corporation)

Última versión estable Java Standard Edition 7 (1.7.7) (30 de agosto de 2012)

Tipo de dato Fuerte, Estático

Implementaciones OpenJDK, HotSpot, muchas otras

Dialectos Generic Java, Pizza

Influido por Objective-C, C++, Smalltalk, Eiffel

Ha influido a C#, J#, JavaScript,PHP, Python

Sistema operativo Multiplataforma

Licencia GNU GPL / Java Community Process

Java es un lenguaje de programación originalmente desarrollado por James Gosling de Sun Microsystems (la cualfue adquirida por la compañía Oracle) y publicado en el 1995 como un componente fundamental de la plataformaJava de Sun Microsystems. El lenguaje deriva mucho de su sintaxis de C y C++, pero tiene menos facilidades debajo nivel que cualquiera de ellos. Las aplicaciones de Java son generalmente compiladas a bytecode (clase Java)que puede correr en cualquier máquina virtual Java (JVM) sin importar la arquitectura de la computadora. Java es unlenguaje de programación de propósito general, concurrente, basado en clases, y orientado a objetos, que fuediseñado específicamente para tener tan pocas dependencias de implementación como fuera posible. Su intención espermitir que los desarrolladores de aplicaciones escriban el programa una vez y lo ejecuten en cualquier dispositivo(conocido en inglés como WORA, o "write once, run anywhere"), lo que quiere decir que el código que es ejecutadoen una plataforma no tiene que ser recompilado para correr en otra. Java es, a partir del 2012, uno de los lenguajes deprogramación más populares en uso, particularmente para aplicaciones de cliente-servidor de web, con unos 10millones de usuarios reportados.[2][3]

La compañía Sun desarrolló la implementación de referencia original para los compiladores de Java, máquinasvirtuales, y librerías de clases en 1991 y las publicó por primera vez en el 1995. A partir de mayo del 2007, encumplimiento con las especificaciones del Proceso de la Comunidad Java, Sun volvió a licenciar la mayoría de sustecnologías de Java bajo la Licencia Pública General de GNU. Otros también han desarrollado implementacionesalternas a estas tecnologías de Sun, tales como el Compilador de Java de GNU y el GNU Classpath.

Page 42: Lenguaje de Programación. Java

Java (lenguaje de programación) 40

HistoriaJava se creó como una herramienta de programación para ser usada en un proyecto de set-top-box en una pequeñaoperación denominada the Green Project en Sun Microsystems en el año 1991. El equipo (Green Team), compuestopor trece personas y dirigido por James Gosling, trabajó durante 18 meses en Sand Hill Road en Menlo Park en sudesarrollo.El lenguaje se denominó inicialmente Oak (por un roble que había fuera de la oficina de Gosling), luego pasó adenominarse Green tras descubrir que Oak era ya una marca comercial registrada para adaptadores de tarjetasgráficas y finalmente se renombró a Java.Es frecuentada por algunos de los miembros del equipo. Pero no está claro si es un acrónimo o no, aunque algunasfuentes señalan que podría tratarse de las iniciales de sus creadores: James Gosling, Arthur Van Hoff, y AndyBechtolsheim. Otros abogan por el siguiente acrónimo, Just Another Vague Acronym ("sólo otro acrónimo ambiguomás"). La hipótesis que más fuerza tiene es la que Java debe su nombre a un tipo de café disponible en la cafeteríacercana, de ahí que el icono de java sea una taza de café caliente. Un pequeño signo que da fuerza a esta teoría es quelos 4 primeros bytes (el número mágico) de los archivos.class que genera el compilador, son en hexadecimal,0xCAFEBABE. A pesar de todas estas teorías, el nombre fue sacado al parecer de una lista aleatoria de palabras.[4]

Los objetivos de Gosling eran implementar una máquina virtual y un lenguaje con una estructura y sintaxis similar aC++. Entre junio y julio de 1994, tras una sesión maratoniana de tres días entre John Gaga, James Gosling, PatrickNaughton, Wayne Rosing y Eric Schmidt, el equipo reorientó la plataforma hacia la Web. Sintieron que la llegadadel navegador web Mosaic, propiciaría que Internet se convirtiese en un medio interactivo, como el que pensaban erala televisión por cable. Naughton creó entonces un prototipo de navegador, WebRunner, que más tarde seríaconocido como HotJava.En 1994, se les hizo una demostración de HotJava y la plataforma Java a los ejecutivos de Sun. Java 1.0a pudodescargarse por primera vez en 1994, pero hubo que esperar al 23 de mayo de 1995, durante las conferencias deSunWorld, a que vieran la luz pública Java y HotJava, el navegador Web. El acontecimiento fue anunciado por JohnGage, el Director Científico de Sun Microsystems. El acto estuvo acompañado por una pequeña sorpresa adicional,el anuncio por parte de Marc Andreessen, Vicepresidente Ejecutivo de Netscape, de que Java sería soportado en susnavegadores. El 9 de enero del año siguiente, 1996, Sun fundó el grupo empresarial JavaSoft para que se encargasedel desarrollo tecnológico. [5] Dos semanas más tarde la primera versión de Java fue publicada.La promesa inicial de Gosling era Write Once, Run Anywhere (Escríbelo una vez, ejecútalo en cualquier lugar),proporcionando un lenguaje independiente de la plataforma y un entorno de ejecución (la JVM) ligero y gratuito paralas plataformas más populares de forma que los binarios (bytecode) de las aplicaciones Java pudiesen ejecutarse encualquier plataforma.El entorno de ejecución era relativamente seguro y los principales navegadores web pronto incorporaron laposibilidad de ejecutar applets Java incrustadas en las páginas web.Java ha experimentado numerosos cambios desde la versión primigenia, JDK 1.0, así como un enorme incremento enel número de clases y paquetes que componen la biblioteca estándar.[6]

Desde J2SE 1.4, la evolución del lenguaje ha sido regulada por el JCP (Java Community Process), que usa JavaSpecification Requests (JSRs) para proponer y especificar cambios en la plataforma Java. El lenguaje en sí mismoestá especificado en la Java Language Specification (JLS), o Especificación del Lenguaje Java. Los cambios en losJLS son gestionados en JSR 901 [7].• JDK 1.0 (23 de enero de 1996) — Primer lanzamiento: comunicado de prensa [8]

• JDK 1.1 (19 de febrero de 1997) — Principales adiciones incluidas: comunicado de prensa [9]

•• una reestructuración intensiva del modelo de eventos AWT (Abstract Windowing Toolkit)•• clases internas (inner classes)•• JavaBeans

Page 43: Lenguaje de Programación. Java

Java (lenguaje de programación) 41

• JDBC (Java Database Connectivity), para la integración de bases de datos• RMI (Remote Method Invocation)

• J2SE 1.2 (8 de diciembre de 1998) — Nombre clave Playground. Esta y las siguientes versiones fueron recogidasbajo la denominación Java 2 y el nombre "J2SE" (Java 2 Platform, Standard Edition), reemplazó a JDK paradistinguir la plataforma base de J2EE (Java 2 Platform, Enterprise Edition) y J2ME (Java 2 Platform, MicroEdition). Otras mejoras añadidas incluían: comunicado de prensa [10]

• la palabra reservada (keyword) strictfp•• reflexión en la programación• la API gráfica ( Swing) fue integrada en las clases básicas• la máquina virtual (JVM) de Sun fue equipada con un compilador JIT (Just in Time) por primera vez•• Java Plug-in• Java IDL, una implementación de IDL (Lenguaje de Descripción de Interfaz) para la interoperabilidad con

CORBA• Colecciones (Collections)

• J2SE 1.3 (8 de mayo de 2000) — Nombre clave Kestrel. Los cambios más notables fueron:comunicado de prensa[11] lista completa de cambios [12]

• la inclusión de la máquina virtual de HotSpot JVM (la JVM de HotSpot fue lanzada inicialmente en abril de1999, para la JVM de J2SE 1.2)

• RMI fue cambiado para que se basara en CORBA•• JavaSound• se incluyó el Java Naming and Directory Interface (JNDI) en el paquete de bibliotecas principales

(anteriormente disponible como una extensión)• Java Platform Debugger Architecture (JPDA)

• J2SE 1.4 (6 de febrero de 2002) — Nombre Clave Merlin. Este fue el primer lanzamiento de la plataforma Javadesarrollado bajo el Proceso de la Comunidad Java como JSR 59 [13]. Los cambios más notables fueron:comunicado de prensa [14]lista completa de cambios [15]

• Palabra reservada assert (Especificado en JSR 41 [16].)• Expresiones regulares modeladas al estilo de las expresiones regulares Perl• Encadenación de excepciones Permite a una excepción encapsular la excepción de bajo nivel original.• non-blocking NIO (New Input/Output) (Especificado en JSR 51 [17].)• Logging API (Specified in JSR 47 [18].)• API I/O para la lectura y escritura de imágenes en formatos como JPEG o PNG• Parser XML integrado y procesador XSLT (JAXP) (Especificado en JSR 5 [19] y JSR 63 [7].)• Seguridad integrada y extensiones criptográficas (JCE, JSSE, JAAS)• Java Web Start incluido (El primer lanzamiento ocurrió en marzo de 2001 para J2SE 1.3) (Especificado en JSR

56 [20].)• J2SE 5.0 (30 de septiembre de 2004) — Nombre clave: Tiger. (Originalmente numerado 1.5, esta notación aún es

usada internamente.[21]) Desarrollado bajo JSR 176 [22], Tiger añadió un número significativo de nuevascaracterísticas comunicado de prensa [23]

• Plantillas (genéricos) — provee conversión de tipos (type safety) en tiempo de compilación para colecciones yelimina la necesidad de la mayoría de conversión de tipos (type casting). (Especificado por JSR 14 [24].)

• Metadatos — también llamados anotaciones, permite a estructuras del lenguaje como las clases o los métodos,ser etiquetados con datos adicionales, que puedan ser procesados posteriormente por utilidades de proceso demetadatos. (Especificado por JSR 175 [25].)

• Autoboxing/unboxing — Conversiones automáticas entre tipos primitivos (Como los int) y clases deenvoltura primitivas (Como Integer [26]). (Especificado por JSR 201 [27].)

Page 44: Lenguaje de Programación. Java

Java (lenguaje de programación) 42

• Enumeraciones — la palabra reservada enum crea una typesafe, lista ordenada de valores (comoDia.LUNES, Dia.MARTES, etc.). Anteriormente, esto solo podía ser llevado a cabo por constantes enteras oclases construidas manualmente (enum pattern). (Especificado por JSR 201 [27].)

• Varargs (número de argumentos variable) — El último parámetro de un método puede ser declarado con elnombre del tipo seguido por tres puntos (e.g. void drawtext(String... lines)). En la llamada almétodo, puede usarse cualquier número de parámetros de ese tipo, que serán almacenados en un array parapasarlos al método.

• Bucle for mejorado — La sintaxis para el bucle for se ha extendido con una sintaxis especial para iterarsobre cada miembro de un array o sobre cualquier clase que implemente Iterable [28], como la claseestándar Collection [29], de la siguiente forma:

void displayWidgets (Iterable<Widget> widgets) {

for (Widget w : widgets) {

w.display();

}

}

Este ejemplo itera sobre el objeto Iterable widgets, asignando, en orden, cada uno de los elementos a lavariable w, y llamando al método display() de cada uno de ellos. (Especificado por JSR 201.) |}• Java SE 6 (11 de diciembre de 2006) — Nombre clave Mustang [30]. Estuvo en desarrollo bajo la JSR 270 [31].

En esta versión, Sun cambió el nombre "J2SE" por Java SE y eliminó el ".0" del número de versión.[32]. Estádisponible en http:/ / java. sun. com/ javase/ 6/ [33]. Los cambios más importantes introducidos en esta versiónson:•• Incluye un nuevo marco de trabajo y APIs que hacen posible la combinación de Java con lenguajes dinámicos

como PHP, Python, Ruby y JavaScript.•• Incluye el motor Rhino, de Mozilla, una implementación de Javascript en Java.•• Incluye un cliente completo de Servicios Web y soporta las últimas especificaciones para Servicios Web, como

JAX-WS 2.0, JAXB 2.0, STAX y JAXP.•• Mejoras en la interfaz gráfica y en el rendimiento.

• Java SE 7 — Nombre clave Dolphin. En el año 2006 aún se encontraba en las primeras etapas de planificación.Su lanzamiento fue en julio de 2011.•• Soporte para XML dentro del propio lenguaje.•• Un nuevo concepto de superpaquete.• Soporte para closures.•• Introducción de anotaciones estándar para detectar fallos en el software.

•• No oficiales:•• NIO2.•• Java Module System.•• Java Kernel.•• Nueva API para el manejo de Días y Fechas, la cual reemplazara las antiguas clases Date y Calendar.•• Posibilidad de operar con clases BigDecimal usando operandos.

[34]En el 2005 se calcula en 4,5 millones el número de desarrolladores y 2.500 millones de dispositivos habilitados contecnología Java.

Page 45: Lenguaje de Programación. Java

Java (lenguaje de programación) 43

FilosofíaEl lenguaje Java se creó con cinco objetivos principales:1.1. Debería usar el paradigma de la programación orientada a objetos.2.2. Debería permitir la ejecución de un mismo programa en múltiples sistemas operativos.3.3. Debería incluir por defecto soporte para trabajo en red.4.4. Debería diseñarse para ejecutar código en sistemas remotos de forma segura.5.5. Debería ser fácil de usar y tomar lo mejor de otros lenguajes orientados a objetos, como C++.Para conseguir la ejecución de código remoto y el soporte de red, los programadores de Java a veces recurren aextensiones como CORBA (Common Object Request Broker Architecture), Internet Communications Engine oOSGi respectivamente.

Orientado a objetosLa primera característica, orientado a objetos (“OO”), se refiere a un método de programación y al diseño dellenguaje. Aunque hay muchas interpretaciones para OO, una primera idea es diseñar el software de forma que losdistintos tipos de datos que usen estén unidos a sus operaciones. Así, los datos y el código (funciones o métodos) secombinan en entidades llamadas objetos. Un objeto puede verse como un paquete que contiene el “comportamiento”(el código) y el “estado” (datos). El principio es separar aquello que cambia de las cosas que permanecen inalterables.Frecuentemente, cambiar una estructura de datos implica un cambio en el código que opera sobre los mismos, oviceversa. Esta separación en objetos coherentes e independientes ofrece una base más estable para el diseño de unsistema software. El objetivo es hacer que grandes proyectos sean fáciles de gestionar y manejar, mejorando comoconsecuencia su calidad y reduciendo el número de proyectos fallidos. Otra de las grandes promesas de laprogramación orientada a objetos es la creación de entidades más genéricas (objetos) que permitan la reutilizacióndel software entre proyectos, una de las premisas fundamentales de la Ingeniería del Software. Un objeto genérico“cliente”, por ejemplo, debería en teoría tener el mismo conjunto de comportamiento en diferentes proyectos, sobretodo cuando estos coinciden en cierta medida, algo que suele suceder en las grandes organizaciones. En este sentido,los objetos podrían verse como piezas reutilizables que pueden emplearse en múltiples proyectos distintos,posibilitando así a la industria del software a construir proyectos de envergadura empleando componentes yaexistentes y de comprobada calidad; conduciendo esto finalmente a una reducción drástica del tiempo de desarrollo.Podemos usar como ejemplo de objeto el aluminio. Una vez definidos datos (peso, maleabilidad, etc.), y su“comportamiento” (soldar dos piezas, etc.), el objeto “aluminio” puede ser reutilizado en el campo de la construcción,del automóvil, de la aviación, etc.La reutilización del software ha experimentado resultados dispares, encontrando dos dificultades principales: eldiseño de objetos realmente genéricos es pobremente comprendido, y falta una metodología para la ampliacomunicación de oportunidades de reutilización. Algunas comunidades de “código abierto” (open source) quierenayudar en este problema dando medios a los desarrolladores para diseminar la información sobre el uso yversatilidad de objetos reutilizables y bibliotecas de objetos.

Page 46: Lenguaje de Programación. Java

Java (lenguaje de programación) 44

Independencia de la plataformaLa segunda característica, la independencia de la plataforma, significa que programas escritos en el lenguaje Javapueden ejecutarse igualmente en cualquier tipo de hardware. Este es el significado de ser capaz de escribir unprograma una vez y que pueda ejecutarse en cualquier dispositivo, tal como reza el axioma de Java, ‘’’write once, runanywhere’’’.Para ello, se compila el código fuente escrito en lenguaje Java, para generar un código conocido como “bytecode”(específicamente Java bytecode)—instrucciones máquina simplificadas específicas de la plataforma Java. Esta piezaestá “a medio camino” entre el código fuente y el código máquina que entiende el dispositivo destino. El bytecode esejecutado entonces en la máquina virtual (JVM), un programa escrito en código nativo de la plataforma destino (quees el que entiende su hardware), que interpreta y ejecuta el código. Además, se suministran bibliotecas adicionalespara acceder a las características de cada dispositivo (como los gráficos, ejecución mediante hebras o threads, lainterfaz de red) de forma unificada. Se debe tener presente que, aunque hay una etapa explícita de compilación, elbytecode generado es interpretado o convertido a instrucciones máquina del código nativo por el compilador JIT(Just In Time).Hay implementaciones del compilador de Java que convierten el código fuente directamente en código objeto nativo,como GCJ. Esto elimina la etapa intermedia donde se genera el bytecode, pero la salida de este tipo de compiladoressólo puede ejecutarse en un tipo de arquitectura.La licencia sobre Java de Sun insiste que todas las implementaciones sean “compatibles”. Esto dio lugar a unadisputa legal entre Microsoft y Sun, cuando éste último alegó que la implementación de Microsoft no daba soporte alas interfaces RMI y JNI además de haber añadido características ‘’dependientes’’ de su plataforma. Sun demandó aMicrosoft y ganó por daños y perjuicios (unos 20 millones de dólares) así como una orden judicial forzando laacatación de la licencia de Sun. Como respuesta, Microsoft no ofrece Java con su versión de sistema operativo, y enrecientes versiones de Windows, su navegador Internet Explorer no admite la ejecución de applets sin un conector (oplugin) aparte. Sin embargo, Sun y otras fuentes ofrecen versiones gratuitas para distintas versiones de Windows.Las primeras implementaciones del lenguaje usaban una máquina virtual interpretada para conseguir la portabilidad.Sin embargo, el resultado eran programas que se ejecutaban comparativamente más lentos que aquellos escritos en Co C++. Esto hizo que Java se ganase una reputación de lento en rendimiento. Las implementaciones recientes de laJVM dan lugar a programas que se ejecutan considerablemente más rápido que las versiones antiguas, empleandodiversas técnicas, aunque sigue siendo mucho más lento que otros lenguajes.La primera de estas técnicas es simplemente compilar directamente en código nativo como hacen los compiladorestradicionales, eliminando la etapa del bytecode. Esto da lugar a un gran rendimiento en la ejecución, pero tapa elcamino a la portabilidad. Otra técnica, conocida como compilación JIT (Just In Time, o ‘’’compilación al vuelo’’’),convierte el bytecode a código nativo cuando se ejecuta la aplicación. Otras máquinas virtuales más sofisticadas usanuna ‘’’recompilación dinámica’’’ en la que la VM es capaz de analizar el comportamiento del programa en ejecución yrecompila y optimiza las partes críticas. La recompilación dinámica puede lograr mayor grado de optimización quela compilación tradicional (o estática), ya que puede basar su trabajo en el conocimiento que de primera mano tienesobre el entorno de ejecución y el conjunto de clases cargadas en memoria. La compilación JIT y la recompilacióndinámica permiten a los programas Java aprovechar la velocidad de ejecución del código nativo sin por ello perder laventaja de la portabilidad en ambos.La portabilidad es técnicamente difícil de lograr, y el éxito de Java en ese campo ha sido dispar. Aunque es de hechoposible escribir programas para la plataforma Java que actúen de forma correcta en múltiples plataformas de distintaarquitectura, el gran número de estas con pequeños errores o inconsistencias llevan a que a veces se parodie eleslogan de Sun, "Write once, run anywhere" como "Write once, debug everywhere" (o “Escríbelo una vez, ejecútaloen cualquier parte” por “Escríbelo una vez, depúralo en todas partes”)El concepto de independencia de la plataforma de Java cuenta, sin embargo, con un gran éxito en las aplicaciones en el entorno del servidor, como los Servicios Web, los Servlets, los Java Beans, así como en sistemas empotrados

Page 47: Lenguaje de Programación. Java

Java (lenguaje de programación) 45

basados en OSGi, usando entornos Java empotrados.

El recolector de basuraEn Java el problema fugas de memoria se evita en gran medida gracias a la recolección de basura (o automaticgarbage collector). El programador determina cuándo se crean los objetos y el entorno en tiempo de ejecución deJava (Java runtime) es el responsable de gestionar el ciclo de vida de los objetos. El programa, u otros objetospueden tener localizado un objeto mediante una referencia a éste. Cuando no quedan referencias a un objeto, elrecolector de basura de Java borra el objeto, liberando así la memoria que ocupaba previniendo posibles fugas(ejemplo: un objeto creado y únicamente usado dentro de un método sólo tiene entidad dentro de éste; al salir delmétodo el objeto es eliminado). Aun así, es posible que se produzcan fugas de memoria si el código almacenareferencias a objetos que ya no son necesarios—es decir, pueden aún ocurrir, pero en un nivel conceptual superior.En definitiva, el recolector de basura de Java permite una fácil creación y eliminación de objetos y mayor seguridad.

SintaxisLa sintaxis de Java se deriva en gran medida de C++. Pero a diferencia de éste, que combina la sintaxis paraprogramación genérica, estructurada y orientada a objetos, Java fue construido desde el principio para sercompletamente orientado a objetos. Todo en Java es un objeto (salvo algunas excepciones), y todo en Java reside enalguna clase (recordemos que una clase es un molde a partir del cual pueden crearse varios objetos).

Hola mundo

Aplicaciones autónomas

// Hola.java

import javax.swing.JOptionPane;

public class Hola //Declara una clase llamada Hola, que es descendiente

de la clase Object

{

//Entre llaves se declaran los atributos y métodos de la clase

public static void main(String[] args)

//public: indica que el método main()es público

//void: indica que la función main() no devuelve ningún valor

//El método main()debe aceptar siempre como parámetro un vector de

strings

{

JOptionPane.showMessageDialog(null, "Hola Mundo");

//Esta línea indica que se va a ejecutar el método

showMessageDialog(), encargado de mostrar

//en un cuadro de diálogo un valor (en nuestro caso, un String)

//El primer parámetro no es necesario y podemos usar el valor nulo

//(el parámetro indica el JFrame asociado, el contenedor o entorno

del diálogo a crear)

}

}

Este ejemplo necesita una pequeña explicación.

Page 48: Lenguaje de Programación. Java

Java (lenguaje de programación) 46

•• Todo en Java está dentro de una clase, incluyendo programas autónomos.• El código fuente se guarda en archivos con el mismo nombre que la clase que contienen y con extensión “.java”.

Una clase (class) declarada pública (public) debe seguir este convenio. En el ejemplo anterior, la clase esHola, por lo que el código fuente debe guardarse en el fichero “Hola.java”

• El compilador genera un archivo de clase (con extensión “.class”) por cada una de las clases definidas en elarchivo fuente. Una clase anónima se trata como si su nombre fuera la concatenación del nombre de la clase quela encierra, el símbolo “$”, y un número entero.

• Los programas que se ejecutan de forma independiente y autónoma, deben contener el método ”main()”.• La palabra reservada ”void” indica que el método main no devuelve nada.• El método main debe aceptar un array de objetos tipo String. Por acuerdo se referencia como ”args”, aunque

puede emplearse cualquier otro identificador.• La palabra reservada ”static” indica que el método es un método de clase, asociado a la clase en vez de una

instancias de la misma. El método main debe ser estático o ’’de clase’’.• La palabra reservada public significa que un método puede ser llamado desde otras clases, o que la clase

puede ser usada por clases fuera de la jerarquía de la propia clase. Otros tipos de acceso son ”private” o”protected”.

• La utilidad de impresión (en pantalla por ejemplo) forma parte de la biblioteca estándar de Java: la clase‘’’System’’’ define un campo público estático llamado ‘’’out’’’. El objeto out es una instancia de ‘’’PrintStream’’’,que ofrece el método ‘’’println (String)’’’ para volcar datos en la pantalla (la salida estándar).

• Las aplicaciones autónomas se ejecutan dando al entorno de ejecución de Java el nombre de la clase cuyo métodomain debe invocarse. Por ejemplo, una línea de comando (en Unix o Windows) de la forma java –cp .Hola ejecutará el programa del ejemplo (previamente compilado y generado “Hola.class”). El nombre de la clasecuyo método main se llama puede especificarse también en el fichero “MANIFEST” del archivo deempaquetamiento de Java (.jar).

Applets

Las applet Java son programas incrustados en otras aplicaciones, normalmente una página Web que se muestra en unnavegador.

// Hello.java

import javax.swing.JApplet;

import java.awt.Graphics;

public class Hello extends JApplet {

public void paint(Graphics g) {

g.drawString("Hola, mundo!", 65, 95);

}

}

<!-- Hola.html -->

<html>

<head>

<title>Applet Hola Mundo</title>

</head>

<body>

<applet code="Hola.class" width="200" height="200">

Page 49: Lenguaje de Programación. Java

Java (lenguaje de programación) 47

</applet>

</body>

</html>

Actualmente HTML 5 ha eliminado el uso de la etiqueta <applet>. Pero todavía existe la forma de usarlo enHTML5. (Texto en inglés) Java Applets in HTML5. [35]

La sentencia import indica al compilador de Java que incluya las clases java.applet. Applet y java.awt.Graphics, para poder referenciarlas por sus nombres, sin tener que anteponer la ruta completa cada vez que sequieran usar en el código fuente.La clase Hola extiende (extends) a la clase Applet, es decir, es una subclase de ésta. La clase Appletpermite a la aplicación mostrar y controlar el estado del applet. La clase Applet es un componente del AWT(Abstract Window Toolkit), que permite al applet mostrar una interfaz gráfica de usuario o GUI (Graphical UserInterface), y responder a eventos generados por el usuario.La clase Hola sobrecarga el método paint (Graphics) heredado de la superclase contenedora (Applet en estecaso), para acceder al código encargado de dibujar. El método paint() recibe un objeto Graphics quecontiene el contexto gráfico para dibujar el applet. El método paint() llama al método drawString (String, int,int) del objeto [36]

Servlets

Los servlets son componentes de la parte del servidor de Java EE, encargados de generar respuestas a las peticionesrecibidas de los clientes.

// Hola.java

import java.io.IOException;

import javax.servlet.*;

public class Hola extends GenericServlet

{

public void service(ServletRequest request, ServletResponse

response)

throws ServletException, IOException

{

response.setContentType("text/html");

PrintWriter pw = response.getWriter();

pw.println("Hola, mundo!");

pw.close();

}

}

Las sentencias import indican al compilador de Java la inclusión de todas las clases públicas e interfaces de lospaquetes java.io y javax.servlet en la compilación.La clase Hola extiende (extends), es heredera de la clase GenericServlet. Esta clase proporciona la interfaz paraque el servidor le pase las peticiones al servlet y el mecanismo para controlar el ciclo de vida del servlet.La clase Hola sobrecarga el método service (ServletRequest, ServletResponse), definido por la interfaz servletpara acceder al manejador de la petición de servicio. El método service() recibe un objeto de tipoServletRequest que contiene la petición del cliente y un objeto de tipo ServletResponse, usado para generar larespuesta que se devuelve al cliente. El método service() puede lanzar (throws) excepciones de tipoServletException e IOException si ocurre algún tipo de anomalía.

Page 50: Lenguaje de Programación. Java

Java (lenguaje de programación) 48

El método setContentType (String) en el objeto respuesta establece el tipo de contenido MIME a "text/html", paraindicar al cliente que la respuesta a su petición es una página con formato HTML. El método getWriter() del objetorespuesta devuelve un objeto de tipo PrintWriter, usado como una tubería por la que viajarán los datos al cliente. Elmétodo println (String) escribe la cadena "Hola, mundo!" en la respuesta y finalmente se llama al método close()para cerrar la conexión, que hace que los datos escritos en la tubería o stream sean devueltos al cliente.

Aplicaciones con ventanas

Swing es la biblioteca para la interfaz gráfica de usuario avanzada de la plataforma Java SE.

// Hola.java

import javax.swing.*;

public class Hola extends JFrame {

Hola() {

setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

add(new JLabel("Hola, mundo!"));

pack();

}

public static void main(String[] args) {

new Hola().setVisible(true);

}

}

Las instrucciones import indican al compilador de Java que las clases e interfaces del paquete javax.swing seincluyan en la compilación.La clase Hola extiende (extends) la clase javax.swing.JFrame, que implementa una ventana con una barra detítulo y un control para cerrarla.El constructor Hola() inicializa el marco o frame llamando al método setDefaultCloseOperation (int) heredadode JFrame para establecer las operaciones por defecto cuando el control de cierre en la barra de título es seleccionadoal valor WindowConstants.DISPOSE_ON_CLOSE. Esto hace que se liberen los recursos tomados por la ventanacuando es cerrada, y no simplemente ocultada, lo que permite a la máquina virtual y al programa acabar suejecución. A continuación se crea un objeto de tipo JLabel con el texto "Hola, mundo!", y se añade al marcomediante el método add (Component), heredado de la clase Container. El método pack(), heredado de la claseWindow, es invocado para dimensionar la ventana y distribuir su contenido.El método main() es llamado por la JVM al comienzo del programa. Crea una instancia de la clase Hola y hacela ventana sea mostrada invocando al método setVisible (boolean) de la superclase (clase de la que hereda) con elparámetro a true. Véase que, una vez el marco es dibujado, el programa no termina cuando se sale del métodomain(), ya que el código del que depende se encuentra en un hilo de ejecución independiente ya lanzado, y quepermanecerá activo hasta que todas las ventanas hayan sido destruidas.

Page 51: Lenguaje de Programación. Java

Java (lenguaje de programación) 49

Entornos de funcionamientoEl diseño de Java, su robustez, el respaldo de la industria y su fácil portabilidad han hecho de Java uno de loslenguajes con un mayor crecimiento y amplitud de uso en distintos ámbitos de la industria de la informática.

En dispositivos móviles y sistemas empotradosDesde la creación de la especificación J2ME (Java 2 Platform, Micro Edition), una versión del entorno de ejecuciónJava reducido y altamente optimizado, especialmente desarrollado para el mercado de dispositivos electrónicos deconsumo se ha producido toda una revolución en lo que a la extensión de Java se refiere.Es posible encontrar microprocesadores diseñados para ejecutar bytecode Java y software Java para tarjetasinteligentes (JavaCard), teléfonos móviles, buscapersonas, set-top-boxes, sintonizadores de TV y otros pequeñoselectrodomésticos.El modelo de desarrollo de estas aplicaciones es muy semejante a las applets de los navegadores salvo que en estecaso se denominan MIDlets.Véase Sun Mobile Device Tecnology [37]

En el navegador webDesde la primera versión de java existe la posibilidad de desarrollar pequeñas aplicaciones (Applets) en Java queluego pueden ser incrustadas en una página HTML para que sean descargadas y ejecutadas por el navegador web.Estas mini-aplicaciones se ejecutan en una JVM que el navegador tiene configurada como extensión (plug-in) en uncontexto de seguridad restringido configurable para impedir la ejecución local de código potencialmente malicioso.El éxito de este tipo de aplicaciones (la visión del equipo de Gosling) no fue realmente el esperado debido a diversosfactores, siendo quizás el más importante la lentitud y el reducido ancho de banda de las comunicaciones en aquelentonces que limitaba el tamaño de las applets que se incrustaban en el navegador. La aparición posterior de otrasalternativas (aplicaciones web dinámicas de servidor) dejó un reducido ámbito de uso para esta tecnología, quedandohoy relegada fundamentalmente a componentes específicos para la intermediación desde una aplicación webdinámica de servidor con dispositivos ubicados en la máquina cliente donde se ejecuta el navegador.Las applets Java no son las únicas tecnologías (aunque sí las primeras) de componentes complejos incrustados en elnavegador. Otras tecnologías similares pueden ser: ActiveX de Microsoft, Flash, Java Web Start, etc.

En sistemas de servidorEn la parte del servidor, Java es más popular que nunca, desde la aparición de la especificación de Servlets y JSP(Java Server Pages).Hasta entonces, las aplicaciones web dinámicas de servidor que existían se basaban fundamentalmente encomponentes CGI y lenguajes interpretados. Ambos tenían diversos inconvenientes (fundamentalmente lentitud,elevada carga computacional o de memoria y propensión a errores por su interpretación dinámica).Los servlets y las JSPs supusieron un importante avance ya que:• El API de programación es muy sencilla, flexible y extensible.•• Los servlets no son procesos independientes (como los CGIs) y por tanto se ejecutan dentro del mismo proceso

que la JVM mejorando notablemente el rendimiento y reduciendo la carga computacional y de memoriarequeridas.

•• Las JSPs son páginas que se compilan dinámicamente (o se pre-compilan previamente a su distribución) de modoque el código que se consigue una ventaja en rendimiento substancial frente a muchos lenguajes interpretados.

La especificación de Servlets y JSPs define un API de programación y los requisitos para un contenedor (servidor)dentro del cual se puedan desplegar estos componentes para formar aplicaciones web dinámicas completas. Hoy día

Page 52: Lenguaje de Programación. Java

Java (lenguaje de programación) 50

existen multitud de contenedores (libres y comerciales) compatibles con estas especificaciones.A partir de su expansión entre la comunidad de desarrolladores, estas tecnologías han dado paso a modelos dedesarrollo mucho más elaborados con frameworks (pe Struts, Webwork) que se sobreponen sobre los servlets y lasJSPs para conseguir un entorno de trabajo mucho más poderoso y segmentado en el que la especialización de rolessea posible (desarrolladores, diseñadores gráficos,...) y se facilite la reutilización y robustez de código. A pesar detodo ello, las tecnologías que subyacen (Servlets y JSPs) son substancialmente las mismas.Este modelo de trabajo se ha convertido en uno de los estándar de-facto para el desarrollo de aplicaciones webdinámicas de servidor.

En aplicaciones de escritorioHoy en día existen multitud de aplicaciones gráficas de usuario basadas en Java. El entorno de ejecución Java (JRE)se ha convertido en un componente habitual en los PC de usuario de los sistemas operativos más usados en elmundo. Además, muchas aplicaciones Java lo incluyen dentro del propio paquete de la aplicación de modo que seejecuten en cualquier PC.En las primeras versiones de la plataforma Java existían importantes limitaciones en las APIs de desarrollo gráfico(AWT). Desde la aparición de la biblioteca Swing la situación mejoró substancialmente y posteriormente con laaparición de bibliotecas como SWT hacen que el desarrollo de aplicaciones de escritorio complejas y con grandinamismo, usabilidad, etc. sea relativamente sencillo.

Plataformas soportadasUna versión del entorno de ejecución Java JRE (Java Runtime Environment) está disponible en la mayoría deequipos de escritorio. Sin embargo, Microsoft no lo ha incluido por defecto en sus sistemas operativos. En el caso deApple, éste incluye una versión propia del JRE en su sistema operativo, el Mac OS. También es un producto que pordefecto aparece en la mayoría de las distribuciones de GNU/Linux. Debido a incompatibilidades entre distintasversiones del JRE, muchas aplicaciones prefieren instalar su propia copia del JRE antes que confiar su suerte a laaplicación instalada por defecto. Los desarrolladores de applets de Java o bien deben insistir a los usuarios en laactualización del JRE, o bien desarrollar bajo una versión antigua de Java y verificar el correcto funcionamiento enlas versiones posteriores.

Programación

ExpresionesLas expresiones son un conjunto de elementos o tokens junto con literales que son evaluados para devolver unresultado. Los tokens son elemento más pequeño de un programa que es significativo, e interpretado o entendido porel compilador, en java los tokens se dividen en cinco categorías que son:Identificadores: Son las representaciones que se les da a los nombres que se asignan a las variables, clases, paquetes,métodos y constantes en el código de java para que el compilador los identifique y el programador puedaentenderlos. En java los identificadores pueden diferenciar entre mayúsculas o minúsculas por ser case sensitive, porlo que la variable cuyo nombre sea “Mivariable”, no es igual a “mivarialble”, ya que java identifica estas comovariables diferentes por el case sensitive, también se puede utilizar números, o el signo “_” para asignar unidentificador.Palabras claves: Son los identificadores reservados por java para cumplir con un objetivo específico en el código yel compilador, se usan de forma limitada y en casos específicos. Las palabras claves que usa java son las siguientes:

Page 53: Lenguaje de Programación. Java

Java (lenguaje de programación) 51

abstract boolean break byte case

catch char class continue default

do double else extends false

final finally float for if

implements import instanceof int interface

long native new null package

private protected public return short

static super switch syncroniced this

throw throws transient true try

void volatile while var rest

byvalue cast const future generic

goto inner operator outer

Las palabras que se encuentran en negrilla, son palabras claves para java aunque actualmente no se utilicen en laversión de java, pero se pretenden integrar en las siguientes versiones de java. Las palabras como true, false o nulltambién son palabras claves pero son palabras reservadas en java por lo cual no pueden ser utilizadas como unidentificador.Literales y constantes:Los literales son sintaxis para asignar valores a una variable, es decir el valor que puede tomaruna variable, también es un valor constante que puede ser de tipo numérico. Las constantes son variables que tienenun valor fijo y no puede ser modificado en el trascurso de la ejecución del código, estas se declaran por medio de losmodificadores final y static.final static double pi= 3.1416;Operadores: Son los que nos indican una evaluación que se aplica a un objeto o un dato, sobre un identificador oconstante. Un ejemplo de operadores puede ser la suma, resta o multiplicación.Separadores: Se utilizan para indicarle al compilador de java donde se ubican los elementos del código, losseparadores que admite java son: { },:;También el compilador de java identifica y elimina los comentarios, retornos de carros espacios vacíos y detabulación a la hora de compilar por lo que no son considerados parte de un tokens.Las expresiones pueden ser una combinación en secuencia de variables, operadores y métodos. Las expresiones sonutilizadas para realizar cálculos, para asignar valores a variables, o para controlar la ejecución del flujo del programa.

OperadoresLos operadores son aquellos que tras realizar una operación devuelven un resultado, estos se puede caracterizar porel número de operadores, el tipo de operandos, y el resultado que generan.Número de operandos. Pueden ser de dos tipos unarios, y binarios. Los unarios son aquellos que solo necesitan de unoperando para devolver un valor, mientras que los binarios necesitan de dos o más operandos.Operadores unarios.

Page 54: Lenguaje de Programación. Java

Java (lenguaje de programación) 52

Operador Descripción

- Cambio de signo

! Operador NOT

~ Complemento a 1

Operadores binarios.

Operadores Descripción

+ - * / % Operadores aritméticos

== != < > <= >= Operadores relacionales

&& ^ Operadores booleanos

^ << >> >>> Operadores a nivel de bit

+ Concatenación de cadenas

Operadores a nivel de bit

Los operadores a nivel de bit nos permiten realizar operaciones sobre números binarios.~ Complemento a 1, este operador invierte los dígitos, cambiando los 0 por 1 y los 1 por 0, un ejemplo puede ser:

11001011

~ 11001011 resultado 00110100

Como se puede ver se cambian los valores de 0 a 1 y de 1 a 0.& AND a nivel de bit, este operador realiza una operación AND o suma entre dos números de bit, en donde si dos bitson igual a 1 el resultado será 1, de lo contrario será 0, un ejemplo puede ser:

situacion

01001101

& 10011011

______________

00001001

| Or a nivel de bit, este operador realiza una operación OR en donde si alguno de los dos números es 1 el resultadoserá 1, un ejemplo puede ser:

11001101

| 01011101

______________

11011101

^ XOR a nivel de bit, este operador realiza la operación XOR en donde si los dos números son iguales el resultadoserá 0 de lo contrario será 1, un ejemplo puede ser:

001010012

^ 011011012

______________

01000100

<< Desplazamiento a la izquierda, este operador desplaza n cantidad de espacios a la izquierda un bit, un ejemplopuede ser;

Page 55: Lenguaje de Programación. Java

Java (lenguaje de programación) 53

01101110

01101110 << 2 = 11011100

Como se puede ver al realizar el desplazamiento se realiza una inserción de un dígito 0 a la derecha

Precedencia de operadoresLos operadores son una parte principal en las expresiones, el tipo y forma de uso es fundamental a la hora deprogramas, pero para su uso se tiene que tener en cuenta una serie de normas, como lo son la precedencia de losoperadores.Los operadores son ejecutados según su precedencia, si cuentan con una precedencia mayor serán evaluados primeroque los de precedencia menor, si por casualidad se llegase a presentar operadores con el mismo nivel de precedencia,estos se evaluaran de derecha a izquierda, si son operadores binarios (menos los operadores de asignación) seevaluaran de izquierda a derecha. A Java se le puede indicar que operadores debe evaluar primero sin importar suprecedencia por medio de paréntesis ( ), de esta forma el compilador de java interpreta que primero ejecutara lasoperaciones que se encuentran dentro de los paréntesis, y luego continuara con los demás operadores. La siguientetabla indicara en nivel de precedencia de los operadores utilizados en java, teniendo en cuenta que el nivel deprecedencia esta indicado de arriba a abajo, siendo arriba el nivel más alto.Precedencia de los operadores en java.

Tipo de operadores Operadores

Operadores posfijos [ ] . ( parámetros) expr++ expr--

Operadores unarios ++expr –expr +expr -expr ~ !

Creación o conversión New (tipo) expr

Multiplicación * / %

Suma + -

Desplazamiento << >> >>>

Comparación < > <= >= instanceof

Igualdad == !=

AND a nivel bit &

OR a nivel bit |

XOR a nivel bit ^

AND lógico &&

OR lógico ||

Condicional ? :

Asignación = += -= *= /= %= &= ^= |= <<= >>= >>>=

Un ejemplo de la precedencia de los operadores en java podría ser el siguiente, en donde tenemos un código que seencargara de realizar una serie de operaciones aritméticas.int numero1 = 3;int numero2= 4;int resultado;resultado= numero1 + numero2 * 3;System.out.println ( resultado); //esto imprime el valor de 15

Page 56: Lenguaje de Programación. Java

Java (lenguaje de programación) 54

según la precedencia de los operadores la multiplicación * tiene mayor prioridad que la suma +, por lo que primerose ejecuta la multiplicación y luego se realiza la suma.int numero1 = 3;int numero2= 4;int resultado;resultado= (numero1 + numero2) * 3;System.out.println ( resultado); //esto imprime el valor de 21En este caso el resultado cambia ya que primero se evalúan los parámetros que están dentro del paréntesis y luego seevalúa el resto de parámetros. Una de las recomendaciones que da java para el desarrollo es el uso de los paréntesisen las operaciones con más de 3 operandos, así de esta forma el código se hace más legible y se evitan errores almomento de compilar.

SentenciasLas sentencias son una representación de una secuencia de acciones que se realizan en java, la clave fundamental delas sentencias es su punto final que indica que ha finalizado la sentencia y puede continuar con la siguiente, elindicador utilizado es el signo de punto y coma (; ). Contamos en java con sentencias que pueden ir desde sentenciasde asignación, de bucles, condicionales, y de salto. Las sentencias se conforman comúnmente por una instancia, y unoperador, un ejemplo es la sentencia de asignación que se conforma por una instancia de una variable, el signo deasignación y una expresión, un ejemplo es:int variable= 12+2;Las sentencias de asignación son aquellas en las que se asigna un valor a una variable o constante. Las sentenciascondicionales son las que expresan una condición para definir el flujo de ejecución del programa, entre ellas tenemosif-else y switch. Las sentencias de bucles se encargar de realizar una acción cierta cantidad de tiempo dado, o hastaque se cumpla con una condición, entre ellas tenemos el while, do-while, y for. Las sentencias de salto llevan alcompilador a un punto específico del programa o hacia la siguiente sentencia de ejecución, entre ellas tenemos break,continue, y return.

Conversión de tipos

En algunos casos suele ser necesario convertir un tipo de dato a otro, esto se le conoce como conversión de tipos,modelado, o tipado, así de esta forma poder realizar las operaciones necesarias sobre el valor que se desea convertir.Se debe tener en cuenta el tipo de dato que se va a convertir, ya que si se convierte un dato que tenga una cantidadmenor de bit al anterior este tendrá perdida de información, un ejemplo de tipado puede ser un número long que sedesea convertir a int, el compilador eliminara los primeros 32bit del long para ajustarlo al int ya que el int es de 32bity el long de 64. Si la conversión se realiza a un tipo de datos de menos bit a un tipo de datos con mayor bit, laconversión se realiza automáticamente llamada conversión implícita, pero si se realiza de un tipo de datos con mayorbit a menor bit se tiene que realizar una conversión explicita, la cual se realiza con un casting, al usar este método seobliga a realizar la conversión por lo cual puede haber perdida de datos en la conversión. Para realizar unaconversión explicita se tiene que poner el tipo de dato que se desea realizar la conversión entre paréntesis, luego elvalor o la variable que se desea convertir. Un ejemplo de conversión de tipo explicito puede ser:Int numero1 = 32;byte numero2;numero2 = (byte) numero1;Un ejemplo de una conversión de tipo implícita puede ser:int numero1 = 32;long numero2;numero2 = numero1;

Page 57: Lenguaje de Programación. Java

Java (lenguaje de programación) 55

Las siguiente tabla muestra la los tipos de datos que se pueden realizar una conversión implícita desde el dato origen,hasta el dato destino que es el dato en el que se va a convertir.

Tipo origen Tipo destino

byte double, float, long, int, char, short

short double, float, long, int

char double, float, long, int

int double, float, long

long double, float

float double

Los tipos de datos booleanos no pueden ser convertidos a otro tipo de datos, por ningún método mencionadoanteriormente. Otro tipo de conversión que no se encuentre en esta tabla desde el origen al destino, tiene querealizarse por medio de una conversión explícita por casting. Cuando se desea realizar una conversión de un tipostring como origen a otro tipo, es necesario utilizar una función que se encarga de convertir el tipo de dato, lafunción necesaria se compone de la variable que va almacenar el resultado, y dependiendo de la variable se usa elparámetro que inicia con el tipo de dato a convertir, Integer, Byte, Short, o Long, seguida de punto “. “, el cual indicaque se cargarán los atributos del parámetro, en donde cargaremos el parseInt si queremos convertir a interger oparseByte si queremos convertir a byte, o dependiendo del tipo de dato, seguido de paréntesis en donde se agregarael valor de string a convertir. Algunos ejemplos puede ser:int numero1;long numero2;byte numero3;String texto= “20111”;numero1 = Interger.parseInt ( texto );numero2 = Long.parseLong ( texto);numero3 = Byte.parseByte ( texto );esto suele ser usado para realizar una conversión de texto cuando se ingresan valores numéricos por una entrada ajava, la cual los detecta como string, así de esta forma puede convertir el texto que se ingresa a un número pararealizar operaciones, como una calculadora.

Industria relacionadaSun Microsystem, como creador del lenguaje de programación Java y de la plataforma JDK, mantiene fuertespolíticas para mantener una especificación del lenguaje[38] así como de la máquina virtual[39] a través del JCP. Esdebido a este esfuerzo que se mantiene un estándar de facto.Son innumerables las compañías que desarrollan aplicaciones para Java y/o están volcadas con esta tecnología:• La industria de la telefonía móvil está fuertemente influenciada por la tecnología Java.• Los entornos de desarrollo Netbeans y Eclipse ha tomado un lugar importante entre la comunidad de

desarrolladores Java.• La fundación Apache tiene también una presencia importante en el desarrollo de bibliotecas y componentes de

servidor basados en Java.• IBM, BEA, IONA, Oracle,... son empresas con grandes intereses y productos creados en y para Java.

Page 58: Lenguaje de Programación. Java

Java (lenguaje de programación) 56

CríticasEn 1995 alguien dijo que Java fue creado para abrir una nueva vía en la gestión de software complejo, y es por reglageneral aceptado que se ha comportado bien en ese aspecto. Sin embargo no puede decirse que Java no tenga grietas,ni que se adapta completamente a todos los estilos de programación, todos los entornos, o todas las necesidades.

General• Java no ha aportado capacidades estándares para aritmética en punto flotante. El estándar IEEE 754 para

“Estándar para Aritmética Binaria en Punto Flotante” apareció en 1985, y desde entonces es el estándar para laindustria. Y aunque la aritmética flotante de Java (cosa que cambió desde el 13 de noviembre de 2006, cuando seabrió el código fuente y se adoptó la licencia GPL, aparte de la ya existente)[cita requerida] se basa en gran medidaen la norma del IEEE, no soporta aún algunas características. Más información al respecto puede encontrarse enla sección final de enlaces externos.

El lenguaje• En un sentido estricto, Java no es un lenguaje absolutamente orientado a objetos, a diferencia de, por ejemplo,

Ruby o Smalltalk. Por motivos de eficiencia, Java ha relajado en cierta medida el paradigma de orientación aobjetos, y así por ejemplo, no todos los valores son objetos.

• El código Java puede ser a veces redundante en comparación con otros lenguajes. Esto es en parte debido a lasfrecuentes declaraciones de tipos y conversiones de tipo manual (casting). También se debe a que no se disponede operadores sobrecargados, y a una sintaxis relativamente simple. Sin embargo, J2SE 5.0 introduce elementospara tratar de reducir la redundancia, como una nueva construcción para los bucles ‘’’foreach’’’.

•• A diferencia de C++, Java no dispone de operadores de sobrecarga definidos por el usuario. Los diseñadores deJava tomaron esta decisión puesto que consideraban que, bajo ciertas circunstancias, esta característica podíacomplicar la lectura y mantenimiento de los programas.

AparienciaLa apariencia externa (el ‘‘‘look and feel’’’) de las aplicaciones GUI (Graphical User Interface) escritas en Javausando la plataforma Swing difiere a menudo de la que muestran aplicaciones nativas. Aunque el programador puedeusar el juego de herramientas AWT (Abstract Windowing Toolkit) que genera objetos gráficos de la plataformanativa, el AWT no es capaz de funciones gráficas avanzadas sin sacrificar la portabilidad entre plataformas; ya quecada una tiene un conjunto de APIs distinto, especialmente para objetos gráficos de alto nivel. Las herramientas deSwing, escritas completamente en Java, evitan este problema construyendo los objetos gráficos a partir de losmecanismos de dibujo básicos que deben estar disponibles en todas las plataformas. El inconveniente es el trabajoextra requerido para conseguir la misma apariencia de la plataforma destino. Aunque esto es posible (usando GTK+y el Look-and-Feel de Windows), la mayoría de los usuarios no saben cómo cambiar la apariencia que seproporciona por defecto por aquella que se adapta a la de la plataforma.

Page 59: Lenguaje de Programación. Java

Java (lenguaje de programación) 57

RendimientoEl bytecode de Java puede ser interpretado en tiempo de ejecución por la máquina virtual, o bien compilado alcargarse el programa, o durante la propia ejecución, para generar código nativo que se ejecuta directamente sobre elhardware. Si es interpretado, será más lento que usando el código máquina intrínseco de la plataforma destino. Si escompilado, durante la carga inicial o la ejecución, la penalización está en el tiempo necesario para llevar a cabo lacompilación.Algunas características del propio lenguaje conllevan una penalización en tiempo, aunque no son únicas de Java.Algunas de ellas son el chequeo de los límites de arrays, chequeo en tiempo de ejecución de tipos, y la indirección defunciones virtuales.El uso de un recolector de basura para eliminar de forma automática aquellos objetos no requeridos, añade unasobrecarga que puede afectar al rendimiento, o ser apenas apreciable, dependiendo de la tecnología del recolector yde la aplicación en concreto. Las JVM modernas usan recolectores de basura que gracias a rápidos algoritmos demanejo de memoria, consiguen que algunas aplicaciones puedan ejecutarse más eficientemente.El rendimiento entre un compilador JIT y los compiladores nativos puede ser parecido, aunque la distinción no estáclara en este punto. La compilación mediante el JIT puede consumir un tiempo apreciable, un inconvenienteprincipalmente para aplicaciones de corta duración o con gran cantidad de código. Sin embargo, una vez compilado,el rendimiento del programa puede ser comparable al que consiguen compiladores nativos de la plataforma destino,inclusive en tareas numéricas. Aunque Java no permite la expansión manual de llamadas a métodos, muchoscompiladores JIT realizan esta optimización durante la carga de la aplicación y pueden aprovechar información delentorno en tiempo de ejecución para llevar a cabo transformaciones eficientes durante la propia ejecución de laaplicación. Esta recompilación dinámica, como la que proporciona la máquina virtual HotSpot de Sun, puede llegar amejorar el resultado de compiladores estáticos tradicionales, gracias a los datos que sólo están disponibles durante eltiempo de ejecución.Java fue diseñado para ofrecer seguridad y portabilidad, y no ofrece acceso directo al hardware de la arquitectura nial espacio de direcciones. Java no soporta expansión de código ensamblador, aunque las aplicaciones pueden accedera características de bajo nivel usando bibliotecas nativas (JNI, Java Native Interfaces).

Recursos

JREEl JRE (Java Runtime Environment, o Entorno en Tiempo de Ejecución de Java) es el software necesario paraejecutar cualquier aplicación desarrollada para la plataforma Java. El usuario final usa el JRE como parte de paquetessoftware o plugins (o conectores) en un navegador Web. Sun ofrece también el SDK de Java 2, o JDK (JavaDevelopment Kit) en cuyo seno reside el JRE, e incluye herramientas como el compilador de Java, Javadoc paragenerar documentación o el depurador. Puede también obtenerse como un paquete independiente, y puedeconsiderarse como el entorno necesario para ejecutar una aplicación Java, mientras que un desarrollador debeademás contar con otras facilidades que ofrece el JDK.

Page 60: Lenguaje de Programación. Java

Java (lenguaje de programación) 58

Componentes•• Bibliotecas de Java, que son el resultado de compilar el código fuente desarrollado por quien implementa la JRE,

y que ofrecen apoyo para el desarrollo en Java. Algunos ejemplos de estas bibliotecas son:•• Las bibliotecas centrales, que incluyen:

• Una colección de bibliotecas para implementar estructuras de datos como listas, arrays, árboles y conjuntos.• Bibliotecas para análisis de XML.•• Seguridad.•• Bibliotecas de internacionalización y localización.

•• Bibliotecas de integración, que permiten la comunicación con sistemas externos. Estas bibliotecas incluyen:• La API para acceso a bases de datos JDBC (Java DataBase Conectivity).• La interfaz JNDI (Java Naming and Directory Interface) para servicios de directorio.• RMI (Remote Method Invocation) y CORBA para el desarrollo de aplicaciones distribuidas.

•• Bibliotecas para la interfaz de usuario, que incluyen:•• El conjunto de herramientas nativas AWT (Abstract Windowing Toolkit), que ofrece componentes GUI

(Graphical User Interface), mecanismos para usarlos y manejar sus eventos asociados.•• Las Bibliotecas de Swing, construidas sobre AWT pero ofrecen implementaciones no nativas de los

componentes de AWT.•• APIs para la captura, procesamiento y reproducción de audio.

•• Una implementación dependiente de la plataforma en que se ejecuta de la máquina virtual de Java (JVM), que esla encargada de la ejecución del código de las bibliotecas y las aplicaciones externas.

•• Plugins o conectores que permiten ejecutar applets en los navegadores Web.•• Java Web Start, para la distribución de aplicaciones Java a través de Internet.•• Documentación y licencia.

APIsSun define tres plataformas en un intento por cubrir distintos entornos de aplicación. Así, ha distribuido muchas desus APIs (Application Program Interface) de forma que pertenezcan a cada una de las plataformas:• Java ME (Java Platform, Micro Edition) o J2ME — orientada a entornos de limitados recursos, como teléfonos

móviles, PDAs (Personal Digital Assistant), etc.• Java SE (Java Platform, Standard Edition) o J2SE — para entornos de gama media y estaciones de trabajo. Aquí

se sitúa al usuario medio en un PC de escritorio.• Java EE (Java Platform, Enterprise Edition) o J2EE — orientada a entornos distribuidos empresariales o de

Internet.Las clases en las APIs de Java se organizan en grupos disjuntos llamados paquetes. Cada paquete contiene unconjunto de interfaces, clases y excepciones relacionadas. La información sobre los paquetes que ofrece cadaplataforma puede encontrarse en la documentación de ésta.El conjunto de las APIs es controlado por Sun Microsystems junto con otras entidades o personas a través delprograma JCP (Java Community Process). Las compañías o individuos participantes del JCP pueden influir de formaactiva en el diseño y desarrollo de las APIs, algo que ha sido motivo de controversia.

Page 61: Lenguaje de Programación. Java

Java (lenguaje de programación) 59

Extensiones y arquitecturas relacionadasLas extensiones[40] de Java están en paquetes que cuelgan de la raíz javax: javax.*. No se incluyen en la JDK o elJRE. Algunas de las extensiones y arquitecturas ligadas estrechamente al lenguaje Java son:• Java EE (Java Platform, Enterprise Edition; antes J2EE) —para aplicaciones distribuidas orientadas al entorno

empresarial

Java en código abiertoJava se ha convertido en un lenguaje con una implantación masiva en todos los entornos (personales yempresariales). El control que mantiene Sun sobre éste ha generado reticencias en la comunidad de empresas confuertes intereses en Java (IBM, Oracle) y obviamente en la comunidad de desarrolladores de software libre.La evolución basada en un comité en el que participen todos los implicados no es suficiente y la comunidaddemandaba desde hace tiempo la liberación de las APIs y bibliotecas básicas de la JDK.En diciembre de 2006, Sun Microsystems comenzó el relanzamiento de su plataforma Java[41] bajo la licencia GPLde GNU.En abril de 2009 Oracle adquirió Sun Microsystems, lo que generó temor en la comunidad ante la posiblemercantilización del lenguaje de programación orientado a objetos más popular actualmente. Por ahora Oracle haseguido manteniendo Java, estando las versiones posteriores a la 6 bajo su control.Se instala una versión homebrew de PSPKVM (0.5.5) para emular la plataforma de Java en PSP. Esto permite usarprogramas JAVA en esta videoconsola.

Alternativas libresExisten alternativas para el entorno de ejecución y de desarrollo de Java con una gran cobertura de funcionalidadescon respecto a las implementaciones comerciales de Sun, IBM, Bea, etc.

Críticas referentes a Java y el software libre• Free But Shackled — The Java Trap [42], de Richard Stallman, 12 de abril de 2004. (respuesta de James Gosling

[43])• Traducción al español de este artículo: Libre pero encadenado. La trampa del Java. [44] (Nótese que hay una

nota en un recuadro amarillo que habla de la situación actual con respecto a lo que se dice en ese artículo)Notar que este artículo fue escrito antes de la liberación del código fuente de Java. En la actualidad la postura de laFree Software Foundation y de Richard Stallman han cambiado[cita requerida], mostrándose partidarios ambos de suuso en software libre.

Referencias• Jon Byous, Java technology: The early years [45]. Sun Developer Network, sin fecha[ca. 1998]. Recuperado 21 de

abril de 2005.• James Gosling, A brief history of the Green project [46]. Java.net, sin fecha [ca. Q1/1998]. Recuperado 22 abril de

2005.• James Gosling, Bill Joy, Guy Steele, y Gilad Bracha, The Java language specification, tercera edición.

Addison-Wesley, 2005. ISBN 0-321-24678-0.• Tim Lindholm y Frank Yellin. The Java Virtual Machine specification, segunda edición. Addison-Wesley, 1999.

ISBN 0-201-43294-3.

Page 62: Lenguaje de Programación. Java

Java (lenguaje de programación) 60

Notas[1] http:/ / www. oracle. com/ technetwork/ java/ index. html[5] http:/ / www. sun. com/ smi/ Press/ sunflash/ 1996-01/ sunflash. 960109. 14048. html[7] http:/ / www. jcp. org/ en/ jsr/ detail?id=63[8] http:/ / www. google. com[9] http:/ / www. sun. com/ smi/ Press/ sunflash/ 1997-02/ sunflash. 970219. 0001. html[10] http:/ / www. sun. com/ smi/ Press/ sunflash/ 1998-12/ sunflash. 981208. 9. html[11] http:/ / www. sun. com/ smi/ Press/ sunflash/ 2000-05/ sunflash. 20000508. 3. html[12] http:/ / java. sun. com/ j2se/ 1. 3/ docs/ relnotes/ features. html[13] http:/ / www. jcp. org/ en/ jsr/ detail?id=59[14] http:/ / www. sun. com/ smi/ Press/ sunflash/ 2002-02/ sunflash. 20020206. 5. html[15] http:/ / java. sun. com/ j2se/ 1. 4. 2/ docs/ relnotes/ features. html[16] http:/ / www. jcp. org/ en/ jsr/ detail?id=41[17] http:/ / www. jcp. org/ en/ jsr/ detail?id=51[18] http:/ / www. jcp. org/ en/ jsr/ detail?id=47[19] http:/ / www. jcp. org/ en/ jsr/ detail?id=5[20] http:/ / www. jcp. org/ en/ jsr/ detail?id=56[21] http:/ / java. sun. com/ j2se/ 1. 5. 0/ docs/ relnotes/ version-5. 0. html[22] http:/ / www. jcp. org/ en/ jsr/ detail?id=176[23] http:/ / www. sun. com/ smi/ Press/ sunflash/ 2004-09/ sunflash. 20040930. 1. html[24] http:/ / www. jcp. org/ en/ jsr/ detail?id=14[25] http:/ / www. jcp. org/ en/ jsr/ detail?id=175[26] http:/ / java. sun. com/ j2se/ 1. 5. 0/ docs/ api/ java/ lang/ Integer. html[27] http:/ / www. jcp. org/ en/ jsr/ detail?id=201[28] http:/ / java. sun. com/ j2se/ 1. 5. 0/ docs/ api/ java/ lang/ Iterable. html[29] http:/ / java. sun. com/ j2se/ 1. 5. 0/ docs/ api/ java/ util/ Collection. html[30] https:/ / mustang. dev. java. net/[31] http:/ / www. jcp. org/ en/ jsr/ detail?id=270[32] http:/ / www. java. com/ en/ about/ brand/ naming. jsp[33] http:/ / java. sun. com/ javase/ 6/[34] http:/ / weblogs. java. net/ blog/ editors/ archives/ 2004/ 09/ evolving_a_lang. html[35] https:/ / eyeasme. com/ Shayne/ HTML5_APPLETS/ .[36] http:/ / java. sun. com/ docs/ books/ tutorial/ deployment/ applet/ mixedbrowser. html[37] http:/ / developers. sun. com/ mobility/ index. jsp[38] Especificación del lenguaje Java (http:/ / java. sun. com/ docs/ books/ jls/ )[39] Especificación de la máquina virtual Java (http:/ / java. sun. com/ docs/ books/ vmspec/ )[41] Sun begins releasing Java under the GPL - Free Software Foundation (http:/ / www. fsf. org/ news/ fsf-welcomes-gpl-java. html)[42] http:/ / www. gnu. org/ philosophy/ java-trap. html[43] http:/ / today. java. net/ jag/ page7. html#59[44] http:/ / www. gnu. org/ philosophy/ java-trap. es. html[45] http:/ / java. sun. com/ features/ 1998/ 05/ birthday. html[46] http:/ / today. java. net/ jag/ old/ green/

Enlaces externosWikilibros• Wikilibros alberga un libro o manual sobre Programación en Java.• Programas hechos en java con código fuente (http:/ / torturo. com/ programas-hechos-en-java/ )

Oracle - Sun• Sitio oficial de Java para desarrolladores, etc (http:/ / java. sun. com/ )• The Java Language Specification, Tercera edición (http:/ / java. sun. com/ docs/ books/ jls/ ) Especificación

oficial del lenguaje Java• Tutorial de Sun sobre el Lenguaje de programación Java (http:/ / java. sun. com/ docs/ books/ tutorial/ )• Libro blanco original de Java (http:/ / java. sun. com/ docs/ white/ langenv/ ), 1996

Page 63: Lenguaje de Programación. Java

Java (lenguaje de programación) 61

Tutoriales• Thinking in Java (http:/ / www. bruceeckel. com/ ), de Bruce Eckel (online)• An introduction to Computer Science using Java (http:/ / programmedlessons. org/ java5) por Bradley Kjell.• Java Course (http:/ / www. vias. org/ javacourse/ ), de A.B. Downey.• Computer-Books.us (http:/ / www. computer-books. us/ java. php) Colección de libros sobre Java disponibles

para descarga gratuita.•• En castellano:

• Tutoriales y ejemplos de códigos y proyectos guía para comenzar a desarrollar en java. (http:/ / kukulkan.260mb. com/ Programacion. html)

• Colección «Java a tope» de libros electrónicos (http:/ / www. lcc. uma. es/ ~galvez/ ) (Universidad de Málaga.España)

• Curso de Java, de cero a hasta conexión a MYSQL, incluye PDF (http:/ / www. cursodejava. com. mx/ )(México)

• Capacitación en Java sobre Grandes Proyectos (http:/ / www. nullbrainexception. blogspot. com/ )• Tutoriales J2EE y Liferay (http:/ / www. coretec. es)

Críticas• Softpanorama Java Critique Page: Java vs Scripting Languages (http:/ / www. softpanorama. org/ Lang/ java.

shtml), de Nikolai Bezroukov• How Java’s Floating-Point Hurts Everyone Everywhere (http:/ / www. cs. berkeley. edu/ ~wkahan/ JAVAhurt.

pdf), de W. Kahan und Joseph D. Darcy en el ACM 1998 Workshop on Java for High–Performance NetworkComputing

Page 64: Lenguaje de Programación. Java

Fuentes y contribuyentes del artículo 62

Fuentes y contribuyentes del artículoProgramación  Fuente: http://es.wikipedia.org/w/index.php?oldid=66429230  Contribuyentes: 3xxx, AchedDamiman, Acratta, Airunp, Albertochoa, Alvaro qc, Amorde2, Andreasmperu,Angelito7, Antur, Ascánder, Autonomia, Bboccioz, Biasoli, Bifus, BlackBeast, Brainup, Cata11, Chester269, Cheveri, Ciencia Al Poder, Cinabrium, Cmontero, Communities, Correogsk,Cousteau, Ctrl Z, David0811, DavidUlquiorra, Diegusjaimes, Digigalos, Dinopmi, Dodo, Dorieo, Dromero, EL Willy, Eduardo Lima, Edub, Ejmeza, Elabra sanchez, Electrican MV, Elsenyor,Emijrp, Esoya, FAR, Fabian Rod, Fernando Estel, Fernandomirandamuro, Fortran, GermanX, Guanxito, Gusbelluwiki, Helmy oved, Humberto, IATG, Ignacio Icke, Isha, Ivancp, JMDC, Jarisleif,Jaromero, Javier Carro, Javierito92, Jcaraballo, Jecanre, Jesuja, Jjflorescueto, Jkbw, Jonpagecr, Jorgelrm, Josmanbernal, Jstitch, Jugones55, Jyon, Krli2s, Kved, Laura Fiorucci, Lendir,Leonpolanco, Lic. Armando, Linux65, Lucascr, Lucien leGrey, Mafores, ManuelGR, Marvelshine, Matdrodes, Mejiad, Mendocino, Merryt, Mikel Gómez, Moriel, Moucaisius, Murven,NaBUru38, NeoTommy, Netito777, Nioger, Ortellado, Ovallesoft, Pablomdo, Pedrovicenterosero, Petruss, Pmisiones, Porao, Pólux, Quiron, Qwertyytrewqqwerty, Rbonvall, Renly, Retama,Richy, Rosarinagazo, Rrmsjp, Rsg, Rubpe19, Sanbec, Sauron, Sdfk, Sebrev, Sergio Andres Segovia, SergioN, Serolillo, Shooke, Sicarul, Slashcsc, Soniautn, Stuffy, SuperBraulio13, Tano4595,Technopat, Tigerfenix, TigreVMMM, Tirithel, Tomatejc, Tostadora, Travelour, Unf, Upc, Viko, Vitamine, Vitucho3005, Voetius, Waka Waka, X.Cyclop, Xsm34, Xx.the.samuel.xx, Youssefsan,Zanaqo, conversion script, host-200-76-49-134.block.alestra.net.mx, 482 ediciones anónimas

Sistema binario  Fuente: http://es.wikipedia.org/w/index.php?oldid=66497275  Contribuyentes: .Sergio, 123rlqc, 1969, 2rombos, Abgenis, AldanaN, Alexav8, Alhen, Almendro, Aloriel, Alvaroqc, Alzina, Andreasmperu, Andressanchez 11, Angel GN, Angelito7, Antonorsi, Antur, Ascánder, Asqueladd, Axvolution, Axxgreazz, Açipni-Lovrij, BL, Baiji, Balderai, Banfield, Barleduc,Barteik, Belb, Beto 04 2589, BiT, BlackBeast, BuenaGente, Camiloalcubo2, Caritopxndx, Carlos yo, CarlosHoyos, Carlota98, Carnendil, Cheveri, Christiangda, Cinabrium, Cobalttempest,Cookie, Corrector1, Cratón, Ctrl Z, DJ Nietzsche, Dark, David0811, Delapunta, Derek-Uchiha, Descansatore, Diegusjaimes, Digigalos, Dinopmi, Dixono2, Dodo, Dove, Drjackzon, Eaguero,Edgar, Edgarm, Edmenb, Eduardo Lima, Eduardosalg, Edub, El guardian999, Elisardojm, Emferr, Emiduronte, Emijrp, Ensada, Equi, Esteban0602, Farisori, Fixertool, Flakinho, Fmariluis,Foundling, Fran89, FrancoGG, Friera, Frutoseco, Gabriel Acquistapace, GabrielBalaudo, Gacq, Gafotas, Gaius iulius caesar, Genba, GermanX, Ggenellina, Gizmo II, Greek, Gsrdzl, Guay,Gusgus, HUB, Halfdrag, Hanjin, Helmy oved, Heriotza, Hispa, Humbefa, Humberto, Igna, Ignacio Icke, In john, Infrablue2, Interwiki, Isha, Iulius1973, J.M.Domingo, JABO, JMCC1,Jaagarciaga, Jacina, Janus, Jarisleif, Jarke, Javi1977, Javivi4779, Jcaraballo, Jerowiki, Jkbw, JoRgE-1987, Jordy41, Jorgeyp, Joseaperez, Juanan Ruiz, Juanitoalimaña1997, Julius C, Jume28,Jynus, Kajothi, KanTagoff, Kansai, Kat0, Kismalac, Kved, Kybernia, LMLM, Lara 28, Laura Fiorucci, Lecuona, Leonpolanco, Lucien leGrey, Luis Gonzalez, Luis y itzel, Lunatiko, Lungo,Machlas, Machtvollt, MadriCR, Mafores, Magister Mathematicae, Maldoror, Mandrake33, Manuel Trujillo Berges, ManuelGR, Manuelt15, Manwë, MarcoAurelio, Marianov, Mario modesto,Matdrodes, Matias fontealba, Mbolagay, Mega-buses, Mel 23, Mercenario97, Miguel, Mijailsf, Moriel, Mortadelo2005, MotherForker, Mpeinadopa, Muro de Aguas, Murphy era un optimista,Murven, Mzamora2, Neochuky, Nethac DIU, Netito777, Nicop, Nihilo, Nioger, Numbo3, OboeCrack, P.o.l.o., PETARDOPUNTO, Pabloallo, Paintman, Pan con queso, PepitoGrillo156, Petruss,Pino, Piolinfax, Pjbhva, Plastazero, Poco a poco, Poromiami, Pólux, Queninosta, Racso, Rafadose, Rastrojo, Raystorm, Reignerok, Renly, Rigenea, RoyFocker, Rαge, Sabbut, Savh, Saxwakuy,Sebrev, Siabef, Siin k0dificaar, Sistemo, Sking, Snakeyes, Soulreaper, Spalquimista, SuperBraulio13, Superzerocool, Tano4595, Technopat, Template namespace initialisation script, The chosen,Tirithel, Tomatejc, Torquemado, Tostadora, Triku, Tristoteles, Trotaferoz, Tubet, Unf, VA, VanKleinen, Vandal Crusher, Vic Fede, Vitamine, Vjgils, Waka Waka, Waterpolo, Wikiléptico,Wzwz, Xenoforme, Y0rx, Yoques, Zanaqo, Zeroth, Zerstreut, ZrzlKing, Zumba1984, conversion script, 1393 ediciones anónimas

Lenguaje de programación  Fuente: http://es.wikipedia.org/w/index.php?oldid=66441547  Contribuyentes: Aadrover, AalvaradoH, Achury, Acratta, Adryitan, Airunp, Akhran, Alex15090,AlfonsoERomero, Alhen, Aliamondano, Allforrous, Almorca, Alvaro qc, Amanuense, Andreasmperu, Angelito7, Angus, Antonorsi, Antur, Arcibel, Argentinoo, Ascánder, AstroNomo, Avm,Açipni-Lovrij, BLACK M0NST3R, Baiji, Balderai, Balix, Banfield, Barteik, Bedwyr, BelegDraug, Bob A, Bucephala, BuenaGente, Cam367, Camilo, Cansado, Carlita, Carlos Zeas, Carola-zzz,Cesarintel, Cesarsorm, CharlesKnight, Chfiguer, Chope777, Cobalttempest, Cookie, Cordwainer, Cratón, Cyrax, DJ Nietzsche, Danakil, Danielba894, Dat, David0811, Descansatore, Diego.souto,Diegusjaimes, Digigalos, Diosa, Dodo, Dreitmen, Dusan, Eamezaga, Edc.Edc, Edgarchan, Edmenb, Edslov, Eduardosalg, Edub, Eduiba, Elabra sanchez, Elisardojm, Elproferoman, Elwikipedista,Er Komandante, Erandly, Eroyuela, Esterdelakpaz, Execoot, Ezarate, Ezequiel3E, FCPB, Fabrizotus, Flashlack, FrancoGG, Frei sein, Fsd141, Ganímedes, Gcsantiago, Genba, GermanX,Gmarinp, Googolplanck, Gorpik, Greek, Gusama Romero, HHM, HUB, Harpagornis, Helmy oved, Hompis, House, Humbefa, Humberto, IIM 78, Icvav, Igna, Ignacio Icke, Ilario, Inakivk, Indu,Ingenieros instructivos, Isha, IsmaelLuceno, Ismaell, J.M.Domingo, JMPerez, Jarfil, Jarisleif, Javier Carro, Javierito92, Jefrcast, Jesuja, Jicapter, Jkbw, JoRgE-1987, Jorge c2010, JorgeGG,Jorgechp, Jorgelrm, Jose1080i, Jose1100000, Joseaperez, Joseromerogc, Jsanchezes, Juan Mayordomo, Juanitoalcachofados, Juanjo64, Juank8041, Jugones55, Julie, Julio Cardmat, JyQ, Kalcetin,Komputisto, Krli2s, Kved, LarA, Lcsrns, LeonardoRob0t, Leonpolanco, Linfocito B, LordT, Lucien leGrey, MADAFACK, MadriCR, Mafores, Magister Mathematicae, Mahadeva, Majin boo,Mansoncc, ManuelGR, Manuelt15, Manwë, MarcoAurelio, Martincarr, Mascorria, Matdrodes, Mel 23, Melocoton, MiguelRdz, Moriel, Mpeinadopa, Mr.Ajedrez, Murphy era un optimista,Mushii, Napier, Nernix1, Netito777, Niqueco, Nnss, Nowadays, Oscar ., Otermin, PabloBD, Palita1880, Pan con queso, Pejeyo, Petruss, Platonides, Poco a poco, Porao, Pólux, Queninosta,Qwertyytrewqqwerty, Rata blanca, Raulshc, Rbonvall, Rigenea, Roberpl, RoyFocker, Rsg, Rubpe19, Rumpelstiltskin, Rαge, Sanbec, Sappler, Sauron, Savh, Scott MacLean, Sebado, Sebasweee,Sebrev, Sergio Andres Segovia, Shinigamisajayin, Snakeyes, Spazer, Spc, SuperBraulio13, Superzerocool, Suruena, Swatnio, Taichi, Technopat, Teclis jma, Thormaster, Tigerfenix, Tintinando,Tirithel, TitoPeru, Tomatejc, Tostadora, Triku, Trylks, UA31, Unf, Valthern, Vandal Crusher, Vic Fede, Vitamine, Vubo, Waka Waka, Will vm, Xavigivax, Xemuj, YSCO, ZackBsAs, Zeioth,989 ediciones anónimas

Código fuente  Fuente: http://es.wikipedia.org/w/index.php?oldid=64460673  Contribuyentes: Abgenis, Acratta, Aleator, Allforrous, Angel GN, Angus, Antonio Peinado, Antur, Autonomia,BillGatos, BlackBeast, Blender, Brindys, Danielcarvajal7, DanielithoMoya, Diacritica, Diegusjaimes, Drjackzon, Eduardo Lima, El Moska, Elabra sanchez, Emijrp, Enric Naval, FedericoMP,Gacq, Gaius iulius caesar, GermanX, Giragus, Gonchibolso12, Greek, HaroldBt, Helmy oved, Ikks, Jaromero, Jkbw, JorgeGG, Leonpolanco, Leugim1972, LyingB, Magister Mathematicae,Maldoror, Mansoncc, ManuelGR, Marioneta, Matdrodes, Mgrpmarcemgrp, Mig21bp, Moriel, Mpeinadopa, Murven, Olivares86, Ore07, Pertile, Pólux, Queninosta, Rsg, Sanbec, Sauron, Savh,Spirit-Black-Wikipedista, SuperBraulio13, Superzerocool, Surfaz, Technopat, Tezcatl2, Tirithel, Vitamine, X.Cyclop, Yakoo, 186 ediciones anónimas

Compilador  Fuente: http://es.wikipedia.org/w/index.php?oldid=66168176  Contribuyentes: Aleix87, Amadís, Antonorsi, Antur, Arcibel, BetoCG, Biasoli, Cheveri, Chomoi, Cookie, Daviba,Dgmrtabu, Diegusjaimes, Dodo, Draxtreme, Edgar, Eduardosalg, Elabra sanchez, Eldelgas, Elliniká, Escarlati, Facon, Farisori, FkieCarrero, Fortran, FrancoGG, GMoyano, Garciaejalfonso,Gengiskanhg, GermanX, Gorivero, Góngora, Huds, Interwiki, Isha, Ivan rome, Ivanics, Jarisleif, Jesuja, Jkbw, Jlm29, Jorgechp, Kroji, Leonpolanco, LordT, Lourdes Cardenal, MadriCR,Mansoncc, ManuelGR, Manuelt15, Marianov, Markoszarrate, Matdrodes, Mjmi, Moriel, Murphy era un optimista, Murven, Máximo de Montemar, Nachomanco, Neodop, Niqueco, Paz.ar,Petruss, Pólux, Queninosta, Qwertyytrewqqwerty, Rmaestre, RoyFocker, Rsg, Sabbut, Sauron, Spazer, Superzerocool, Taichi, The worst user, Tirithel, UA31, Vitamine, Waeswaes, Waka Waka,Walter closser, Willtron, Zenko corp, conversion script, Ángel Luis Alfaro, 244 ediciones anónimas

Intérprete (informática)  Fuente: http://es.wikipedia.org/w/index.php?oldid=64407395  Contribuyentes: Alexrdp, BetoCG, Diegusjaimes, Digigalos, Dodo, Edgar, Ejmeza, Elabra sanchez,Fadesga, Fanattiq, Fsd141, GermanX, Humberto, Jamuki, Javierito92, Jesuja, Kaka666, Matdrodes, Platonides, Pólux, Raulshc, RoyFocker, Ruben.mg, Savh, Shooke, Sms, Taichi, conversionscript, 51 ediciones anónimas

Lenguaje de máquina  Fuente: http://es.wikipedia.org/w/index.php?oldid=66006258  Contribuyentes: Biasoli, Cronos x, Damifb, Diegusjaimes, Digigalos, Edgar, Elabra sanchez, Elías, Gacq,GermanX, Gusgus, Hahc21, Javier Carro, Jkbw, Lobo azul, Locovich, LordT, Mac, MaeseLeon, MarcoAurelio, MartinDM, Matdrodes, Moiwiki, Moriel, Nicop, Nikai, Pit, Rafa3040, Rbo159,Ricardogpn, RoyFocker, Sanbec, Sauron, Shooke, SuperBraulio13, Superzerocool, Tei, Tirithel, Triku, conversion script, 78 ediciones anónimas

Depuración de programas  Fuente: http://es.wikipedia.org/w/index.php?oldid=64532801  Contribuyentes: ARHEKI, Alejandrocaro35, Biasoli, Diegusjaimes, Djblack!, Ejrrjs, Erick Capslock,Facucario, GermanX, Gmarinp, Guirrohl, J.M.Domingo, Jkbw, Kristobal, Lexinerus, OMenda, Pedromanchon, Rocafort8, Rsg, Sms, Waeswaes, 18 ediciones anónimas

Java (lenguaje de programación)  Fuente: http://es.wikipedia.org/w/index.php?oldid=66445023  Contribuyentes: A. B. 10, ARHEKI, Aalku, Abgenis, Abrego, Adrruiz, Adryitan,Alejandrosilvestri, Alex Buzeta, AlfredoMorales, Aliamondano, Almario 7, Alqadim, Amadís, Amgomude, Andreasmperu, Angel GN, Angus, Argentumm, Ascánder, Aviguille, Axxgreazz,Baiji, Balderai, Batman325, Belb, Benek, Bernard, Bettinaberries, BuenaGente, Cabanyas, Camilo, Casidiablo, Ceballwiki, Centeno, Chiro79, ColdWind, Comae, Cousteau, Cristian orioles,Cristianrock2, Ctrl Z, Cucaracha, CésarGuti, DJ Nietzsche, DMG, Delphidius, Dem, Denis32crack, Diegatxo, Diego.souto, DiegoBM, Diegusjaimes, Dlorah, Dodo, Doubledragon, Dr. Ricardo,Dusan, Ecemaml, Edtruji, Elproferoman, Emijrp, Er Komandante, Ermey, Especiales, Especiall, FAR, Farisori, Federicotg, Fernandopcg, Fev, Fevero, Flashlack, FrancoGG, Franxiscokafran,Frurgr, Furti, Futbolero, GermanX, Greek, Guigar, Hades87, Helmy oved, Hiperfelix, Hispa, HodracirK, Horazzio, Hugg, Humbefa, Humberto, Héctor Arnau Aparicio, Icvav, Ignacio Icke,Ihavenomouth, Infosalle2011, Innv, Isha, Ivan rome, JMPerez, Jacobofandebillgates, Jarisleif, Jarke, Javierito92, Javierrami, Jesuja, Jkbw, JoaquinFerrero, JorSol, JorgeGG, Jorgechp, Jorgeeie,Joseagrc, Josemiguel93, Jstitch, Juan Mayordomo, Juancvasconez, Jugones55, Julioserrano, Jvlivs, Jynus, Kenshin 85, Kizar, Koko10ar, Kraft, Kroji, Laura Fiorucci, Leonpolanco, Lic. Armando,Linfocito B, Ljfeliu, Llopis73, Locos epraix, Locovich, Lourdes Cardenal, Lucien leGrey, Luigi1993ify, Luis.bernal, Magister Mathematicae, Malfer, ManuelGR, Mariano.iglesias, Marsal20,Matdrodes, MatiasBellone, Mdiagom, Moonmaryhawke, Morbazan, Moriel, Mpadilla, Muro de Aguas, Máximo de Montemar, NaSz, Netito777, Nicolapedia, NicolasAlejandro, Niqueco,Numbo3, Obelix83, Oblongo, Ocaso, Orgullomoore, Ortisa, Pablopv98, Paintman, Patrias, Pirenne, Piztu, Platonides, ProfesorFalken, Prugo, Pybalo, Pólux, Qwertyytrewqqwerty, Racso,Rafa3040, Rafael Morais, Rbuj, Ricardo Moctezuma, Roberpl, Roberto Blandino C, Rodrigo.paillan, Rojoblandino, RoyFocker, Rsg, Sabbut, Saloca, Sanbec, Sanderaco, Sanmiladsl, Sauron,Savh, Sbassi, Sebrev, Sergio Yinyang, SergioVares, Shooke, Sirpuppet, Sixtop, Snakefang, Solde9, Speedplus, Stoleman, Sucoplus, SuperBraulio13, Superzerocool, TToniii, Tano4595, Thr41N,Toad32767, Tomatejc, Torturo, Tuxiano felipe, Txo, UA31, Uncorreotemporal, Unf, Vale Espin, Vatelys, Vigilante Satan, Vitamine, Waeswaes, Whibla, Wpersei, Writkas, Xerox 5B, Yakoo,Yrithinnd, Zeos, Zorosandro, 695 ediciones anónimas

Page 65: Lenguaje de Programación. Java

Fuentes de imagen, Licencias y contribuyentes 63

Fuentes de imagen, Licencias y contribuyentesArchivo:Commons-logo.svg  Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:Commons-logo.svg  Licencia: logo  Contribuyentes: SVG version was created by User:Grunt andcleaned up by 3247, based on the earlier PNG version, created by Reidab.Archivo:Wiktionary-logo-es.png  Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:Wiktionary-logo-es.png  Licencia: logo  Contribuyentes: es:Usuario:PybaloArchivo:Spanish Wikiquote.SVG  Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:Spanish_Wikiquote.SVG  Licencia: logo  Contribuyentes: James.mcd.nzArchivo:Wikibooks-logo.svg  Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:Wikibooks-logo.svg  Licencia: logo  Contribuyentes: User:Bastique, User:Ramac et al.Archivo:Leibniz binary system 1703.png  Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:Leibniz_binary_system_1703.png  Licencia: Public Domain  Contribuyentes:AndreasPraefcke, Juiced lemon, Sopoforic, U3001, 1 ediciones anónimasArchivo:Conversion.JPG  Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:Conversion.JPG  Licencia: Public Domain  Contribuyentes: ZerstreutArchivo:PET-basic.png  Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:PET-basic.png  Licencia: Public Domain  Contribuyentes: RafaxArchivo:FortranCardPROJ039.agr.jpg  Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:FortranCardPROJ039.agr.jpg  Licencia: Creative Commons Attribution-Sharealike 2.5 Contribuyentes: Arnold ReinholdArchivo:Python add5 syntax.svg  Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:Python_add5_syntax.svg  Licencia: Copyrighted free use  Contribuyentes: Xander89Archivo:CodeCmmt002.svg  Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:CodeCmmt002.svg  Licencia: GNU Free Documentation License  Contribuyentes: Original uploader wasDreftymac at en.wikipediaArchivo:Programming language textbooks.jpg  Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:Programming_language_textbooks.jpg  Licencia: Public Domain  Contribuyentes:User:K.leeArchivo:CompilationScheme-Spanish.png  Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:CompilationScheme-Spanish.png  Licencia: GNU Free Documentation License Contribuyentes: Bayo, Gengiskanhg, LoStrangolatore, Nuno TavaresArchivo:Codigo de maquina.png  Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:Codigo_de_maquina.png  Licencia: Public Domain  Contribuyentes: GermanArchivo:Computer abstraction layers-es.svg  Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:Computer_abstraction_layers-es.svg  Licencia: Creative CommonsAttribution-ShareAlike 3.0 Unported  Contribuyentes: LordT, Mdd, WikipediaMasterArchivo:H96566k.jpg  Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:H96566k.jpg  Licencia: Public Domain  Contribuyentes: AVRS, Balcer, Circeus, Colfer2, Cwbm (commons),Dcoetzee, Editor at Large, Jatkins, Markhurd, Mr.freedoom, Para, Roo72, Waldir, 6 ediciones anónimas

Page 66: Lenguaje de Programación. Java

Licencia 64

LicenciaCreative Commons Attribution-Share Alike 3.0 Unported//creativecommons.org/licenses/by-sa/3.0/