あけましておめでとうございます。
それはさておき。
RubyがC言語系、って言ってる人がいてビックリした。
RubyってC言語系プログラミング言語だったの?
Lispやってるヤツだと、RubyってLisp系だと思ってたんだけどなぁ(笑)。
「表現はPerl、中身はLisp」
それがRubyなんじゃないか。
確かに、例えばとあるIT系の会社が今現在プログラミング言語をデザインする場合。「既存のユーザー数に合わせて構文を既存の言語に似てるようにデザインする」って事はある。マーケティングの問題、ですな。
旧Sun MicrosystemsのJava、そしてMozillaのJavaScriptなんかがそうなんだけど、それらに比べてRubyが「C言語に似てるトコ」なんて特にあるのかしら。
そもそも、関数(メソッド)定義のdefは一体どこから来た?これはぶっちゃけ、define(定義せよ、の意)の略称なんだけど、C言語でdefineっつったらマクロ定義であって、関数定義ではない。
Rubyは別に「大手企業が開発したプログラミング言語」じゃない。どっちかっつーと作者のまつもとゆきひろ氏の趣味溢れる言語である。そして、まつもとゆきひろ氏はEmacs Lispハッカーだ。
かつてLispハッカーであるポール・グレアムが言語の力を証明する問題として、次の質問を投げた。
アキュムレータを生成する関数、すなわち、数nを取り、 「数iを取ってnをiだけ増加させ、その増加した値を返す関数」を返すような関数を書け。
Lisp系言語、Schemeだと次のように書ける。
(define (foo n)
(lambda (i) (set! n (+ n i))))
Rubyだと次のように書ける。
def foo(n)
lambda {|i| n += i}
end
見た目がendとカッコを除き、どことなく似てないだろうか?
(注: 実はRubyの場合、メソッドはファーストクラスオブジェクト、ではないので、上記のメソッドの実行方法にはちとコツがある辺りが・・・個人的にはLispそのものには劣る、と思ってる)
ところが一転して、C言語でこいつを書こうとすると・・・単純には恐らく「書けない」と言うのが答え。CはRubyのパワーと等価ではない。CはRubyをC系言語、とするにはおっそろしく非力なのである。
一転して、実はJavaScriptは「見た目をCに合わせてる」割にはこれを書ける。
function foo(n) {
return function (i) {return n += i;}
}
当然だ。JavaScriptは見た目はC言語系に似せてるが、実体はむしろLispに近い「Cの皮を被ったLisp」だからだ。
これを見ても「C系言語」なんて分類がそもそも意味を成さない事が分かるだろう。ハッキリ言ってC系言語なんざ、現存する中ではC++、Objective C、そして意図して作られたJavaくらいしか無いんじゃないか。構文を似せてる言語は多分他にもある(DとかgolangとかRustとか)。けど、「C系言語」と呼ぶにはそのパワーがあまりにもCとは乖離してる、ってのが実態だ。中身が全然違うのだ(それで言うと、実はC#もC言語系、と言うよりはむしろPascal系なんじゃないか...分からんけど)。
もし、百歩譲って、DやgolangやRustやC#を構文の類似から「C系言語」に含めるにせよ、Rubyの構文はJavaScriptのCへの類似性を認めても全然似てない。RubyはCで書かれただけ、でC系言語に含めるには無理がありすぎるのだ。
余談だけど、初見でendがあったせいで、Rubyはむしろ構文的にはPascalに似てるかも、とは思った事がある。endがあるだけ、なんだけどさ(笑)。
このend、もっと言うと、ブロックを表すbegin〜end、由来はALGOLと言う「仕様だけ存在した言語」が採用していたものだ(いくつか実装を試みられたが、仕様がデカすぎて、まともに実装出来なかった模様)。そのbegin〜endの存在理由が面白い。実は古のコンピュータでは{}と言う文字が殆どのキーボードに存在しなかった。
ところが、AT&Tのベル研(オリジナルのC言語を作ったトコだね)の中古コンピュータのキーボードには{}が偶然あった。ってなワケで、C言語の開発者達は、「自分たちで使う為だけに」C言語にbegin〜endの代わりに{}を導入したわけだ。つまり、全く他の端末との「互換性」なんか考えてなかった、と言う事になる。
Cの開発者達の述懐に依ると、「こんなにCが広まって使われる、なんて全く想定してなかった」との事だ。