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 |
weak |
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 |
strong |
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 |