# 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 | — | — | — |
| 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 |
| 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 | — | — | — |
| 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 | — | 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 | — | — | — |
| 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 | strong | 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 | | | | 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 | —, implicit wrt numbers | — | static+dynamic wrt numbers |
| RPG | weak | | | static |
| Ruby | strong | implicit | — | 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 |