RubyとかPerl について(これは古い日記です)

数週間前に、Perlでも習得してみようかと思った。
Perlは実はB1の頃にちょっと齧ってて、実はCやC++Javaを学ぶより前に手をつけた言語だったりして、Cを勉強してるときも、なんかCって構文がPerlに似てるなあとか、PerlがCに似てるのに逆のことを思ってたりしたのだが、その後Perlは全然使わなくなり、あまり深いところまで知る前にやめてしまった。その後、B4になってRubyを学んでRuby信者となったため、これがあればPerlは不要じゃん、ということになり、全くPerlについては興味を抱けないようになってしまった。

話が見えにくいので、俺の言語遍歴についてまとめておく。

  • B1 講義でPascalを学ぶが、今はほとんど忘れたので使えない。
  • B1 12月頃〜3月頃 Perlを齧る、がその後ほとんど忘れていた。
  • B1 3月頃〜 B2 5月頃 Cを覚える。
  • B2 4月頃〜 C++をはじめる。
  • B2 夏休み頃?Windows APIプログラミングをちょっとやる。
  • B2 秋か冬頃?〜 Java をはじめる。
  • B3 の頃?MFCをやってみる。
  • B3 の頃?Smalltalkをやってみようと思ったが、環境構築だけで疲れてしまった。
  • B4 の頃?Common LispSchemeをやってみる。
  • B4 Dをやってみようと思ったが、ほとんど手を付けなかった。
  • B4 の終わり頃?〜 Ruby を覚える。
  • M1 Pythonを齧ってみるがほとんど身になっていない。
  • M1 C# を齧ってみるがその後使わなかったので忘れる。
  • M2 C# をもう一度やってみる。

Perlについて抱いている印象は、とにかく汚い、自分が数週間前に書いたコードが読めなくなる、言語仕様がなんかもうむちゃくちゃとしかいいようがないというか、開発者が正気だったとはとても思えない、後付のオブジェクト指向とかスレッドの機能が元からある機能と整合性がとれておらず、もうどうしたらいいかわからない言語、といった感じである。実際Perlについては現時点でもあまり詳しいとは言えないため、ここまで扱き下ろしていいものかとは思うが、とにかく嫌いな言語である。
それに加え、同じスクリプト言語であるRubyの明らかな優位性を前にしてしてみれば、これからPerlを学ぶ動機というものは皆無といってもいい。

それなのに何故今更Perlをやろうと思ったかというと、まあいろいろ理由はあるのだが、その一つは、Perlがある程度普及している以上、個人的に嫌いであるというだけの理由では、使わないことの言い訳にはなっても、使えないことの言い訳にはならないだろうと思ったからである。それに新たなパラダイムの言語を学ぶわけでなければ、言語の習得にそれほどコストはかからないだろうとも思った。
ある有名なプログラマは、Perlの600ページ程度の入門書を2日間、12時間未満の時間で読了し、Perlを覚えたとWeb上に記述していたが、さすがに凡人である自分にはそれは無理だとしても、学ぶのに数ヶ月とかのオーダで時間がかかるはずはない。

それでPerlの入門書をちょっと探してみたが、有名なところだとプログラミングPerlという巻に分冊された本がある。さすがに両方あわせると結構なページ数で、これはちょっときついかも、と思ったが、とりあえず本屋に行ってみた。が、下巻しか置いていない。わざわざAmazonで注文して読むほどPerlがやりたいってわけじゃないし、どうしようかと思ったが、とりあえず別の初めてのPerlという本を買っておくことにした。
この入門書はプログラミングPerlと比較すると、おそらく1つか2つくらいグレードが下がると思うが、本としては悪くないようなので、まあとりあえずこの本を12時間は無理だろうが、数日以内に読了して、必要に応じてプログラミングPerlを買えばいいか、という結論に達したためである。

