14

PerlユーザーがRubyユーザーに伝えたいこと ~ PerlとRubyの比較を通して

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は、言語機能が大きくなり続けています。

一方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を攻撃していたとしても、その人たちは、本当の意味での加害者ではありません。

もっと上流から「権威と一時的な札束」を使って、エンジニアを分断させて、自分たちが独占的な利益を得るために、悪意を流している大元がいます。

(まだまだ続くよ、どこまでも。週末まで、連続、加筆です)

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away