The programming language landscape

This atlas organises general-purpose programming languages by the dimensions that actually distinguish them: paradigm, type discipline, memory model, execution model, and concurrency model. Each dimension is described once and then applied consistently across every language entry, so entries can be compared rather than merely read.

Scope and method

What is counted, how it is classified, and where the facts come from.

Inclusion

Languages with a published specification or a reference implementation in continuous maintenance, and measurable use outside their origin organisation.

Classification

Every language is tagged along five orthogonal axes. Multi-paradigm languages carry multiple tags; no axis is treated as a ranking.

Dating

“First appeared” is the first public release or publication, not the start of internal development and not the 1.0 milestone. Rust (announced 2010, 1.0 in 2015) and Kotlin (2011, 1.0 in 2016) are the widest gaps in the index.

Sources

Language specifications, official release notes, and reference documentation. Popularity figures are attributed to the specific survey that produced them.

Back to top

At a glance

5Classification axes
8Language families
38Languages indexed
1957Earliest entry (Fortran)
6Paradigm groups
4Memory models

Counts describe this atlas, not the language population as a whole; thousands of languages exist outside the inclusion criteria above.

024791950s: 331950s1960s: 441960s1970s: 441970s1980s: 661980s1990s: 991990s2000s: 552000s2010s: 772010s2020s: 002020sentries
Figure 1. First appearances per decade, and the memory model each family settles on. The 1990s produced more of this index than any other decade, and the empty 2020s column is the finding rather than a gap: the decade's work has gone into revising existing languages. Source: this atlas's index of 38 entries.
Dynamic scriptingDynamic scripting · Collected: 999C familyC family · Collected: 33C family · Manual: 558ML and functionalML and functional · Collected: 555Systems and ownershipSystems and ownership · Manual: 22Systems and ownership · Ownership: 224Managed runtimesManaged runtimes · Collected: 444Array and statisticalArray and statistical · Collected: 33Array and statistical · Manual: 114Lisp familyLisp family · Collected: 222Logic and declarativeLogic and declarative · Collected: 11Logic and declarative · Engine: 112CollectedManualOwnershipEngine
Figure 2. Every family's memory model composition. Only the C family and the systems family are internally divided; the rest inherit one model from their tradition, which is why memory model predicts family so much better than it predicts age. Segment colours match the status tags used throughout the site.

Back to top

Language families

Families group languages by lineage and design tradition, not by application domain. A language may sit in one family and borrow heavily from another.

Back to top

Classification axes

The five axes used throughout the atlas. Follow each for its full definition and the trade-offs it implies.

Back to top

Representative languages by axis

A short cross-section. The complete index is on the Languages page; the full matrix is on the Comparison page.

Language First appeared Paradigm emphasis Typing Memory Execution Primary domain
C 1972 Imperative, procedural Static, weak Manual AOT compiled Systems, embedded
C++ 1985 Multi-paradigm, generic Static, partly weak Manual + RAII AOT compiled Systems, games, HPC
Java 1995 Object-oriented Static, strong Tracing GC Bytecode + JIT Enterprise, Android
Python 1991 Multi-paradigm, imperative Dynamic, strong Refcount + cycle GC Interpreted Scripting, data, ML
JavaScript 1995 Multi-paradigm, prototype-based Dynamic, weak Tracing GC JIT Web front end, servers
Rust 2010 Multi-paradigm, functional-leaning Static, strong, inferred Ownership / borrow AOT compiled (LLVM) Systems, tooling
Swift 2014 Protocol-oriented, multi-paradigm Static, strong, inferred ARC AOT compiled (LLVM) Apple platforms, servers
Haskell 1990 Purely functional, lazy Static, strong, inferred Tracing GC AOT compiled Research, compilers, finance
Go 2009 Imperative, CSP concurrency Static, strong Concurrent tracing GC AOT compiled Network services, infra
SQL 1974 Declarative, relational Static, per-dialect Engine-managed Query planner Data query and definition

Sources: language specifications and reference implementation documentation. “Paradigm emphasis” names the dominant style in idiomatic use, not the full set of supported styles.

Static checked before execution Dynamic checked during execution GC automatic, collector-driven Manual programmer-directed Ownership/ARC compile-time or refcount discipline Unspecified varies by implementation

Back to top

How to read an entry

Source Front end parse · typecheck IR Machine code Bytecode + JIT Interpreter
Figure 1. The three execution routes an entry may take. The axis records the route taken by the reference implementation; alternative implementations are noted separately. Diagram: Programming Language Atlas.

Entry structure

Every language article opens with an infobox carrying the same fields in the same order — paradigm, designers, developer, first appearance, stable release, typing discipline, memory management, supported operating systems, licence, filename extensions, and influences in both directions.

The body then follows a fixed sequence: history, platforms, version history, features with worked code, runtime and libraries, memory management, debugging, comparison to related languages, and other implementations.

The Swift article is the reference implementation of that structure and should be used as the template for further entries.

Consistency rule. A field is either filled from a citable source or marked Unspecified. It is never inferred from a similar language.

Back to top

Start reading

Back to top