¿Qué es Java? ¿Para qué sirve Java?

Según la definición de Wikipedia, Java es:

Java es un lenguaje de programación orientado a objetos y basado en clases que está diseñado para tener la menor cantidad posible de dependencias de implementación. Es un lenguaje de programación de propósito general destinado a permitir que los desarrolladores de aplicaciones escriban una vez, se ejecuten en cualquier lugar (WORA, write once, run anywhere), lo que significa que el código Java compilado se puede ejecutar en todas las plataformas que admiten Java sin necesidad de volver a compilarlo. Las aplicaciones Java normalmente se compilan en un código de bytes que se puede ejecutar en cualquier máquina virtual Java (JVM) independientemente de la arquitectura de la computadora subyacente. La sintaxis de Java es similar a C y C ++, pero tiene menos funciones de bajo nivel que cualquiera de ellos.

Fuente: https://en.wikipedia.org/wiki/Java_(programming_language)

Teniendo en cuenta ello, podremos reducir un poco la definición y tenemos la siguiente:

Java es un lenguaje de programación de alto nivel, orientado a objetos y multiparadigma, de propósito general, fuertemente tipado y con una sintaxis similar a C++,además de compilado e ejecutado mediante su máquina virtual (Java Virtual Machine -JVM-) que le permite escribirse una vez y ejecutarse en cualquier computador que tenga dicha máquina virtual independientemente de su arquitectura.

¿Aún quedan dudas?, vamos a descomponer esta definición tanto como sea posible, empecemos:

1. "... es un lenguaje de programación ...":

Un lenguaje de programación se define formalmente como un lenguaje artificial que permite la comunicación entre un humano (el programador) con el computador, con el fin de que el primero indique, mediante instrucciones o secuencias en forma de algoritmos, el comportamiento que el computador debe seguir con un determinado propósito propuesto por el programador.

Existen múltiples lenguajes de programación, desde sencillos de aprender como python o java, hasta esotéricos y muy difíciles de aprender como brainfuck (ver más), de todas formas, ningún lenguaje u herramienta es mejor que otra, siempre tienen pros y contra, como se menciona siempre en software: "no hay balas de plata".

2. "... de alto nivel...":

respecto al nivel, se refiere al nivel de acceso al hardware del computador, existen 3 niveles bien definidos:

  • Bajo Nivel: estos pueden acceder directamente al procesador del computador, existen 2 tipos:
    • Lenguaje Máquina: códigos de ceros y unos que se ejecutan directamente en el procesador.
    • Lenguaje ensamblador: es un derivado al lenguaje máquina, pero se utilizan letras y números para realizar sus instrucciones, se requiere un compilador específico para cada procesador.
  • Mediano Nivel: tienen mayor abstracción y mejor comprensión al lenguaje dada su sintaxis, pero aún es posible acceder a la memoria y hardware del computador, se requiere un compilador específico por cada Sistema Operativo que lo transforma en lenguaje máquina, ejemplo de ellos es el lenguaje C.
  • Alto Nivel: posee mayor abstracción y mejor comprensión que los lenguajes de medio nivel, no se puede acceder directamente a memoria y recursos del computador, para ello se requiere de un compilador o un interprete intermediario, por lo cual se pueden usar esos lenguajes independientemente del computador, se puede migrar el código de un sistema a otro y ser ejecutado sin problemas (salvo excepciones de accesos a recursos específicos de un sistema operativo específico). Ejemplo de ellos: C++, Java, Python, Ruby, PHP, etc.

3. "... orientado a objetos y multiparadigma...":

Existen múltiples paradigmas de programación, los más comunes son los orientados a objetos, estructurados, orientado a aspectos, etc; Java al tener un tipado fuerte, este tiene una predisposición a ser escrita con el paradigma de orientado a objetos, mas, no todos los paradigmas son excluyentes, por lo que se puede decir que Java puede aceptar más de un paradigma.

Java con programación orientada a aspectos: AspectJ o Spring AOP.

Java con programación funcional, desde la versión 8 con el cálculo de lambas

Java con programación reactiva: RxJava o Spring Reactor.

entre otros.

4. "... de propósito general...":

 una forma de clasificar los lenguajes de programación es de acuerdo a su propósito, existen 2 grandes grupos diferenciados:

de propósito general: son lenguajes de programación que son capaces de resolver cualquier problema computable, desde un sencillo "hello world", pasando por una web, hasta un sistema complejo que incluye machine learning. Entre estos lenguajes tenemos: java, python, scala, C++, C#, kotlin, entre otros.

de propósito específico: son aquellos lenguajes de programación que han sido creados y optimizados para la una función específica, por ejemplo, alguna operación estadística (por ejemplo, R), procesamiento matemático (Matlab), control de máquinas (lenguaje PLC).

