☕️ How Java works ?
Tags: java, backend, webdev, learning
Published: 2023-10-20 22:57:50

## Summary
   * [🇺🇸 English](#how-java-works)
   * [🇧🇷 Portuguese](#como-funciona-o-java)

## How Java works ? <a name="how-java-works"></a>

One of the main characteristics of Java is its ability to **write once, run anywhere**, therefore Java is a language with the concept of being cross-platform, this means that we can write code on a certain platform (MacOS for example), and we have the ability to use the same code on different platforms (Windows or Linux).

For example, we have a simple code written in Java and we use MacOS as the platform:

![ClassCode](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/suxnwqiicrqmcmy8jg8p.png)

Let's suppose we need to run this same code in a Windows or Linux environment, what should we do?

By default, our machine (Windows, Mac or Linux) cannot understand code written in Java, after writing our source code, we need to convert this code to a format that our machine needs to understand, and at that moment we need a little guy called **JavaC (Java Compiler)**.

## Java Compiler (JavaC)

JavaC will receive our source code and compile it to **ByteCode**, after compilation we still cannot use it directly on our platforms.

After compiling our source code to **ByteCode**, another little guy comes into action, called **JVM (Java Virtual Machine)**.

## Java Virtual Machine (JVM)

The **JVM (Java Virtual Machine)** is a virtual machine that interprets and executes our **ByteCode** generated by **JavaC** at run time, and one of the main characteristics of the **JVM** is the Its ability to guarantee the portability of our ByteCode, allowing the same ByteCode that was generated on MacOS to be executed on a Windows JVM or a Linux JVM.

## Compiled or Interpreted ?

So in the end, is Java a compiled or interpreted language? Java is a compiled and then interpreted language.

This occurs because our source code is first compiled by JavaC and generated the ByteCode, and then this same ByteCode will be interpreted by the JVM in a way that the platforms can execute.

1 - Source code compiled by JavaC and generated ByteCode.
2 - ByteCode is interpreted by the JVM and executed.

And now after understanding this entire concept above, how do we install the JVM on our machine?

Now we have **two options**, install the JRE or JDK.
## JRE

The Java Runtime Environment (JRE) is the execution environment for Java.

The JRE will provide the JVM, but it will only be what we need to run our application.

What will I have inside the JRE?

- JVM.
- Libraries to be able to run our application.
- Supports and resources needed to run our application.

## JDK

The Java Development Kit (JDK), as the acronym itself says, is the development kit for Java.

The JDK is a set of tools and utilities necessary for us to be able to develop our application, and it will also provide **everything that the JRE implements**, that is, when we install the JDK we also install the JRE, and also we have other utilities such as:

- JavaC (Java Compiler).
- Debugger.
- Utilities to assist us in our development.

With this we have an understanding of the concept of how Java is compiled and interpreted and its utilities.

---

## Como funciona o Java ? <a name="como-funciona-o-java"></a>

Uma das principais características do Java é a capacidade que ele tem de ser um **Write once, Run anywhere (Escreva uma vez, execute em qualquer lugar)**, então o Java é uma linguagem com conceito para ser multi-plataforma, isso significa que nós podemos escrever um código em uma determinada plataforma (MacOS por exemplo), e nós temos a capacidade de usar o mesmo código em diversas plataformas (Windows ou Linux). 

Por exemplo nós temos um código simples escrito em Java e utilizamos o MacOS como plataforma:

![ClassCode](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/suxnwqiicrqmcmy8jg8p.png)

Vamos supor que nós precisamos rodar esse mesmo código em um ambiente Windows ou Linux, o que devemos fazer ?

Por padrão a nossa maquina (Windows, Mac ou Linux) não consegue entender um código escrito em Java, após escrever o nosso código fonte, nós precisamos converter esse código para um formato que nossa máquina precisa entender, e nesse momento precisamos de um carinha chamado **JavaC (Java Compiler)**.

## Java Compiler (JavaC)

O JavaC vai receber o nosso código fonte e vai compilar para **ByteCode**, após a compilação ainda não conseguimos utilizar ele diretamente nas nossas plataformas.

Após a compilação do nosso código fonte para **ByteCode**, um outro carinha entra em ação, chamado **JVM (Java Virtual Machine)**.

## Java Virtual Machine (JVM)

A **JVM (Java Virtual Machine)** é uma maquina virtual que interpreta e executa nosso **ByteCode** gerado pelo **JavaC** em tempo de execução, e uma das principais características da **JVM** é a capacidade que ela tem de garantir a portabilidade do nosso ByteCode, permitindo que o mesmo ByteCode que foi gerado no MacOS consiga ser executado em uma JVM do Windows ou uma JVM do Linux.

## Compilada ou Interpretada ?

Então no fim das contas, o Java é uma linguagem compilada ou interpretada ? O Java é uma linguagem compilada e depois interpretada.

Isso ocorre, devido o nosso código fonte ser primeiro compilado pelo JavaC e gerado o ByteCode, e depois esse mesmo ByteCode vai ser interpretado pela JVM de uma forma que as plataformas consigam executar.

1 - Código fonte compilado pelo JavaC e gerado o ByteCode.
2 - ByteCode é interpretado pela JVM e executado.

E agora depois de entender todo esse conceito acima, como a gente faz para instalar a JVM na nossa máquina ?

Agora temos **duas opções**, instalar o JRE ou o JDK.

## JRE

O Java Runtime Environment (JRE) é o ambiente de execução do Java.

O JRE fornecerá a JVM, mas será apenas o que precisamos para executar nossa aplicação.

O que eu vou ter dentro do JRE ?

- JVM.
- Bibliotecas para ser possível executar nossa aplicação.
- Suportes e recursos necessários para executar nossa aplicação.

## JDK

O Java Development Kit (JDK) como a própria sigla já diz, é o kit de desenvolvimento para Java.

A JDK é um conjunto de ferramentas e utilitários necessários para que a gente consiga fazer o desenvolvimento da nossa aplicação, e também vai fornecer **tudo que a JRE implementa**, ou seja, quando instalamos a JDK também instalamos a JRE, e também temos outros utilitários como:

- JavaC (Java Compiler).
- Debugger.
- Utilitários para nos auxiliar no nosso desenvolvimento.

Com isso temos um entendimento do conceito de como o Java é compilado e é interpretado e seus utilitários.