computer science / programming languages
Learn Programming Languages & Compilers, Free
Go beyond "learning a language" to understanding how languages themselves work — the paradigms behind them and how to build one. These free courses make you a fundamentally better programmer in every language.
Once you've learned a couple of languages, the biggest level-up isn't a third one. It's understanding the ideas that all languages share: types, scope, closures, functional vs. object-oriented styles, and how source code becomes something a machine runs. This is one of the most underrated areas of CS for working developers, because it changes how you see every language you use: features that felt like arbitrary syntax become instances of concepts you recognize, and picking up a new language becomes a weekend, not a month. The two tracks below cover it: first the concepts that transfer everywhere, then building a language yourself, which is by far the best way to truly understand them. This guide lays out how to approach both.
01 · PARADIGMS & CONCEPTS
How languages think
The concepts that transfer across every language you'll ever use.
- Programming Languages — University of Washington ↗Dan Grossman's beloved course contrasting functional and OO paradigms across ML, Racket, and Ruby. Free to audit.coursera.org
- Structure and Interpretation of Computer Programs (SICP) ↗The classic MIT text — free online — that reshapes how you think about programming, abstraction, and interpreters.mit.edu
02 · BUILD ONE
Compilers & interpreters
The best way to understand languages is to build one. These make it approachable.
- Crafting Interpreters (free book) ↗A famous, free, beautifully-written book that walks you through building two complete interpreters from scratch. Start here.craftinginterpreters.com
- Stanford CS143 — Compilers ↗Stanford's compilers course: lexing, parsing, semantic analysis, and code generation. Free materials and assignments.web.stanford.edu
03 · HOW TO LEARN IT
How to approach this subject
Two things make this material click. First, learn a language unlike the ones you know: if you only know Python or JavaScript, learning a functional language (as the UW course teaches) exposes concepts your usual languages hide. Second, build something: working through "Crafting Interpreters" to make your own small language is the single most illuminating project in this area. Concepts you'd otherwise memorize become obvious once you've implemented them.
04 · AVOID THIS
The most common misconception
One expectation trips people up before they even start — worth clearing up so you come in with the right mindset:
05 · FAQ
Frequently asked questions
Why should I study programming languages as a topic?
Studying programming languages teaches the concepts shared by all languages, such as types, scope, and evaluation, which makes learning any new language much faster and makes you a stronger programmer. It reveals the ideas behind the syntax you use every day.
What is the best free resource to learn about compilers?
"Crafting Interpreters" is a famous, free, beautifully written book that walks you through building two complete interpreters from scratch. Stanford's CS143 compilers course is an excellent, more academic free complement covering lexing, parsing, and code generation.
Do I need to know these topics to be a good programmer?
You can build software without formally studying languages and compilers, but understanding them makes you noticeably better. It deepens your grasp of how code runs, helps you learn new languages quickly, and improves your debugging and design instincts.
What is SICP and is it worth reading?
SICP, or Structure and Interpretation of Computer Programs, is a classic MIT text available free online that reshapes how you think about abstraction and programming. It is challenging but highly regarded, and it remains worthwhile for developers who want a deeper conceptual foundation.
Should I learn functional programming?
Yes, at least the concepts. Learning a functional language exposes ideas like immutability and higher-order functions that improve how you write code in any language, including mainstream ones like Python and JavaScript that have adopted many functional features.