Con ello, podemos acotar que podemos usar Java en cualquier tarea computable, tales como:

  • Desarrollo de escritorio: uso del core de java para operación en consola, sistemas de escritorio usando el framework swing o algo más sofisticado como JavaFX.
  • Desarrollo web: punto conocido, usando el estándar como JavaEE (hoy Jakarta), entre otros conocidos frameworks como Spring, Structs, Play, entre otros.
  • Machine Learning: existen múltiples librerías y sistemas desarrollados en java con este fin, tales como Weka o RapidMiner, mayor información, ver aquí.
  • Microcontroladores: Java es usado para microcontroladores conectados a herramientas relativamente modernas como Raspberry Pi y Arduino.
  • Entre otros.

Cabe resaltar que el hecho que sea de propósito general, no garantiza la facilidad de su uso en toda tarea computable, esto lo determinan los usuarios (programadores y personas que requieren de la programación para sus actividades), aquí se cita de nuevo la frase "no hay balas de plata".

5. "...fuertemente tipado...":

El tipado fuerte se refiere a la forma en cómo se manejan las variables (o atributos) y funciones (o métodos) en el lenguaje, cuando se define una variable de algún tipo, solo puede usarse con ese fin, es decir, si se definió una variable como tipo entero, no se puede usar como una cadena de texto sin una previa conversión. 

Ejemplos:

String myVariable = "Hello world!";
//not compiled
Integer myVariable = 1;
view raw java hosted with ❤ by GitHub

6. "... de sintaxis similar a c++...": 

La sintaxis de java es muy similar a la de C++, a excepción que C++ permite la programación estructurada en cambio Java es sólo orientado a objetos, pero comparten el paradigma imperativo y estructurado, lo que hace que su sintaxis sea muy similar, además como dato curioso, java está basado en C++

C++:

#include <iostream>
using namespace std;
int main()
{ // main() is where program execution begins
int a = 5, b = 10, sum;
sum = a + b;
/* This will add the values of a and b
and will display the output stored in sum */
cout << sum;
return 0;
}
view raw cpp hosted with ❤ by GitHub

Java:

public class Example {
public static void main(String[] args)
{
int a = 5, b = 10, sum;
sum = a + b;
System.out.println(sum);
}
}
view raw java hosted with ❤ by GitHub

7. "...compilado e ejecutado mediante su máquina virtual...":

Siempre se ha preguntado si Java es compilado o interpretado y siempre se ha considerado como un lenguaje compilado, pero realmente Java toma lo mejor de ambos bandos, es decir, cuando el programador realiza su código, genera documentos cuya extensión es .java, al compilarlo, lo transforma en un código intermedio (Bytecodes) y se generan archivos .class, finalmente, cuando se ejecuta el programa, la máquina virtual interpreta esos lenguajes intermedios para transformarlos en código máquina para su ejecución en el computador.

Programación Java: Introducción al lenguaje Java
[Imagen tomada de internet]


Claro está que la máquina virtual (JVM) se encarga del ciclo de vida del código máquina, para optimizar (según criterio de la JVM, aunque es posible forzar una a criterio del programador) la memoria y los recursos que se requieren para el funcionamiento del programa.

Este pequeño gráfico explica mejor lo que usa la JVM para la ejecución de los archivos .class

Qué es la máquina virtual de Java o Java Virtual Machine? | campusMVP.es
Imagen tomada de internet

Esta idea hace que exista una máquina virtual (JVM) que lee nuestro código y lo transforma en un código interpretado (Bytecodes), permite que en una parte de ello exista un interprete que se encargue se paso a código máquina y posterior ejecución. Esto último ofrece una ventaja que hablaremos a continuación.

8. "...que le permite escribirse una vez y ejecutarse en cualquier computador que tenga dicha máquina virtual independientemente de su arquitectura."

Como se mencionó anteriormente, al ejecutarse mediante una máquina virtual (JVM) este código interpretado (bytecodes) pueden ser utilizados por un interprete, este interprete es llamado Java Runtime Enviroment (JRE) que se encarga de interpretar los bytecodes, transformarlos a código máquina y ejecutarlos, esta función puede ser ejecutada en cualquier sistema operativo o computador, dado que solo depende exclusivamente de la JRE y no de alguna otra dependencia (o eso es lo que asegura Java), e incluso, se puede instalar solo el interprete (JRE) en cualquier sistema operativo y podrá ejecutar sin problemas, esta filosofía es llamada WORA (write once, run everywhere).

Imagen tomada de internet

Ahora, si bien es cierto que Java tiene esa filosofía, todo depende del programador al realizar un programa si lo hace muy dependiente al sistema operativo (utilizar recursos del sistema por ejemplo) lo cual hará que se ejecute el programa en otro sistema operativo, pero ocurrirán errores al no encontrarse dichos recursos del sistema.

Conclusión:

Finalmente, Java es un lenguaje muy completo, que puede utilizarse para cualquier problema computacional o requerimiento de automatización y da la flexibilidad de que el programa sea agnóstico al sistema operativo o hardware, ya que solo se necesita que el sistema operativo tenga su interprete instalado, y nuestros programas pueden ser ejecutados, además que el interprete al ser una máquina virtual, tiene su propia gestión de recursos y memoria muy similar a un sistema operativo, lo cual nos quitará el problema de eliminar los recursos que ya no se necesitan en el ciclo de vida de la aplicación que se encuentra ejecutando.

Comentarios