![]() |
|||||||||||||
|
Comparison of programming languages |
Programming languages are used for controlling the behavior of a machine (often a computer). Like natural languages, programming languages conform to rules for syntax and semantics.
There are thousands of programming languages1 and new ones are created every year. Few languages ever become sufficiently popular that they are used by more than a few people, but professional programmers can easily use dozens of different languages during their career.
Contents |
The following table compares general and technical information for a selection of commonly used programming languages. See the individual languages' articles for further information. Please note that the following table may be missing some information.
| Language | Type strength | Type safety | Expression of types | Compatibility among composite types | Type checking |
|---|---|---|---|---|---|
| ActionScript 3.0 | strong | safe | static | ||
| Ada | strong | unsafe1 | explicit | name based | static |
| ALGOL 58 | strong | safe | static | ||
| ALGOL 60 | strong | safe | static | ||
| ALGOL 68 | strong | safe | property based | static or dynamic (tagged union) | |
| APL | strong | safe | dynamic | ||
| BASIC | varies by dialect | ||||
| BLISS | none | n/a | n/a | n/a | n/a |
| BeanShell | strong | safe | name based | dynamic | |
| Boo | strong | safe | implicit with optional explicit typing | static with optional dynamic typing | |
| C | weak | unsafe | explicit | name based | static |
| C++ (ISO/IEC 14882) | strong | unsafe | explicit | name based | static with optional dynamic type casting (see dynamic_cast) |
| C# | strong | unsafe1 | explicit | name based | partially dynamic |
| Clean | strong | implicit | static | ||
| Clojure | strong | safe | dynamic | ||
| COBOL | strong | static | |||
| ColdFusion | strong | safe | implicit | dynamic | |
| Common Lisp | strong | safe | dynamic | ||
| Curl | strong | safe | name based | ||
| D | strong | unsafe1 | explicit | name based | static |
| Dylan | strong | safe | dynamic | ||
| Eiffel | strong | safe | name based | static | |
| Erlang | strong | dynamic | |||
| F# | strong | safe | implicit | name based | static |
| Forth | none | n/a | n/a | n/a | n/a |
| Fortran | strong | safe | name based | static | |
| GraphTalk | weak | ||||
| Groovy | strong | safe | implicit | dynamic | |
| Haskell | strong | safe | implicit with optional explicit typing | property based | static |
| Io | strong | dynamic | |||
| J | strong | safe | dynamic | ||
| Java | strong | safe | explicit | name based | static |
| JavaScript | weak | implicit | dynamic | ||
| Joy | strong | safe | dynamic | ||
| Lua | strong | safe | implicit | dynamic | |
| Mathematica | strong | dynamic | |||
| MATLAB M-code | dynamic | ||||
| Modula-2 | strong | unsafe1 | explicit | property based | static |
| Modula-3 | strong | unsafe1 | explicit | property based | static |
| Oberon | strong | safe | explicit | static | |
| Objective-C | weak | explicit | static | ||
| Objective Caml | strong | safe | implicit | property based | static |
| Object Pascal (Delphi) | strong | unsafe1 | explicit | name based | static |
| Oxygene | strong | unsafe | implicit | static | |
| Oz | dynamic | ||||
| Pascal | strong | unsafe1 | explicit | name based | static |
| Perl 5 | weak | implicit | dynamic | ||
| Perl 6 | partially implicit (explicit for static types) | dynamic with optional static typing | |||
| PHP | weak | implicit | dynamic | ||
| Prolog | strong | dynamic | |||
| Python | strong | safe | implicit | property based | dynamic |
| Ruby | strong | safe | implicit | property based | dynamic |
| S | strong | dynamic | |||
| S-Lang | strong | safe | implicit | dynamic | |
| Scala | strong | partially implicit | static | ||
| Scheme | strong | dynamic (latent) | |||
| Smalltalk | strong | safe | implicit | dynamic | |
| Tcl | dynamic | ||||
| Visual Basic | strong | safe | explicit | name based | static |
| Visual Basic .NET | strong | unsafe1 | explicit | static | |
| Visual Prolog | strong | safe | name based | static | |
| Windows PowerShell | strong | safe | implicit | dynamic | |
| XL | strong | safe | name based | static | |
| Language | Type strength | Type safety | Expression of types | Compatibility among composite types | Type checking |
1It is almost safe, unsafe features are not commonly used.
| Language | Statements ratio12 | Lines ratio13 |
|---|---|---|
| C | 1 | 1 |
| C++ | 2.5 | 1 |
| Fortran | 2.5 | 0.8 |
| Java | 2.5 | 1.5 |
| Perl | 6 | 6 |
| Smalltalk | 6 | 6.25 |
| Python | 6 | 6.5 |
The literature on programming languages contains an abundance of informal claims about their relative expressive power, but there's no framework for formalizing such statements nor for deriving interesting consequences.14 This chart provides two measures of expressiveness from two different sources. An additional measure of expressiveness, in GZip bytes, can be found with the Compare to tool on the The Computer Language Benchmarks Game.
Benchmarks are designed to mimic a particular type of workload on a component or system. The computer programs used for compiling some of the benchmark data in this section may not have been fully optimized, and the relevance of the data is disputed. The most accurate benchmarks are those that are customized to your particular situation. Other people's benchmark data may have some value to others, but proper interpretation brings many challenges. See this page about flawed benchmarks and comparisons. The Computer Language Benchmarks Game site contains a large number of micro-benchmarks of reader-contributed code snippets, with an interface that generates various charts and tables comparing specific programming languages and types of tests.