C

Core Java tutorial for beginners

Clean • Professional

How Java Works: Compilation to Execution Process Explained

2 minute

How Java Works: Compilation → Execution Process

Understanding how Java works internally helps beginners and professionals write better, more efficient code. Java is unique because it is both compiled and interpreted, thanks to bytecode and the JVM.


Overview

Java programs go through two main stages before they run on your computer:

  1. Compilation – converting your human-readable code into bytecode.
  2. Execution – JVM reads the bytecode and converts it into machine code your computer can understand.

Unlike languages like C or C++, which compile directly into OS-specific machine code, Java adds an intermediate step (bytecode) that enables platform independence.


Step 1: Writing Java Code

You write your program in a file with a .java extension.

Example:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, Java!");
    }
}
  • This is called source code.
  • Humans can understand it, but computers cannot execute it directly.

Step 2: Compilation (Source Code → Bytecode)

  1. You use the Java Compiler (javac) to compile your .java file:
javac HelloWorld.java
  1. The compiler checks your code for syntax errors.
  2. If everything is correct, it generates a .class file containing bytecode.

Key Points:

  • Bytecode is platform-independent.
  • JVM will later execute this bytecode on any operating system.

What Bytecode Looks Like

Bytecode is not human-readable, but it’s like a set of instructions for the JVM:

0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3       // String "Hello, Java!"
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return

Even though it’s not OS-specific, the JVM interprets this into native instructions.


Step 3: Execution (Bytecode → Machine Code)

Once the bytecode is ready, you run it using the JVM:

java HelloWorld

What Happens Internally:

  1. JVM loads the class (HelloWorld.class).
  2. JVM verifies the bytecode to prevent illegal operations.
  3. JVM converts bytecode to native machine code using either:
    • Interpreter – reads and executes bytecode line by line.
    • Just-In-Time (JIT) Compiler – compiles bytecode into machine code at runtime for faster execution.
  4. JVM executes the program, and you see the output:
Hello, Java!

Visualization: Compilation → Execution

Source Code (.java)
       ↓ [javac]
   Java Compiler
       ↓
Bytecode (.class)
       ↓ [java]
Java Virtual Machine (JVM)
       ↓
Machine Code (OS-specific)
       ↓
Program Output

Benefits of This Model

  1. Platform Independence – same .class file runs anywhere.
  2. Security – JVM verifies bytecode before execution.
  3. Performance – JIT compiler optimizes execution at runtime.
  4. Error Handling – compile-time checks prevent syntax errors.
  5. Memory Management – JVM handles garbage collection automatically.

Real-Life Analogy

Think of it like ordering a dish in a restaurant:

  • Source Code – Your recipe written in English.
  • Bytecode – Recipe translated into a universal cooking language.
  • JVM – Chef in the local kitchen who converts it into local ingredients and cooks it perfectly.
  • Output – Delicious meal (program running) no matter which kitchen (OS) you’re in.

 

Article 0 of 0