This is a comparison of the features of the type systems and type checking of multiple programming languages.
Brief definitions
Language | Type safety | Type expression | Type compatibility and equivalence | Type checking |
---|---|---|---|---|
A+ | strong | dynamic | ||
ActionScript 3.0 | strong | implicit with optional explicit typing | static | |
ABC | strong | |||
ABAP | strong | nominal | static | |
Ada | strong [TS 1] | explicit | nominal | static |
Agda | strong | nominal | static | |
Aldor | weak | partially implicit [1] | static | |
Alef | strong | static | ||
ALGOL 58 | strong | explicit | static | |
ALGOL 60 | strong | explicit | static | |
ALGOL 68 | strong | explicit | structural | static & tagged unions |
ALGOL W | strong | static | ||
Alice | strong | implicit with optional explicit | static | |
Alma-0 | static | |||
AmbientTalk | strong | dynamic | ||
AMOS BASIC | static | |||
AngelScript | strong | static | ||
APL | strong | dynamic | ||
AppleScript | weak | dynamic | ||
Arc | dynamic | |||
Assembly | ? | ? | ? | ? |
AutoHotkey | typeless | — | — | — |
AutoLISP | dynamic | |||
Ateji PX | strong | explicit | nominal | static |
AWK | weak | implicit | dynamic | |
B | typeless | |||
Ballerina | strong | structural | static | |
Bash | ? | ? | ? | ? |
BASIC | strong | explicit | nominal | static |
BCPL | typeless | |||
BeanShell | strong | nominal | dynamic | |
BLISS | typeless | — | — | — |
Boo | strong | implicit with optional explicit typing | static with optional dynamic typing | |
Bro | strong | implicit with optional explicit typing | nominal | static |
C | weak | explicit | nominal | static |
C-- | weak | static | ||
C++ (ISO/IEC 14882) | strong | explicit with optional implicit typing (by using auto in C++11) | nominal | static [TS 2] |
C* | weak | explicit | static | |
C# | strong [2] | implicit with optional explicit typing | nominal | static [TS 3] |
C shell | ? | ? | ? | ? |
Caml | strong | implicit with optional explicit typing | static | |
Cecil | dynamic with optional static typing | |||
Clean | strong | implicit | static | |
Ceylon | strong | static | ||
Chapel | implicit with optional explicit typing | static | ||
CHILL | strong | static | ||
ChucK | strong | |||
Cilk | weak | explicit | static | |
Claire | strong | implicit with optional explicit typing | dynamic with optional static typing | |
Clean | strong | ? | ||
Clojure | strong | implicit with optional explicit typing | dynamic | |
CLU | strong | |||
COBOL | strong | explicit | nominal | static |
Cobra | strong | explicit with optional implicit typing | static with optional dynamic typing | |
CoffeeScript | implicit | dynamic | ||
ColdFusion (CFML) | strong | implicit | dynamic | |
COMAL | strong | |||
Common Lisp | strong | implicit with optional explicit typing | structural for implicit typing, nominal for explicit typing | dynamic, some static checking(depending on implementation) |
Component Pascal | strong | static | ||
Cool | strong | explicit | static | |
CORAL | strong | static | ||
Crystal | implicit with optional explicit typing [3] | structural | static | |
Cuneiform | explicit | static | ||
Curl | strong | nominal | ||
Curry | strong | implicit with optional explicit typing | static | |
Cython | strong | implicit with optional explicit typing | nominal (extension types) and structural (Python) | dynamic with optional static typing |
D | weak [TS 4] | explicit | nominal | static |
Dart | strong [4] | gradual typing | nominal | static with optional dynamic typing |
Dylan | strong | dynamic | ||
Eiffel | strong | nominal | static | |
Elixir | strong | implicit | dynamic | |
Erlang | strong | implicit | dynamic | |
Euphoria | strong | explicit, implicit with objects | nominal | static, dynamic with objects |
F# | strong | implicit | nominal | static |
Forth | typeless | — | — | — |
Fortran | strong | explicit [TS 5] | nominal | static |
Gambas | strong | explicit | nominal | |
GLBasic | strong | explicit. Non-explicit declarations available through project options | nominal | static |
Gleam | strong | implicit with optional explicit | nominal | static |
Go [5] | strong | partially implicit (local type inference) | structural | static |
Gosu | strong | partially implicit (local type inference) | nominal (subclassing) and structural | static |
Groovy | strong | implicit with optional explicit typing | dynamic with optional static typing | |
Harbour | strong | implicit with optional explicit typing | dynamic | |
Haskell | strong | implicit with optional explicit typing | nominal [6] [7] | static |
Haxe | strong | implicit with optional explicit typing | nominal (subclassing) and structural | static with optional dynamic typing |
Io | strong | implicit | dynamic | |
icon | strong | implicit | dynamic | |
ISLISP | strong | dynamic | ||
J | strong | dynamic | ||
Java | strong [8] | explicit | nominal | static |
JavaScript | weak | implicit | — | dynamic |
Julia | strong | implicit with optional explicit typing [9] | structural for implicit typing, nominal for explicit typing | dynamic |
Joy | strong | dynamic | ||
Kotlin | strong | partially implicit (local type inference) | nominal | static |
LabVIEW | strong | |||
Lua | strong | implicit | dynamic | |
Maple | strong | dynamic | ||
Mercury | strong | static | ||
Mathematica | strong | dynamic | ||
MATLAB M-code | strong | dynamic | ||
Modula-2 | weak [TS 4] | explicit | nominal | static |
Modula-3 | weak [TS 4] | explicit | structural | static |
MUMPS (M) | typeless | — | — | — |
Neko | dynamic | |||
Nemerle | strong | implicit | nominal | static |
NetLogo | strong | implicit | dynamic | |
NetRexx | strong | implicit with optional explicit | dynamic with optional static typing | |
newLisp | implicit | dynamic | ||
NEWP | strong | static | ||
Newspeak | dynamic | |||
NewtonScript | dynamic | |||
Nial | dynamic | |||
Nim | strong | partially implicit (type inference) | static | |
Nickle | strong | |||
Nu | dynamic | |||
Oberon | strong | explicit | nominal | static and partially dynamic [TS 6] |
Objective-C | strong | explicit | nominal | dynamic with optional static typing [10] |
OCaml | strong | implicit with optional explicit typing | nominal for records, [11] structural for objects [7] [12] | static |
Object Pascal | strong | explicit | nominal | static |
Opa | strong | implicit with optional explicit typing | structural | static |
Oxygene | weak | implicit | static | |
Oz-Mozart | strong | implicit | structural | dynamic |
Pascal | weak [TS 4] | explicit | nominal | static |
Perl 5 | implicit | dynamic | ||
PHP | weak | implicit with optional explicit typing | nominal | dynamic |
Plus | strong | explicit | structural | static, dynamic (optional) |
Prolog | dynamic | |||
Pure | dynamic | |||
PureScript | strong | implicit with optional explicit typing | nominal | static |
Python | strong | implicit (with optional explicit typing as of 3.5) | nominal | dynamic |
R | implicit | dynamic | ||
Raku | partially implicit [TS 7] | dynamic with optional static typing | ||
REBOL | strong | implicit | dynamic | |
Rexx | typeless | —, implicit wrt numbers | — | static+dynamic wrt numbers |
RPG | weak | static | ||
Ruby | strong | implicit | — | dynamic |
Rust | strong | explicit with optional implicit typing [13] | mostly nominal | static |
S | dynamic | |||
S-Lang | strong | implicit | dynamic | |
Scala | strong | partially implicit (local type inference) | nominal (subclassing) and structural | static |
Scheme | strong | implicit | dynamic (latent) | |
Seed7 | strong | explicit | nominal | static |
Simula | strong | static [TS 8] | ||
Smalltalk | strong | implicit | dynamic | |
Swift | strong | partially implicit (local type inference) | nominal (subclassing) and structural | static |
Standard ML | strong | implicit with optional explicit typing | structural | static |
Tcl | dynamic | |||
TypeScript | ? | optional | structural | static |
Unicon | strong | implicit | dynamic | |
Visual Basic | strong | implicit with optional explicit typing | nominal | static |
Visual Basic (.NET) | weak [TS 4] | explicit | static | |
Visual Prolog | strong | partially implicit | nominal | static |
Wolfram Language | strong | dynamic | ||
Windows PowerShell | strong | implicit | dynamic | |
XL | strong | nominal | static | |
Xojo | strong | explicit | nominal | static |
XPath/XQuery | strong | partially implicit | nominal | dynamic with optional static typing |
Language | Type safety | Type expression | Type compatibility and equivalence | Type checking |