Qué es Java
Prohibido
Agujeros
Líneas futuras
Cómo firmar applets
Consejos
Recursos
|
Características del lenguaje/compilador
Java fue diseñado con las siguientes ideas en mente:
- Evitar errores de memoria
- Imposibilitar acceso al SO
- Evitar que caiga la máquina sobre la que corre
Con el fin de llevar a la práctica estos objetivos, se implementaron las siguientes
características:
- Ausencia de punteros
- Protege frente a imitación de objetos, violación de encapsulación, acceso a áreas
protegidas de memoria, ya que el programador no podrá referenciar posiciones de memoria
específicas no reservadas, a diferencia de lo que se puede hacer en C y C++.
- Gestión de memoria
- Ya no se puede gestionar la memoria de forma tan directa como en C, (no hay malloc).
En cambio, se instancian objetos, no se reserva memoria directamente (new siempre
devuelve un handler), minimizando así la interacción del programador con la memoria y
con el SO.
- Recogida de basura
- El programador ya no libera la memoria manualmente mediante free (fuente muy
común de errores en C y C++, que posía llegar a producir el agotamiento de la memoria
del sistema). El recogedor de basura de Java se encarga de reclamar la memoria usada por
un objeto una vez que éste ya no es accesible o desaparece. Así, al ceder parte de la
gestión de memoria a Java en vez de al programador, se evitan las grietas de memoria (no
reclamar espacio que ya no es usado más) y los punteros huérfanos (liberar espacio
válido antes de tiempo).
- Arrays con comprobación de límites
- En Java los arrays son objetos, lo cual les confiere ciertas funciones muy útiles, como
la comprobación de límites. Para cada subíndice, Java comprueba si se encuentra en el
rango definido según el número de elementos del array, previniendo así que se
referencien elementos fuera de límite
- Referencias a objetos fuertemente tipadas
- Impide conversiones de tipo y castings para evitar accesos fuera de límites de memoria
(resolución en compilación)
- Casting seguro
- Sólo se permite casting entre ciertas primitivas de lenguaje (ints, longs) y entre
objetos de la misma rama del árbol de herencia (uno desciende del otro y no al revés),
en tiempo de ejecución
- Control de métodos y variables de clases
- Las variables y los métodos declarados privados sólo son accesibles por la clase o
subclases herederas de ella y los declarados como protegidos, sólo por la clase
- Métodos y clases final
- Las clases y los métodos (e incluso los datos miembro) declarados como final
no pueden ser modificados o sobrescritos. Una clase declarada final no puede ser ni
siquiera extendida.
Pero, ¿qué ocurriría si modifico un compilador de C para producir códigos de byte
de Java, pasando por alto todas las protecciones suministradas por el lenguaje y el
compilador de Java que acabamos de describir?
Con el fin de evitar esa forma de ataque, se construyó la segunda línea de defensa,
el verificador de código de bytes.
Copyright © 1997-1998 Gonzalo Álvarez Marañón, CSIC. Todos los derechos
reservados.
Criptonomicón es un servicio ofrecido libremente desde el
Instituto de Física Aplicada del CSIC. Para información sobre privacidad, por favor
consulte la declaración de política sobre privacidad.
Para sugerencias, comentarios o quejas, acuda al libro de
visitas. Para contribuir al Criptonomicón, lea la página de contribuciones. |