Programming Languages — and the Languages Used to Build Them
Software is built in layers. Each generation of programming languages trades control for productivity, standing on top of older, more primitive systems. While syntax changes and tools improve, the foundation stays the same. Understanding the languages beneath your language reveals why C continues to run the world.

Most developers think of programming languages as independent tools.
Python is Python. Java is Java. JavaScript is JavaScript.
But under the hood, almost no language stands alone.
Modern programming languages are built on top of other languages, forming a layered stack that goes all the way down to machine code. Once you see this stack, a lot of things suddenly make sense: performance differences, portability, and why C keeps showing up everywhere.
Let’s break it down.
The Big Idea: Abstractions All the Way Down
High-level languages exist to make developers more productive:
-
automatic memory management
-
readable syntax
-
rich standard libraries
Low-level languages exist to make computers efficient:
-
direct memory access
-
predictable performance
-
minimal overhead
Instead of choosing one or the other, the software world layers them.
Each new language builds on top of an older, more primitive one.
Popular Languages and What They’re Built With
Here’s how the most important languages are actually implemented:
Python
-
Built primarily in C (CPython)
-
Some components use C++
-
Python code eventually calls C functions for memory, I/O, and math
This is why Python feels slow at times — and why C extensions make it fast.
JavaScript
-
Implemented in C++ (V8, SpiderMonkey)
-
Some modern engines include Rust
When JavaScript runs in your browser or Node.js, it’s executing inside a highly optimized C++ engine.
Java
-
Runs on the JVM, written in C and C++
-
Java code → bytecode → executed by native runtime
Java’s “write once, run anywhere” works because the JVM is rewritten for each OS.
C++
-
Built on top of C and assembly
-
Adds abstractions like classes, templates, and RAII
C++ doesn’t replace C — it extends it.
Rust
-
Compiler written mostly in Rust
-
Uses LLVM (written in C++)
-
Some runtime and system bindings in C
Rust still relies on older tooling to generate machine code.
Go
-
Compiler and runtime written in Go
-
Uses C and assembly for low-level OS interactions
Despite being “modern,” Go still drops to C at the system boundary.
Swift
-
Compiler built using C++, Objective-C
-
Uses LLVM for code generation
Apple’s modern language stands on decades of older infrastructure.
Kotlin
-
Runs on the JVM (Java + C++)
-
Native version uses LLVM and C++
Kotlin is layered on top of Java, not a replacement.
PHP
-
Interpreter written in C
-
Web requests eventually hit C-level execution
That’s how PHP can handle massive traffic efficiently.
Ruby
-
Core interpreter written in C
-
Performance-critical parts implemented at the C level
Ruby feels dynamic because C makes it possible.
R
-
Core implemented in C and Fortran
-
High-performance numerical routines rely on older scientific code
Decades-old Fortran still powers modern data science.
C#
-
Runs on the CLR, implemented in C and C++
-
Similar design philosophy to Java/JVM
Managed languages still need unmanaged foundations.
Lua
-
Entirely written in C
-
Designed to embed easily inside games and systems
That’s why Lua is everywhere in game engines.
What’s at the Bottom of the Stack?
No matter how modern the language looks, it eventually becomes:
High-level code → runtime → C → assembly → machine code
At the lowest level:
-
CPUs understand only machine instructions
-
Everything else is translation
This is why C never goes away. It sits at the boundary between software and hardware.
Why This Matters as a Developer
Understanding this stack helps you:
-
reason about performance
-
debug weird runtime behavior
-
appreciate why some bugs feel “non-deterministic”
-
write better abstractions
You don’t need to write C every day —
but knowing it exists under your code makes you a better engineer.
Final Thought
New languages will keep appearing.
Syntax will keep improving.
Tooling will get friendlier.
But the foundation doesn’t change.
You don’t replace layers in software.
You build on top of them.
And at the bottom of almost every modern stack,
C is still quietly doing the work.