プログラミング言語の比較(プログラミングげんごのひかく)の記事では、コンピュータ・プログラミング言語の比較について説明する。
(コンピュータ・)プログラミング言語は、コンピュータのプログラム(コンピュータ・プログラム)を記述する(プログラミングする)ための形式言語である。形式言語であるので、一般に、自然言語とは異なり形式的で曖昧さが避けられ人工的に定義された構文(統語・syntax。統語論の記事を参照)を持ち、自然言語とは異なり計算理論のための意味論(semantics)を持つ。
現在何千ものプログラミング言語があり、多くの職業プログラマや多くの非職業プログラマが生涯の間に何十もの異なった言語を使用している。一方で、多くの職業プログラマや多くの非職業プログラマが、好みを理由として、あるいは、異なった言語を学習できないためか、一種類ないし僅かな類似した言語のみを使用している。毎年新しいものが作られているものの、ほとんどの言語は一般的にはなっていない。
全体の比較
以下の表は主要なプログラミング言語の全体的および技術的な情報を比較している。詳細は個々の言語のページを参照のこと。
言語
|
一般的な実行モデル
|
影響を受けた言語
|
プログラムパラダイム
|
型付け
|
登場時期
|
Ada
|
ネイティブ
|
Algol, Pascal, C++ (Ada 95), Smalltalk (Ada 95)
|
並行性, 分散コンピューティング, ジェネリック, 命令型, オブジェクト指向
|
宣言型の安全な強い静的型付け
|
1983
|
C
|
ネイティブ
|
Algol, B
|
命令型
|
安全でない弱い静的型付け
|
1973
|
C++
|
ネイティブ
|
C, Simula, Algol 68
|
命令型, オブジェクト指向, ジェネリック
|
宣言型の安全でない強い静的型付け
|
1980
|
C#
|
JIT インタプリタ[1]/ネイティブ[2]
|
Delphi, Java, C++, Ruby
|
命令型, オブジェクト指向, ジェネリック, マルチプラットフォーム, 関数型
|
強い安全である/ない静的型付け 安全で強い動的型付け (C#4 dynamic)
|
2000
|
COBOL
|
ネイティブ
|
FLOW-MATIC, COMTRAN(英語版)
|
命令型, オブジェクト指向
|
弱い/強い型付け
|
1959
|
Common Lisp
|
ネイティブ
|
LISP, Smalltalk
|
命令型, 関数型, オブジェクト指向
|
安全で強い動的型付け
|
1984
|
D
|
ネイティブ
|
C , C++, Java, C#, Eiffel, Python, Ruby
|
命令型, オブジェクト指向, ジェネリック, 契約プログラミング, 関数型
|
強い型付け
|
1999
|
Eiffel
|
ネイティブ
|
Ada, Simula
|
オブジェクト指向, ジェネリック
|
宣言型の安全な強い静的型付け, 契約プログラミング
|
1985
|
Erlang
|
ネイティブ
|
Prolog, Ericsson Pascal, CSP
|
関数型, 並行性, 分散コンピューティング, マルチプラットフォーム
|
強い動的型付け
|
1986
|
Forth
|
インタプリタ / ネイティブ
|
無し
|
命令型, スタック指向
|
型無し
|
1977
|
Fortran
|
ネイティブ
|
無し, Algol(FORTRAN 77以降)
|
命令型, 手続き型, オブジェクト指向
|
宣言型の安全な強い静的型付け
|
1957
|
Go
|
ネイティブ
|
C言語、Python、Oberon-2、Limbo、Active Oberon、Communicating Sequential Processes、Pascal、Oberon-2、Smalltalk、Newsqueak、Modula-2
|
命令型、(オブジェクト指向[3])、手続き型、リフレクション、イベント駆動型、並列コンピューティング
|
強い静的型付け、型推論
|
2009
|
Java
|
インタプリタ / JIT
|
C++, Objective-C, C#[4]
|
命令型, オブジェクト指向, マルチプラットフォーム, ジェネリック
|
強い静的型付け
|
1994
|
JavaScript
|
インタプリタ
|
C, Self, awk, Perl
|
命令型, オブジェクト指向, 関数型
|
強い動的型付け
|
1995
|
Haskell
|
インタプリタ / ネイティブ
|
Miranda, ML
|
関数型、ジェネリック
|
強い静的型付け、型推論
|
1998
|
Mathematica
|
インタプリタ
|
LISP
|
関数型, 手続き型
|
強い動的型付け
|
1986
|
Objective-C
|
ネイティブ
|
C, Smalltalk
|
命令型, オブジェクト指向
|
強い動的/静的型付け
|
1986
|
Object Pascal
|
ネイティブ
|
Pascal
|
命令型, オブジェクト指向
|
宣言型の安全で(ただし安全でないのも許可してる)強い静的型付け
|
1985
|
OCaml
|
インタプリタ / ネイティブ
|
ML, LISP
|
オブジェクト指向, 関数型, 命令型, ジェネリック
|
構造型の安全で静的型付け、型推論
|
1996
|
Perl
|
JIT
|
C, shell, AWK, sed, LISP
|
関数型, オブジェクト指向, 手続き型
|
強い動的型付け
|
1987
|
PHP
|
インタプリタ
|
Perl, C
|
命令型, オブジェクト指向
|
強い動的型付け
|
1995
|
Prolog
|
インタプリタ
|
PLANNER, LISP
|
論理型
|
安全で強い動的型付け(単一化)
|
1972
|
Python
|
インタプリタ
|
ABC, Perl, Modula-3
|
命令型, オブジェクト指向, 関数型
|
強い動的型付け(ダック・タイピング)
|
1991
|
Ruby
|
インタプリタ
|
Perl, Smalltalk, LISP,CLU
|
命令型, オブジェクト指向, 関数型
|
強い動的型付け(ダック・タイピング)
|
1995
|
Rust
|
ネイティブ
|
Alef, C#, C++, Cyclone, Erlang, Haskell, Limbo, OCaml, Scheme, Standard ML, Swift
|
命令型, オブジェクト指向, 関数型, ジェネリック, 並行性
|
強い静的型付け、型推論
|
2009
|
Scala
|
インタプリタ / ネイティブ
|
Java
|
オブジェクト指向, 関数型, ジェネリック
|
強い静的型付け、部分的な型推論
|
2003
|
Scheme
|
インタプリタ / ネイティブ
|
LISP, Algol 60
|
関数型
|
動的型付け
|
1975
|
Simula
|
ネイティブ
|
Algol 60
|
命令型, オブジェクト指向,シミュレーション用
|
安全で強い動的型付け, ダック
|
1961
|
Smalltalk
|
JIT
|
Sketchpad, Simula
|
オブジェクト指向, 関数型, 並列コンピューティング, イベント駆動型, 命令型, 宣言型
|
安全で強い動的型付け, ダック
|
1971
|
Swift
|
ネイティブ
|
Objective-C, Rust, Haskell, Ruby, Python, C#, CLU
|
命令型, オブジェクト指向, 関数型、ジェネリック
|
強い静的型付け、型推論
|
2014
|
Visual Basic
|
ネイティブ
|
QuickBASIC
|
コンポーネント指向, イベント駆動型
|
宣言型の安全で強い静的/動的型付け
|
1991
|
Visual Basic .NET
|
JIT
|
Visual Basic
|
オブジェクト指向, イベント駆動型
|
強い静的型付け
|
2001
|
構文の表現力
プログラミング言語に関する文献には、それらの相対的な表現力に関する非公的な主張は多くみられるものの、各言語の構文を互いに比較して意味ある結果を出すことができる公認された枠組みは無い。[5]
言語 |
文の数の比[6]
|
行数の比[7]
|
C |
1 |
1
|
C++ |
2.5 |
1
|
Fortran |
2.5 |
0.8
|
Java |
2.5 |
1.5
|
Perl |
6 |
6
|
Python |
6 |
6.5
|
Smalltalk |
6 |
6.25
|
MS Visual Basic |
4.5 |
?
|
次の表は、二つ異なる文献からの表現力の二つの尺度を示す。
この表は同等のプログラムを書いた時のソースコードの「行数」あるいは「文の数」を C語のソース÷他言語のソース で示している。例えば Perlと Cを比べると Cの方が 6倍多くの行数を必要としている。
ただしこれは公的な値ではなく、また生成されたプログラムの実行速度やメモリ要求量を示しているものではない。多くの場合、実行速度やメモリ要求量で見た性能は全く異なっている。
これら表現力あるいは他の性能について、さらなる計測値は、GZip byte の「コンピュータ言語のベンチマークゲーム(the Computer Language Benchmarks Game)」にある。
脚注
- ^ https://msdn.microsoft.com/ja-jp/magazine/mt614271.aspx?f=255&MSPPError=-2147217396
- ^ “Native AOT deployment overview - .NET”. 2024年6月23日閲覧。
- ^ “Frequently Asked Questions (FAQ) - The Go Programming Language”. golang.org. 2019年6月21日閲覧。
- ^ Java 5.0 では、いくつかの機能(Foreach文、オートボクシング、可変長引数、アノテーション、列挙型)が C# のようなライバル言語で有効性が証明されてから追加された。[1][2][3]
- ^ On the Expressive Power of Programming Languages、Matthias Felleisen、ESOP '90 3rd European Symposium on Programmingより。
- ^ コードコンプリートのデータから。 文の数の比は column "shows typical ratios of source statements in several high-level languages to the equivalent code in C. A higher ratio means that each line of code in the language listed accomplishes more than does each line of code in C.
- ^ The ratio of line count tests won by each language to the number won by C when using the Compare to feature at http://shootout.alioth.debian.org/debian/c.php. Last updated May, 2006. C gcc was used for C, C++ g++ was used for C++, Fortran G95 was used for Fortran, Java JDK Server was used for Java, and Smalltalk GST was used for Smalltalk.
|
---|
低水準言語 | |
---|
高水準言語 |
1950年代 | |
---|
1960年代 | |
---|
1970年代 | |
---|
1980年代 | |
---|
1990年代 | |
---|
2000年代 | |
---|
2010年代 | |
---|
|
---|
架空の言語 | |
---|
|
|