言語仕様が一番複雑なプログラミング言語は何だろうか?主観的な意見として、○○の機能があるとか、ないとか、そういう話になるだろう。しかし、客観的に判断するとしたら、どうするべきだろうか?
一つはBNFを用いた比較だろう。しかし、BNFは文法の複雑さの指標になっても、それらが意味するところの解釈の複雑さについては指標にならない。そこで、解釈を含めたその言語仕様を全てカバーしたもの、つまり、規格書を比較すればいいのではないかと考えた。
プログラミング言語によっては国際的な規格書が存在しないものもある。特にオープンソースで開発されている言語では、コミュニティーの合意によって作成された複数の文献によって仕様が形作られているというのもある。なかには、実装がそのまま仕様であり、明文化されていないものもあるだろう。また、仕様自体がHTMLである場合、それがどれぐらいの量であるかを把握するには難しい(各ページの文字数カウント等が必要であろう)。そこで、今回はPDF化・書籍化されたものに限定し、ページ数を数えることにした。規格書についてはWikipediaの下記ページを参考にした。
Comparison of programming languages - Wikipedia
以下、主な言語についてまとめた表である。内容やページ構成の違いによって大きくページ数が異なることがあるため、絶対的な指標とはならないことに注意して欲しい1。
言語 | 規格書 | ページ数 |
---|---|---|
Fortran | ISO/IEC 1539-1:2010 + ISO/IEC 1539-2:2000 | 603 + 20 |
COBOL | ISO/IEC 1989:2014 | 927 |
C11 | ISO/IEC 9899:2011 | 683 |
C++17 | ISO/IEC 14882:2017 | 1605 |
C#2.0 | ISO/IEC 23270:2006 | 531 |
Ruby1.8 | ISO/IEC 30170:2012 | 313 |
ECMAScript8 | Standard ECMA-262 | 885 |
C#5.0 | Standard ECMA-334 | 516 |
Java10 | Java SE Specifications | 772 |
※ C#、Rubyについては国際規格の方が後付けであるため、最新のバージョンよりも低い。そのため、その後のバージョンでで追加された機能は記載されていない。
※ 規格化に当たり、全ての言語仕様が記載されていない場合がある。Rubyは1.9以降を考慮したサブセットでの記述になっているし、ECMAScriptにはブラウザのJavaScriptで標準搭載されているDOM周りのAPIは含まれていない。
C++はRubyの5倍以上である。他言語と比較してもほとんどの言語に対してダブルスコアをたたき出している。よくC++は言語仕様が複雑という話があるが、客観的な指標のひとつとしてこの表をみれば納得できるか面もあるかと思う。
-
詳しくは@take_cheezeさんのコメントを参照。 ↩
Rubyの規格は1.8レベルなので、C++03かC++11と比較するのが妥当な気が。
標準ライブラリも分離しないとあんまりフェアでない気がしますね。
C++は標準ライブラリが少ない言語なので、他の言語と比較すると逆に薄い気はしますね。
(もちろん、言語仕様だけのページ数だけを比較するとそれなりに多いかと思います)
他の言語の標準ライブラリをページ数に換算すると家庭用プリンタで印刷不可能レベルに達する気がしますが...
@take_cheeze さん
細部にこだわっているとなかなかな厳しい物があります。そもそもページ構成やフォントの大きさとかも考えるとISOとECMAを比較する意味があるのか、そもそもJavaは国際規格ですらないなど、色々ツッコミ所はあるかと思います。あくまで参考という形で見て貰えればと思っています。なお、古いバージョンはページ数がわからなかったので、最新のわかるものだけ取ってきています。
ISOは高くて買えないので、draftや目次を見ただけなのですが、RubyやECMAScriptは組込クラスや組込関数だけが記載されているようです。組込クラスなどは役割的にはSTLをどっこいどっこいのような気がします。むしろ、RubyやECMAscriptでは配列などが一種類しかないため、array,vector,dequeu,foward_list,listそしてCスタイルの配列と用途に合わせて多くを用意しているC++の方がクラスの数という意味では多いかも知れません。逆に、JavaはObjectとStringについて必要なことだけ述べているだけで、他のライブラリについては記載が無い感じで、これだけ見てもライブラリリファレンスを別途見ないと何も作れないような気もします。
標準の組込ライブラリ部分を除いて、文字数や単語数カウントするとすれば、PDF化や書籍化されていない言語も含め、より正確に比較できるかも知れません。誰か挑戦してくれないかなと思っています。
schemeは100ページで納まると思います。
規格化はその時々の各勢力の政治事情とかも絡むので、規格化された量はあまり客観的な指標ではないのではと言いたいだけなので、普段規格を参照されないようでしたら、そういった明言は控えられた方がよいのでといっただけです。
規格書を読まないようでしたら、どうでもことだと思うので適当に聞き流してください。
Javaに関して、C++だとメモリモデルや抽象的な実行モデルもあるのでJVMの仕様も含めるべきかと思います。
Rubyはrubyspecがあるので、それらで仕様として認知されている部分を含めないと使い物にならないです。
(mrubyをご存知でしたら、ISOで定義されている機能がある程度実装されているとはいえ単体ではあまり使い物にならないというのをわかっていただけるかと思います。)
C++の規格はドラフト版がソースコードまで公開されているのでどうぞご参照ください。
ISO発行直前のドラフトがしっかりタグを打たれているはずです。
ちなみに、一番大きいライブラリはiostreamだったはずでSTLではない扱いされることが多いやつです。
クラス数というオブジェクト指向言語のみに適用できる指標もあてになりません。(ファイルの大きさ的にutilities.texですが、これはいろんなライブラリが混ざってるので単体として扱いません)
js関係は、ブラウザ向けに書くときはMDNの方も参照しますし、node.jsならそちらのリファレンスを参照します。
他の言語の事情はそれほどわからないので特に述べませんが、うちわけも見ずに乱暴にページ数だけで比較するのは疑問に感じます。
@take_cheeze さん
私もこれが絶対に何か確実な指標であるとは考えていません。単に、目で見える形の、誰でも把握できる形での一つの指標に過ぎないと思っています。ちょっと誤解が無いように、強調や表現を改めました。やり方が乱暴すぎるという点は否めませんが、単純な方法として有効だと思っています。
もっとわかりやすくて、誰でも目に見える形で、比較する方法があれば、ぜひ記事にして欲しいです。
@hsmt108 さん
Revised7 Report on the Algorithmic Language Scheme は88ページのようです。ただ、もっと少ない仕様自体が少ない言語というと、Brainfuck、Lzay K、純LISPあたりなら1ページに収まるかと思います。