Encyclopedia
Comparison of programming languages by type system
This is a comparison of the features of the type systems and type checking of multiple programming languages.
Brief definitions
- A nominal type system means that the language decides whether types are compatible and/or equivalent based on explicit declarations and names.
- A structural type system means that the language decides whether types are compatible and/or equivalent based on the definition and characteristics of the types.
- Type checking determines whether and when types are verified. Static checking means that type errors are reported based on a program's text (source code). Dynamic checking means that type errors are reported based on a program's dynamic (run-time) behavior.
| 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 | explicit | nominal | static |
| Agda | strong | nominal | static | |
| Aldor | weak | partially implicit | 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 | N/A | N/A | N/A |
| 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 | N/A | N/A | N/A |
| 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 |
| C* | weak | explicit | static | |
| C# | strong | implicit with optional explicit typing | nominal | static |
| 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 | 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 | explicit | nominal | static |
| Dart | strong | 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 | N/A | N/A | N/A |
| Fortran | strong | explicit | 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 | 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 | 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 | explicit | nominal | static |
| JavaScript | weak | implicit | N/A | dynamic |
| Julia | strong | implicit with optional explicit typing | 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 | explicit | nominal | static |
| Modula-3 | weak | explicit | structural | static |
| MUMPS (M) | typeless | N/A | N/A | N/A |
| 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 |
| Objective-C | weak | explicit | nominal | dynamic with optional static typing |
| OCaml | strong | implicit with optional explicit typing | nominal for records, structural for objects | 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 | 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 | strong | 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 | dynamic with optional static typing | ||
| REBOL | strong | implicit | dynamic | |
| Rexx | typeless | N/A, implicit wrt numbers | N/A | static+dynamic wrt numbers |
| RPG | weak | static | ||
| Ruby | strong | implicit | N/A | dynamic |
| Rust | strong | explicit with optional implicit typing | 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 | ||
| 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 | strong | optional | structural | static |
| Unicon | strong | implicit | dynamic | |
| Visual Basic | strong | implicit with optional explicit typing | nominal | static |
| Visual Basic (.NET) | weak | 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 |
Sources and credits
This article is adapted from the Wikipedia article “Comparison of programming languages by type system”, written by its contributors and licensed under CC BY-SA 4.0. Fathomly has changed the layout, removed citation markers, navigation and maintenance notices, and adjusted punctuation. This adapted version is shared under the same license. For references, see the original article.
Fathomly is not affiliated with or endorsed by the Wikimedia Foundation. Spotted a problem? Tell us.