DEV Community

Cover image for How Programming Languages Are Converted into Machine Code

How Programming Languages Are Converted into Machine Code

Programming is pretty much fun! We can do amazing things with programming, such as building a calculator, building a website, or even building an AI Agent (or LLM, you get the idea). But machines don't understand these programming languages directly. They only understand binary code — the 0s and 1s. So each programming language needs to be compiled or interpreted first.

But there’s more complexity. Not all machines, operating systems, or chips understand the same binary code. That’s why a Windows program cannot run on macOS or Linux. Each platform “speaks” a different machine language.

Let’s break this down in the simplest way possible.


🧠 Why Machine Code Is Different on Windows, macOS, and Linux

When you compile a program directly to machine code, the compiler must target:

  1. A specific CPU type (Intel, AMD, ARM)
  2. A specific operating system (Windows, macOS, Linux)

If either one is different, the binary will not run.

1. Different CPUs Understand Different Instructions

Every CPU has its own instruction set.

  • Intel/AMD use x86 / x86-64
  • Apple M1/M2 use ARM64
  • Many Android devices also use ARM

Machine code is literally a list of instructions for the CPU.

So:

❌ A Windows program compiled for an Intel x86 CPU will not run on a Mac with an ARM CPU.

The CPU simply does not understand those instructions.

2. Different Operating Systems Provide Different System Calls

Even if the CPU is the same (example: Intel), Windows and macOS give programs different ways to talk to the system.

For example:

  • Windows uses APIs like CreateFile()
  • macOS/Linux use open()

So:

❌ Even if the CPU matches, a Windows program won’t run on macOS

because it calls Windows-specific functions that macOS doesn’t have.

3. Different System Libraries

Windows uses .dll files.

macOS uses .dylib files.

Linux uses .so files.

Programs depend on these during execution.

❌ A Windows .exe cannot find the libraries it needs on macOS.

So it fails.


🍎 Easy Analogy: Why It Doesn’t Work

Imagine you write a recipe:

  • In English
  • Using tools found only in a Windows kitchen

Now you give it to:

  • A Mac chef
  • In a Mac kitchen

The chef sees:

  • Steps written in a different language (CPU instructions mismatch)
  • Tools that don’t exist in their kitchen (OS system calls mismatch)
  • Ingredients stored differently (system libraries mismatch)

So the chef simply cannot follow the recipe.

That’s why you must compile programs separately for Windows, macOS, and Linux.


1. Direct Compilation to Machine Code

Some languages compile straight to machine code for a specific CPU and OS.

Examples:

C, C++, Rust, Go

Flow:

Source Code → Compiler → Machine Code (Windows / macOS / Linux)

Pros: Fastest

Cons: Needs a separate binary for each platform


2. Bytecode: A Middle Step

Some languages convert your code into bytecode, a portable, OS-independent format.

Examples:

Java, Kotlin, C#, Python

Flow:

Source → Bytecode → Virtual Machine (VM) → Machine Code

Pros: Runs on any OS with a VM

Cons: Slightly slower


3. Interpreted + JIT Compilation

Some languages are interpreted but use JIT to speed things up.

Examples:

JavaScript, Python (PyPy), Ruby

Flow:

Source → Interpreter/JIT → Machine Code


4. Transpiled Languages

Some languages convert to another language first.

Examples:

TypeScript → JavaScript → JIT → Machine Code


Summary Table

Approach Languages How They Run
Direct Compilation C, C++, Rust, Go Machine code for a specific CPU + OS
Bytecode + VM Java, C#, Python Bytecode → VM → Machine Code
Interpreted + JIT JS, Python, Ruby Interpreter/JIT → Machine Code
Transpiled TypeScript, Elm Transpile → JS → JIT → Machine Code

Key Takeaway:

We write code in human-friendly languages, but CPUs and operating systems only understand their own binary “dialects.” Compilers, interpreters, VMs, and JIT help translate our code into something the machine can run.

Top comments (0)