/*
* Este es un comentario utilizando
* varias lineas
*/
class HelloWorldApp {
public static void main (String[] args) {
System.out.println ("Hello World!"); // Comment
}
}
Java es otro lenguaje popular que podemos considerar compilado, si
bien, no genera código nativo. En su lugar genera los denominados
bytecodes
, algo así como un código máquina para una máquina
inventada, la auto-denominada Máquina Virtual Java, más
conocida por sus siglas en inglés JVM.
SABIAS QUE…
El concepto de bytecode no es exclusivo de Java. Perl, Python e incluso TCL pueden ser compilados en bytescode, si bien Java fue el primer lenguaje/entorno en hacer esto explícito, especialmente debido a que separaba claramente el proceso de generación del bytecode y su ejecución por parte de la máquina virtual. Smalltalk ya soportaba este concepto, e incluso el BASIC de mi viejo MSX, tokenizaba los programas para almacenarnos en memoria de una forma más eficiente… algo que se puede ver como una versión primitiva y rudimentaria de lo que hoy en día conocemos como bytecodes.
Los ficheros con los programas Java (ćodigo fuente) utilizan la
extensión .java
. El bytecode generado por el compilador
utiliza la extension .class
. Proyectos más complejos que
involucran muchas clases, agrupan varios ficheros .class
en
un fichero .jar
que no es más que un fichero ZIP con una
cierta estructura.
Java puede ser visto como una versión simplificada de C++ con una
orientación a objetos más formal y también mucho más sencilla. La
sintaxis es prácticamente igual. Usaremos ;
como terminador
de instrucciones que podremos agrupar utilizando las llaves
{}
. Los comentarios son idénticos a los utilizados por
C++.
Como decíamos, Java proporciona una orientación a objetos mucho más simple (en el sentido que permite hacer menos cosas), pero más formal. Esa es la razón por la cual, incluso para nuestro sencillo programa Hola Mundo, debemos definir una clase y métodos para poder imprimir nuestro mensaje.
El mensaje se imprime con System.out.println
que es una
invocación a un método de un objeto estático en la clase
System
. Toma ya… Pero bueno, es más o menos lo mismo que el
cout
de C++, pero utilizando un método en lugar de un
operador. En este libro no vamos a tocar el tema de la programación
orientada o objetos más allá de los estrictamente necesario, así que,
por el momento, quedaros con que para escribir un programa en Java
tenéis que poner todo eso que aparece en el código de ejemplo.
SABÍAS QUE..
Hasta el momento, los lenguajes que hemos visto, o bien añaden o no añaden el retorno de carro. Veremos en el siguiente capítulo como controlar esto, normalmente llamando a una función diferente. Respecto de este particular tema, suele haber dos formas de nombrar a estas funciones. O bien, se utiliza una función de más bajo nivel que permite controlar si queremos usar el retorno de carro, o se usa una familia de funciones que añaden el prefijo
ln
a la función de imprimir.ln
viene deline
e indica que queremos utilizar el retorno de carro. Veremos esto en varios lenguajes. Para Java,println
imprime la cadena con un retorno de carro.
Un cosa más. Java obliga a que el nombre del fichero que contiene las fuentes y la clase de alto nivel declarada en él coincidan…. Que lo sepáis.
Para compilar y ejecutar nuestro programa Java, ejecutaremos:
$ javac HelloWorld.java $ java ./HelloWorld
Al ejecutar el programa con java
, no es necesario
indicar la extensión .class
. Si queremos generar un fichero
.jar
y luego ejecutarlo:
$ javac HelloWorldApp.java $ jar cvf HelloJava.jar HelloWorldApp.class $ java -cp HelloJava.jar HelloWorldApp
Donde HelloWorldApp
es el nombre de nuestra clase
principal. Podemos evitar esto, añadiendo un manifiesto a nuestro
fichero .jar
.
$ javac HelloWorldApp.java $ mkdir META-INF $ echo "Main-Class: HelloWorldApp" >> manifest.txt $ jar -cvmf manifest.txt hello.jar HelloWorldApp.class $ java -jar hello.jar
binfmt_misc
Al igual que sucede con los fichero
pyc
de Pyhton, los ficheros.jar
(una vez que les hemos dado permiso de ejecución) se pueden ejecutar directamente desde la línea de comandos sibinfmt_misc
está configurado en nuestro sistema.
Java fue originariamente desarrollado por James Gosling en Sun Microsystems (adquirida por Oracle en la actualidad) y liberado en 1995. Gossling junto con Mike Shreridan y Patrick Naugthon iniciaron el diseño del lenguaje en 1991 si bien, como hemos dicho, hasta 1995 no se libero el proyecto (una versión alpha en realidad). El proyecto se llamó inicialmente Oak, por el roble que se veía desde la oficina de Gossling. Luego se re-nombró como Green, para finalmente llamarse Java por el café de Java (Indonesia).
Si bien, java no fué, ni mucho menos, el primer entorno en utilizar bytecodes y ofrecer una solución con un alto grado de portabilidad, esa fue la principal novedad que se resalto cuando se lanzó. Diseñado inicialmente para el desarrollo de aplicaciones interactivas para televisión digital, se popularizo con un uso similar, pero en páginas web con los denominados Applets Java.
Su uso en la web decayó con el advenimiento de Flash (el cual también ha desaparecido, afortunadamente, gracias a HTML5 y tecnologías relacionadas), Java sigue siendo el lenguaje de programación original de los dispositivos Android, tanto como lenguaje como, como máquina virtual utilizada por otros lenguajes. Java también se sigue utilizando en el entorno empresarial.
SABIAS QUE
La máquina virtual Java utilizada originariamente por los dispositivos Android se conoce como Dalvik Virtual Machine, y no utiliza ficheros
.class
sino que usa un formato propietario con extensión.dex
(Dalvik Executable). La máquina virtual Dalvik fue sustituida años mas tarde por ART (Android Runtime) que añade nuevas funcionalidades y es compatible con los fichero.dex
originales. ART fue introducido en Android 4.4
En distribuciones basadas en Debian podéis instalar el SDK de Java usando el siguiente comando:
apt install openjdk-17-jdk
Quizás cuando estés leyendo esto tengas que cambiar el
17
por otro número más alto.
Resumen
- Lenguaje compilado a bytecodes
- Extension:
java
- Terminador de líneas :
;
- Agrupa instrucciones con :
{...}
- Comentarios multilinea : Usando
/* .. */
- Comentarios misma línea:
//
- Delimitador de cadenas:
"cadena¨
- Puedes imprimir textos con
System.out.println
(Añade retorno de carro) - No soporta cadenas múltilínea nativamente
- No soporta
HERE-DOCS
- Punto de Entrada: Método
main
■