Comparison matrices

Twelve widely used languages compared on the same rows across three matrices: language features, concurrency support, and interoperability and tooling. Each matrix is horizontally scrollable and keeps its metric column in view.

How to read these tables. Yes means the facility is provided by the language or its standard library; Partial means it is available with restrictions, through a convention, or only in recent versions; No means it is absent or requires a third-party library. No cell ranks a language: absence of a feature is a design decision as often as a gap.

Language features

Rows describe the language and its standard library, not third-party packages.

MetricCC++JavaC#GoRustSwiftKotlinPythonJavaScriptTypeScriptHaskell
Identity
First appeared197219851995200020092010201420111991199520121990
Type checkingStaticStaticStaticStaticStaticStaticStaticStaticDynamicDynamicStaticStatic
Type inferenceNoPartialPartialPartialPartialYesYesYesNoNoYesYes
Memory modelManualRAIIGCGCGCOwnARCGCRC+GCGCGCGC
Null in the type systemNoNoPartialYesNoYesYesYesNoNoYesYes
Data modelling
Algebraic data typesNoPartialPartialPartialNoYesYesPartialPartialNoYesYes
Exhaustive pattern matchingNoPartialPartialPartialNoYesYesPartialPartialNoPartialYes
GenericsNoYesYesYesYesYesYesYesPartialNoYesYes
Abstraction
Operator overloadingNoYesNoYesNoYesYesYesYesNoNoYes
First-class closuresNoYesYesYesYesYesYesYesYesYesYesYes
Immutability by defaultNoNoNoNoNoYesPartialPartialNoNoNoYes
Compile-time metaprogrammingPartialYesNoPartialNoYesYesPartialNoNoPartialYes

Sources: language specifications and standard library documentation for each language's current stable release.

Back to top

Concurrency

Concurrency facilities provided by the language or its standard library.

MetricCC++JavaC#GoRustSwiftKotlinPythonJavaScriptTypeScriptHaskell
Execution units
OS threads exposedYesYesYesYesPartialYesYesYesYesNoNoYes
Lightweight tasksNoPartialYesYesYesYesYesYesPartialYesYesYes
async / awaitNoYesNoYesNoYesYesYesYesYesYesPartial
Coordination
Channels in the standard libraryNoNoPartialYesYesYesYesPartialYesNoNoYes
Actor isolation in the languageNoNoNoNoNoNoYesNoNoNoNoNo
Compiler-checked data-race safetyNoNoNoNoNoYesYesNoNoNoNoPartial
Runtime serialises user codeNoNoNoNoNoNoNoNoYesYesYesNo

Green, amber, and grey markers carry text labels so the table remains readable without colour.

Back to top

Interoperability and tooling

Interoperability with existing native code, and the tooling shipped with the toolchain.

MetricCC++JavaC#GoRustSwiftKotlinPythonJavaScriptTypeScriptHaskell
Native interoperability
C ABI, calling outYesYesPartialPartialYesYesYesPartialYesPartialPartialYes
C ABI, callable from CYesYesPartialPartialYesYesYesPartialPartialNoNoYes
C++ interoperabilityPartialYesNoNoNoPartialYesNoPartialNoNoNo
Stable binary interfaceYesNoYesYesNoNoYesNoNoNoNoNo
Shipped tooling
Official package managerNoPartialYesYesYesYesYesYesYesYesYesYes
Official formatterNoNoNoYesYesYesYesYesNoNoNoNo
Official language serverNoPartialPartialYesYesYesYesYesPartialPartialYesPartial
REPL in the toolchainNoPartialYesYesNoNoYesYesYesYesPartialYes

“Official” means maintained by the same organisation or working group as the compiler.

Back to top

What has moved

The matrices describe current stable releases. This is what that qualification is worth over six years.

2019C# 8: nullable refs2021Python 3.10: match2022Go 1.18: generics2023Java 21: patterns2024Swift 6: race safety2025CPython 3.14: free-threaded
Figure 1. Cells in these matrices that changed value, and when. Every row below was a No in an earlier edition of the same table, which is the argument against reading any matrix as a permanent property of a language. Sources: each language's release notes.

Back to top

Caveats

Versions move

Feature rows reflect the current stable release. Several cells that read No a decade ago now read Yes — generics in Go, pattern matching in Java and Python, nullability in C#.

Implementations differ

Rows describe the reference implementation. Python's global interpreter lock is a CPython property, not a language requirement, and recent CPython releases make it optional.

Feature counts are not scores

Totalling the Yes cells produces a number with no meaning. C's short row reflects a deliberately small language that has outlasted most of its replacements.

Back to top