で、本を読んでみたのだが、やはり嫌いな言語の習得というのは辛いものがある。数ページ読む度に、この構文とかルールありえねえ、とか突っ込み入れたくなるし、Perlを今積極的にやる理由が皆無であることもあり、モチベーションと言う奴が全くあがらない。拷問のようだ。それにある程度予想はしていたし、入門書である以上仕方がないのだろうが、この入門書は基本的な部分の記述に終始し、高度な機能については別の文献を参照してね、というスタンスをとっているのが気に入らない。そこが最も知りたい部分なのだが。結局3日くらいで200ページくらい読んだところで止まっている。というか、Perlよりも、どうすれば12時間で600ページ読めるのか知りたい。

改めてPerlをやってみて思ったが、上では新たなパラダイムを学ぶのでなければ、というように書いたが、この言語はバッドノウハウの塊みたいなものなので、実際習得するにはかなりの時間がかかるのかもしれない。本質的でない部分で。やはりPerlは嫌いだ。

Rubyの利点については、純粋なオブジェクト指向言語であるという点が挙げられる。なんでもかんでもオブジェクト指向にすればいいというわけではないとは思うが、実際、これがRubyの書きやすさにつながっているように思う。

例えばPerl等で配列を逆順にソートする場合(ソートしてから逆順にする場合)、

# Perl
reverse(sort(3, 2, 7));
# または
reverse sort 3, 2, 7;

となるものが、

# Ruby
[3, 2, 7].sort.reverse

と書ける。左から自然に読める。つまり、他のOOでない言語で、xに対してfをしてgをしてhをしたい、といった場合、

# not OO language
h(g(f(x)))  # f, g, h はグローバル関数

となるものが、

# Ruby
x.f.g.h     # f, g, h はメソッド

と書ける。xはなんでもよい。

"10".to_i  # 文字列 "10" を整数に変換
10.to_s    # 整数 10 を文字列に変換
10.class   # 10 のクラス(型)を調べる
3 + 5      # 3.+(5)と同じ、+はメソッド、5は引数

単純な数値でもオブジェクトであるため、数字に対して自然に操作を行える。この言語内のあらゆる要素がオブジェクトである、といった性質を持ったオブジェクト指向言語は少ない。まあSmalltalkなんかはもっと凄いが、C++Javaでもこういう性質は持っていない。特にJavaのint等のプリミティブ型の扱いは酷い。完全に差別されている。コレクションにそのまま入れることができない等。C#になれば幾分ましなのだが。
C++にしてもそうだが、Perl, PHP等の、後からオブジェクト指向の機能を付けました、といった言語は、自分でクラスを作ってオブジェクト指向ができますよ、といった感じなので、Rubyのような言語自体がはじめからオブジェクト指向である言語とは全く違う。
C++, Perl等はOOライブラリを使用でき、クラスを自作できるが、言語自体がOOでない。
Rubyは言語自体がOOであり、自分でクラスを作ることが全くなくても、オブジェクト指向の恩恵を受けることができる。
こういった意味で、俺から見れば中途半端で不完全としか思えないPerlPHPのような言語が世の中を席巻している状況が非常におもしろくない。ちなみにPHPは全然知らないわけですが。しかしそれでも、ユーザ数やコミュニティ、ライブラリの充実等のバックグラウンドの差を除いて、Rubyより優れた点があるようには思えない。

ほんとはもっといろいろ例を挙げようと思っていたのだが、なんだか長くなりすぎたのでこれくらいにしておく。言語オタの戯言みたいになってしまった。脳内定義では言語オタクは10以上の言語を扱えるので、5, 6個程度の言語しか使えない自分は言語オタクの範疇には入らないはずなのですが。

  • 好きな言語: C#, D(あまり詳しくはない), C++, Ruby, Lisp(Common Lisp, Scheme)
  • 中立(よく知らないとも言う): Python(おそらくRubyに最も近い)
  • 嫌いな言語: C, Java, Perl, PHP(よく知らないが、多分これは駄目だと思う)