Perlユーザーとして、PerlとRubyを比較を通して、Rubyユーザーに伝えたいことを実名で書きます。匿名でPerlに対して書かれたネガティブな信頼性の低い記事がネット上に、あふれているからです。
「RubyからPerlへ」という記事でPerlの価値を落とさないで
Rubyの公式ドキュメントには、「間違いなく複雑」というPerlに対する誤解を招くネガティブなメッセージが含まれています。
Perlはすばらしい言語です。ドキュメントもすばらしいし、Perlコミュニティもすばらしいコミュニティです。 しかし、言語はかなり大きく、間違いなく複雑です。 RubyからPerlへ
Rubyの実装には、複雑さが少なく、Perlには多いような印象を、初見のユーザーに対して与えています。
Rubyの言語実装は小さく、Perlは大きいような印象を与えています。
Rubyの実装の複雑さ
ひとつの例として、PerlとRubyのGCの実装について考えてみましょう。
Perlは、リファレンスカウントGCと呼ばれるGCの実装を持っており、Rubyは、世代別GCというGCの実装を持っています。
さて、リファレンスカウントGCと世代別GCは、どちらの実装が複雑でしょうか。
一般的に理解されていることを、土台にすれば世代別GCのほうが、実装が複雑です。
リファレンスカウントGCのほうが、シンプルなのです。
このような一つの面を取り上げてみても、Rubyの公式ドキュメントが、Perlを複雑と一方的に語っているのは、不公平といえるでしょう。
Rubyのドキュメントは、Rubyが、複雑さの側面を持っているのに、まるでPerlだけが、複雑であるかの印象を与えています。
Rubyの言語の大きさ
Rubyは、バージョンを追うごとに、新機能が追加され続けてきました。Rubyは、言語機能が大きくなり続けています。
- Ruby 2.0 新機能
- Ruby 2.1 新機能
- Ruby 2.2 新機能
- Ruby 2.3 新機能
- Ruby 2.4 新機能
- Ruby 2.5 新機能
- Ruby 2.6 新機能
- Ruby 2.7 新機能
一方Perlは、2002年Perl 5.8の時代に、言語機能をたくさん追加していく方針を転換しました。「もし、必要な機能があれば、モジュール(ライブラリ)において実装する」そういう方針への転換です。
Rubyのドキュメントは、Perlについて、まったく反対のことを語っています。
Perlは大きくなる速度をゆっくりさせたのに対して、Rubyは、言語の大きさを着実に増しているのです。
言語の大きさに関して、Rubyの公式ドキュメントは、Perlに関する正しい事実をユーザーへ伝えていません。
CSVを処理するRubyとPerlのソースコード
「Perlの文法はクズのようだ」
Rubyユーザーの皆様は、そう思っておられませんか。
では、実際に、Perlの文字列処理でCSVを処理するコードを、実際に見てみませんか?
Perlで標準入力から受け取ったCSVデータを、入力して、出力するサンプル
ファイルあるいは、標準入力から受け取ったCSVデータを、入力して、出力するサンプルです。Windowsで日本語対応。
# Perlで標準入力から受け取ったCSVデータを、入力して、出力するサンプル
use strict;
use warnings;
use utf8;
use Encode 'encode', 'decode';
# コマンドライン引数、あるいは、標準入力から受け取る
while (my $line = <>) {
# Perlの内部文字列にデコード
$line = decode('cp932', $line);
# 改行削除
chomp $line;
# split関数で分割して配列に代入
my @items = split(/,/, $line);
# join関数でタブ区切りでつなげる
my $new_line = join("\t", @items);
# 標準入力に出力
print encode('cp932', $new_line) . "\n";
}
どうでしょう。世間でPerlが、言われているような、可読性が皆無のクズみたいなコードでしょうか?
それとも「うーん、まぁ、普通」という感じですか?
実行はコマンドライン引数から受け取って
perl script.pl foo.csv
あるいは、標準入力から受け取って
cat foo.csv | perl script.pl
ですね。
「あれ、Perlって、CSV処理するライブラリ、ついてないの。ついてないの小学生までだよねー」
なんて、思いませんでしたか?
Perlの標準ライブラリの設計は、CPANをブートストラップできる小さな構成です。
Perlのコア自体のライブラリを肥大化させず、Perlコア自体の開発者が、メンテナンスするコストを下げています。
Perlでは、CPANから、Text::CSVか、処理速度の速いText::CSV_XSを、ダウンロードすることができます。
RubyでCSVデータを、入力して、出力するサンプル
RubyのCSV処理のサンプルはこちら。Rubyには、最初からCSV処理ライブラリが、入っています。便利ですね。
require 'csv'
csv_data = CSV.read('member.csv', headers: true)
puts "start..."
File.open("intro.txt", 'w') do |file|
csv_data.each do |data|
intro_msg = "#{data["club"]}クラブ所属の#{data["age"]}歳、#{data["name"]}です。\n"
puts intro_msg
file.write(intro_msg)
end
end
puts "complete! See intro.txt."
Ruby CSVを扱うためのメモから引用させていただきました。ありがとうございます。
さて、PerlとRuby比べていかがですか?
Rubyの方が、10倍、きれいに楽しく書けますか?
それとも、まぁ、どっちもどっちでしょうか?
Ruby開発者からのPerlへの悪口はストップ
Rubyの作者のまつもとゆきひろ氏は、Perlのコアのコードを見て「Perlは私が見たソースコードの中で最悪のソースコードです。」と申しました。
また、PHPでは、プログラムはきれいに書けないとか、Javaではきれいに書けないとか、申しておりました。
Rubyのコミッター様のおひとりは、Perlに対して、PHPに対しても、Javaに対しても、C言語に対しても、攻撃を繰り広げておりました。
この方は「俺は、Rubyに対する批判もしているからOK」みたいな態度をとっておられますが、さて、いったいこれは、どうなのでしょうか。
読者の皆様は、Rubyは、過去に、全方位で、ネガティブキャンペーンを行っていたということを、知っておいてください。
RubyとPerlのWebフレームワークの比較
「Perlには代表的なWebフレームワークないしね」
そんな会話がRubyコミュニティで話されていませんか?
Rubyには「Ruby on Rails」と「Sinatra」という代表的なフレームワークがありますが、Perlには、何があるでしょう。
Rubyユーザーの皆様に知っていただくために、PerlのWebフレームワークをご紹介します。(50音順)
Amon2は日本の開発者が開発しているフレームワークです。
ちなみに、わたくし、Mojoliciousの開発チームに過去に参加していました。
Mojoliciousのテスティングフレームワークである、Test::Mojoは、わたくしが実装しました。
仲間とともにMojoliciousの日本語への翻訳もやっております。
Plack/PSGIというのは、RubyのRackに該当するミドルウェアです。
Perl/CGIは古いといわれ続けておりますが、実は、PerlのWebアプリ開発の主流は、CGIではありません。
Webサーバーを立てて、リバースプロキシ構成を使うのが、PerlのWeb開発の主流なのであります。
Rubyユーザーの知らないところで、PerlのWebフレームワークも発展しています。
またわたくしの開発しているCMSツールGiblogもWebサイト・ブログを作成するのに便利でございます。
Rubyのgemに該当するのは、Perlのcpan/cpanm
RubyにはRubyGemsというライブラリをWeb上に配置して、ダウンロードできる仕組みあります。
Perlにも、これに該当するCPANという仕組みがありますが、RubyGemsはPerlのCPANが発明され成功した後に、それを参考に作られたものです。
「RubyGemsすごい」は、「CPANすごい」にそのまま該当します。
Perlには、cpanの動作を軽くして、バージョン管理とCAPNに加えて、Githubからのインストールも可能なcpanmという優れたツールもあります。
RubyでBundlerを使ってバージョン管理できるように
cpanmを使えば、PerlのCPANモジュールのバージョン管理を行うことができます。
Rubyユーザーを攻撃するgo、python、JavaScript、Rustユーザー
Webのてっぺんでは、10年前から、ずっと同じことが繰り返されています。
Rubyに愛着があり、Rubyで開発しているユーザーに対して、go、python、JavaScript、Rustユーザーは、ネット上でネガティブキャンペーンを繰り広げております。
「Rubyはチームを幸せにしない。これからは〇〇」という言葉を、残してRubyを去っていきます。
Rubyで作った収益がでているサービスを、自分たちの言語で、リプレースしようと、狙っています。
かつて、Railsは、WebのてっぺんをRailsへの賛美で埋め尽くしました。今度はPythonがWebと書店のてっぺんを賛美で埋め尽くしております。
Perlゼミは、こういう不公平で、不健全で、不毛な状況を改善したいと思っております。
Rubyユーザーの皆様は、気持ちがわかってきたと思うので、Perlに対して、やってきたことをどうか反省してください。
プログラミング言語のそれぞれのユーザーは、実際は、本当の加害者ではありません。
PerlやRubyを攻撃していたとしても、その人たちは、本当の意味での加害者ではありません。
もっと上流から「権威と一時的な札束」を使って、エンジニアを分断させて、自分たちが独占的な利益を得るために、悪意を流している大元がいます。
(まだまだ続くよ、どこまでも。週末まで、連続、加筆です)