LENGUAJES DE POGRAMACION
JAVA PHP5
Rendimiento
El rendimiento de una aplicación está determinado por multitud de factores, por lo que no es fácil hacer una comparación que resulte totalmente objetiva. En tiempo de ejecución, el rendimiento de una aplicación Java depende más de la eficiencia del compilador, o la JVM, que de las propiedades intrínsecas del lenguaje. El bytecode de Java puede ser interpretado en tiempo de ejecución por la máquina virtual, o bien compilado al cargarse el programa, o durante la propia ejecución, para generar código nativo que se ejecuta directamente sobre el hardware. Si es interpretado, será más lento que usando el código máquina intrínseco de la plataforma destino. Si es compilado, durante la carga inicial o la ejecución, la penalización está en el tiempo necesario para llevar a cabo la compilació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 de funciones virtuales.
El uso de un recolector de basura para eliminar de forma automática aquellos objetos no requeridos, añade una sobrecarga que puede afectar al rendimiento, o ser apenas apreciable, dependiendo de la tecnología del recolector y de la aplicación en concreto. Las JVM modernas usan recolectores de basura que gracias a rápidos algoritmos de manejo 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 inconveniente principalmente 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, muchos compiladores JIT realizan esta optimización durante la carga de la aplicación y pueden aprovechar información del entorno en tiempo de ejecución para llevar a cabo transformaciones eficientes durante la propia ejecución de la aplicación. Esta recompilación dinámica, como la que proporciona la máquina virtual HotSpot de Sun, puede llegar a mejorar el resultado de compiladores estáticos tradicionales, gracias a los datos que sólo están disponibles durante el tiempo de ejecución.
Java fue diseñado para ofrecer seguridad y portabilidad, y no ofrece acceso directo al hardware de la arquitectura ni al espacio de direcciones. Java no soporta expansión de código ensamblador, aunque las aplicaciones pueden acceder a características de bajo nivel usando bibliotecas nativas (JNI, Java Native Interfaces).
JAVA PHP5
Java (lenguaje de
programación)
Java es
un lenguaje de programación orientado a objetos, desarrollado por Sun
Microsystems a principios de los años 90. El lenguaje en sí mismo toma mucha de
su sintaxis de C y C++, pero tiene un
modelo de objetos más simple y elimina herramientas de bajo nivel, que suelen
inducir a muchos errores, como la manipulación directa de punteros o memoria.
La memoria es gestionada mediante un recolector de basura.
Las aplicaciones Java están
típicamente compiladas en un bytecode, aunque la compilación en código
máquina nativo también es posible. En el tiempo de ejecución, el bytecode
es normalmente interpretado o compilado a código nativo para la ejecución,
aunque la ejecución directa por hardware del bytecode por un procesador
Java también es posible.
La implementación original y
de referencia del compilador, la máquina virtual y las bibliotecas de clases de
Java fueron desarrollados por Sun Microsystems en 1995. Desde entonces, Sun ha
controlado las especificaciones, el desarrollo y evolución del lenguaje a
través del Java Community Process, si bien otros han desarrollado también
implementaciones alternativas de estas tecnologías de Sun, algunas incluso bajo
licencias de software libre.
Entre diciembre de 2006 y
mayo de 2007, Sun Microsystems liberó la mayor parte de sus tecnologías Java
bajo la licencia GNU GPL, de acuerdo con las especificaciones del Java
Community Process, de tal forma que prácticamente todo el Java de Sun es ahora
software libre (aunque la biblioteca de clases de Sun que se requiere para
ejecutar los programas Java aún no lo es).
Filosofía
El lenguaje Java se creó con
cinco objetivos principales:
- Debería usar el paradigma de la programación orientada a objetos.
- Debería permitir la ejecución de un mismo programa en múltiples sistemas operativos.
- Debería incluir por defecto soporte para trabajo en red.
- Debería diseñarse para ejecutar código en sistemas remotos de forma segura.
- 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 a extensiones como CORBA (Common Object Request Broker Architecture),
Internet Communications Engine o OSGi respectivamente.
Orientado a objetos
La primera característica,
orientado a objetos (“OO”), se refiere a un método de programación y al diseño
del lenguaje. Aunque hay muchas interpretaciones para OO, una primera idea es
diseñar el software de forma que los distintos tipos de datos que usen estén
unidos a sus operaciones. Así, los datos y el código (funciones o métodos) se
combinan 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, o viceversa. Esta separación en
objetos coherentes e independientes ofrece una base más estable para el diseño
de un sistema software. El objetivo es hacer que grandes proyectos sean fáciles
de gestionar y manejar, mejorando como consecuencia su calidad y reduciendo el
número de proyectos fallidos. Otra de las grandes promesas de la programación
orientada a objetos es la creación de entidades más genéricas (objetos) que
permitan la reutilización del 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, sobre todo 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 ya existentes 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:
el diseño de objetos realmente genéricos es pobremente comprendido, y falta una
metodología para la amplia comunicación de oportunidades de reutilización.
Algunas comunidades de “código abierto” (open source) quieren ayudar en este
problema dando medios a los desarrolladores para diseminar la información sobre
el uso y versatilidad de objetos reutilizables y bibliotecas de objetos.
Programación
Expresiones
Las expresiones son un
conjunto de elementos o tokens junto con literales que son evaluados para
devolver un resultado. Los tokens son elemento más pequeño de un programa que
es significativo, e interpretado o entendido por el 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 pueda entenderlos. En java los
identificadores pueden diferenciar entre mayúsculas o minúsculas por ser case
sensitive, por lo que la variable cuyo nombre sea “Mivariable”, no es igual a
“mivarialble”, ya que java identifica estas como variables diferentes por el case
sensitive, también se puede utilizar números, o el signo “_” para asignar un
identificador.
Palabras claves: Son
los identificadores reservados por java para cumplir con un objetivo específico
en el código y el compilador, se usan de forma limitada y en casos específicos.
Las palabras claves que usa java son las siguientes:
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 la versión de java, pero
se pretenden integrar en las siguientes versiones de java. Las palabras como
true, false o null también son palabras claves pero son palabras reservadas en
java por lo cual no pueden ser utilizadas como un identificador.
Literales y constantes:Los
literales son sintaxis para asignar valores a una variable, es decir el valor
que puede tomar una variable, también es un valor constante que puede ser de
tipo numérico. Las constantes son variables que tienen un valor fijo y no puede
ser modificado en el trascurso de la ejecución del código, estas se declaran
por medio de los modificadores 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 o constante. 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, los separadores que admite java son: { },:;
También el compilador de java identifica y elimina los
comentarios, retornos de carros espacios vacíos y de tabulació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 son utilizadas para
realizar cálculos, para asignar valores a variables, o para controlar la
ejecución del flujo del programa.
Operadores
Los operadores son aquellos que tras realizar una
operación devuelven un resultado, estos se puede caracterizar por el 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 un operando para
devolver un valor, mientras que los binarios necesitan de dos o más operandos.
Operadores unarios.
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
|
Precedencia de operadores
Los operadores son una parte principal en las
expresiones, el tipo y forma de uso es fundamental a la hora de programas, pero
para su uso se tiene que tener en cuenta una serie de normas, como lo son la
precedencia de los operadores.
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
|
= += -=
*= /= %= &= ^= |= <<= >>= >>>=
|
Sentencias
Las sentencias son una representación de una secuencia de
acciones que se realizan en java, la clave fundamental de las sentencias es su
punto final que indica que ha finalizado la sentencia y puede continuar con la
siguiente, el indicador utilizado es el signo de punto y coma (; ). Contamos en
java con sentencias que pueden ir desde sentencias de asignación, de bucles,
condicionales, y de salto. Las sentencias se conforman comúnmente por una
instancia, y un operador, un ejemplo es la sentencia de asignación que se conforma
por una instancia de una variable, el signo de asignació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 sentencias condicionales son
las que expresan una condición para definir el flujo de ejecución del programa,
entre ellas tenemos if-else y switch. Las sentencias de bucles se encargar de
realizar una acción cierta cantidad de tiempo dado, o hasta que se cumpla con
una condición, entre ellas tenemos el while, do-while, y for. Las sentencias de
salto llevan al compilador 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 cantidad menor de bit al anterior
este tendrá perdida de información, un ejemplo de tipado puede ser un número
long que se desea convertir a int, el compilador eliminara los primeros 32bit
del long para ajustarlo al int ya que el int es de 32bit y 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, la conversión se realiza automáticamente llamada conversión
implícita, pero si se realiza de un tipo de datos con mayor bit a menor bit se
tiene que realizar una conversión explicita, la cual se realiza con un casting,
al usar este método se obliga a realizar la conversión por lo cual puede haber
perdida de datos en la conversión. Para realizar una conversión explicita se
tiene que poner el tipo de dato que se desea realizar la conversión entre
paréntesis, luego el valor 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;
byte numero2;
numero2 = (byte) numero1;
Un ejemplo de una conversión de tipo implícita puede ser:
int numero1 = 32;
long numero2;
numero2 = numero1;
long numero2;
numero2 = numero1;
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
|
El rendimiento de una aplicación está determinado por multitud de factores, por lo que no es fácil hacer una comparación que resulte totalmente objetiva. En tiempo de ejecución, el rendimiento de una aplicación Java depende más de la eficiencia del compilador, o la JVM, que de las propiedades intrínsecas del lenguaje. El bytecode de Java puede ser interpretado en tiempo de ejecución por la máquina virtual, o bien compilado al cargarse el programa, o durante la propia ejecución, para generar código nativo que se ejecuta directamente sobre el hardware. Si es interpretado, será más lento que usando el código máquina intrínseco de la plataforma destino. Si es compilado, durante la carga inicial o la ejecución, la penalización está en el tiempo necesario para llevar a cabo la compilació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 de funciones virtuales.
El uso de un recolector de basura para eliminar de forma automática aquellos objetos no requeridos, añade una sobrecarga que puede afectar al rendimiento, o ser apenas apreciable, dependiendo de la tecnología del recolector y de la aplicación en concreto. Las JVM modernas usan recolectores de basura que gracias a rápidos algoritmos de manejo 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 inconveniente principalmente 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, muchos compiladores JIT realizan esta optimización durante la carga de la aplicación y pueden aprovechar información del entorno en tiempo de ejecución para llevar a cabo transformaciones eficientes durante la propia ejecución de la aplicación. Esta recompilación dinámica, como la que proporciona la máquina virtual HotSpot de Sun, puede llegar a mejorar el resultado de compiladores estáticos tradicionales, gracias a los datos que sólo están disponibles durante el tiempo de ejecución.
Java fue diseñado para ofrecer seguridad y portabilidad, y no ofrece acceso directo al hardware de la arquitectura ni al espacio de direcciones. Java no soporta expansión de código ensamblador, aunque las aplicaciones pueden acceder a características de bajo nivel usando bibliotecas nativas (JNI, Java Native Interfaces).
No hay comentarios:
Publicar un comentario