PythonとRubyは、構文の正しさや厳格な階層性よりも、シンプルさとプログラマーに高速に物事をこなす能力を与えることに重点を置いた新世代の高レベル言語の最良の例です。
まず類似点から。どちらも高レベルのオブジェクト指向言語です。
どちらも対話型シェル、標準ライブラリ、Linux, Unix, Windows, その他のオペレーティングシステムでのマルチプラットフォームサポート、永続性のサポートを提供しています。
両言語ともウェブ開発にも優れており、それぞれの言語が持つ専用のウェブフレームワークである Django for Python と Rails for Ruby を利用すればなおさらです。
とはいえ、Web 開発ツールとしては Django-Python よりも Ruby on Rails の方がやや人気があります。Python は学術的、科学的な分野でより好まれています。
しかし、それを超えて、両者にはいくつかの大きな違いもあります。
驚くべきことに、Pythonには熱狂的な支持者と同様に熱狂的な反論者がいて、その結果、侮辱やアド・ホミニー攻撃、さらにはゴッドウィンの法則にまで発展した炎上戦争が起こっています。
ここでは、客観的な評価を掘り下げ、それぞれの言語ができること、できないことを解説します。
Ruby(ルビー)とは
Rubyは1995年に著名な “Matz “松本幸弘氏によって作られ、C、Perl、Java、C++の影響を受けています。
Rubyではすべてのものがオブジェクトになります。Ruby (on Rails) を使って作られた有名なサイトには、Twitter、Hulu、Shopify、Grouponなどがあります。
当初から、Rubyのエートスは常に表現力、力強さ、そして優雅さにあります。Rubyの熱心な信者たちは、その「最小驚愕の原則」、つまり言語のコードは常に開発者にとって可能な限り混乱を起こさないようにすべきだという信念でRubyを愛しています。この記事では、Rubyのエレガンスと表現力がJavaの古風なやり方に対してどのように対抗しているのか、いくつかの優れた例を紹介しています。
この指針となる原則は、同じことをするのに複数の方法があるというPerlの哲学をRubyが継承していることに自然につながっています。これが後述するPythonとの大きな違いです。これは、1つのメソッドが複数の名前を持つことができることを意味し、初心者にとっては混乱を招く可能性があります。
Rubyの優れた機能としてよく言われているのが、ブロックの利用です。ブロックとは、プログラムの中で一つの単位として扱われる一級のオブジェクトのことです。
この能力は、特に他の組み込みの得意分野である関数型プログラミングやラムダの利用と組み合わせることで、この言語を非常に強力なものにしています。
また、RubyはOOPの概念を極限まで追求しています。Rubyではすべてのものがオブジェクトであり、グローバル変数も実際にはObjectSpaceオブジェクトの中で表現されます。クラスやモジュールはそれ自体がオブジェクトであり、関数や演算子はオブジェクトのメソッドです。
- ブロックの使用
- 機能的なプログラミング
- フラグメンテーション
- ハッシュ可能/非ハッシュ可能タイプ
- 可換文字列
Python(パイソン)とは
Python は 1991 年に Guido van Rossum によって作成され、C/C++, java, Lisp, Perl, ICON といった多数の言語に触発されています。Pythonで作られた有名なウェブサイトには、Google、Dropbox、Reddit、Youtubeなどがあります。
大胆でやや冒険的な性質を持つRubyとは異なり、Pythonはやや保守的です。PythonはRubyの「何かをするための多くの方法」を嫌っていますが、これはRubyがPerlやPHPのような言語と共通している考え方です。その結果、レイアウトやインデントに厳しい言語になってしまい、使うべきホワイトスペースの量さえも増えてしまいます(!)。しかし、この厳格な哲学の結果、Pythonは非常に読みやすく、学習しやすいものになっています – 実際、多くの学校や大学でPythonが教材として使われています。Pythonの構文は非常にシンプルで、覚えることはほとんどないので、初心者には最適です。
また、Pythonは豊富なライブラリとOOの性質を誇っていますが、これはRubyのような「純粋な」ものではなく、C++のオブジェクト指向に似ています。PythonがRubyよりも優れている点を以下に挙げます。
- より良い名前空間の扱いとモジュールの使用
- イテレータの中央使用
- 内部機能
- データ構造の豊富なセット
RubyとPython、WEB開発はどちらが良い?
Web開発は、RubyとPythonが競い合う主要な分野の1つであることに変わりはありません。確かに、サーバースクリプト、エンタープライズアプリ、モバイルアプリ、そして今では機械学習などがありますが、これらの言語の伝統的なユーザーはウェブ開発者でした。ウェブアプリケーションの分野では、良くも悪くもRuby On Railsのおかげで、Rubyがより多くのプレイヤーを支配してきました。Rubyの柔軟性は、同じことを達成するための複数の方法を可能にするという哲学によって完全に促進されており、ウェブ開発者にとっては恩恵となっています。1つのシンプルな方法が誰にでも通用すると考えたくなりますが、ウェブ開発者のユースケースがこれほどまでに多岐にわたっている場合、複数のアプローチを繁栄させるのは現実的なことなのです。この場合、Rubyの成功はC++の成功を彷彿とさせます。C++は、どのチームでも使用したい言語のサブセットを選択できるため、非常に評判の悪い言語ですが、これほど広く成功しています。
Ruby On Railsはステロイド上のRubyのようなもので、舞台裏でのコード生成やサーバー側のメタプログラミングなど、より堅苦しい言語コミュニティのコーダーが眉をひそめるような広範囲なものが用意されています。実際、Python の国の Django が Rails MVC のアプローチをエミュレートしたときもそうでしたが、すぐに Pythonistas からの反発を受けました。Python プログラマや Django がシンプルさを追求したのに対し、Ruby On Rails はパワーと柔軟性を追求しました。確かに、複雑になることもありますが、その柔軟性はウェブ開発者にとって貴重なものであることが証明されています。これにより、Railsは「最先端」のスタートアップ、特にB2Cプラットフォームを開発する企業にとってほぼ通過儀礼となり、Airbnb、Twitter、Githubなど数え切れないほどの大成功を収めています。Railsの開発は非常に速く、生産性が高く、アーリーステージのスタートアップでは、コアとなるROR開発者数名以外の技術スタッフがほとんどいなくても、柔軟に反復作業を行うことができます。Rubyはまた、Chefのようなツールがスクリプト言語の表現力をフルに活用しているため、devopsでも成功しています。
このことは、Pythonがウェブ開発において怠け者であることを意味しているわけではありません。Pythonは独自のトリックを持っています:スピードと超大規模なエコシステムです。PythonはRubyよりも速いという認識がありますが、これはしばしばチームがWeb開発においてRubyよりもPythonを好むように導いてきました。Rubyコミュニティはこのことを痛感しており、Rubyは何年にもわたって速くなってきました。ベンチマークでは、RubyはPythonと同じくらいの性能を持っています。しかし、Ruby コミュニティにとってはそれだけでは十分ではありません。Ruby バージョン 3 は Ruby 2 よりもずっと速くなるように特別に計画されており、指摘すると、Python3 よりもずっと速くなることを目指しています。どちらにしても、戦いは続いています。
RubyとPython、オープンソースコミュニティはどちらが大きい?
数字ではPythonが圧倒的な優位性を持っていますが、Pythonが汎用的なプログラミング言語であることを考えれば、それは予想通りです。そのシンプルさと初心者に優しいセマンティクスにより、Pythonは想像されるコンピューティングのあらゆる分野に深く浸透しています。数字がそれを物語っています。Pythonの開発者数は世界中で推定820万人で、Rubyの推定180万人の約4倍です。Pythonのコミュニティはこの点ではRubyを凌駕しています。
しかし、Rubyのコミュニティがどれだけ情熱的であるかを知っておくのは良いことです。これは表面上に見える以上の価値があります。技術的な分野では、単なるコミュニティの規模が、コミュニティの情熱によって矮小化されてしまうことがあります。ニッチなコミュニティで評価されているユニークな機能を持つ言語には、非常に熱心な信者がいることがあります。Haskell、O Caml、Elixirなどの関数型言語はその良い例です。これらの言語には小さなコミュニティがあり、何年も前から存在していましたが、これらの言語が消滅したり、コミュニティに嫌気がさしたりしたわけではありません。むしろ、ウォール街の銀行で難解なデリバティブ計算をしていようが、アカデミアであろうが、これらの言語の支持者はさらに深く掘り下げており、これらのはるかに小さなコミュニティには多くのダイナミズムがあります。この点ではRubyのコミュニティは彼らによく似ています。
それでも、数は重要であり、科学的コンピューティング、ゲーム開発、ウェブ開発、その他すべての分野にまたがる最大かつ最も多様性のあるコミュニティを望むなら、PythonはRubyを圧倒しています。Githubでは、Pythonは29,000以上のスター、13,000のフォーク、1,100のリポジトリウォッチャーを持っています。Rubyの場合は、スター数16,500、フォーク数4,400、ウォッチャー数1,200となっています。さらに重要なことに、Python の貢献者は 1,133 人であり、Ruby の 182 人に対して、Python は 1,133 人です。繰り返しになりますが、Rubyの小規模なコミュニティは非常に緊密に結びついており、非常に情熱的なので、あなたは自分の責任で彼らを見捨てることになります。Pythonのコミュニティは、技術的に焦点を当てている異なる分野の人たちの交配から利益を得ており、言語が適用される職種や分野の多様性を高めています。当然のことながら、Pythonは一般的な開発者の関心が広く定義されているRubyに大きなリードを持っており、仕事、それを使用しているチーム、および他の使用統計と同様に。
RubyとPython、機械学習分野ではどちらが有利?
データサイエンスと機械学習はまだ始まったばかりですが、ビッグデータから人工知能(AI)、ディープラーニングに至るまで、データサイエンスの持つパワーの重要性に世界が気付きつつあります。データサイエンス、特に機械学習では、機械が人間のような意思決定をしたり、データから「学習」したりすることで、目が回るほど幅広い問題を時間をかけて解決することができるようになります。多くの価値が解き放たれており、当然のことながら、グーグルのようなテック大手から小規模なスタートアップまで、企業はこの有利な分野で躍進しています。これはPythonの最も重要な成果の領域であることが証明されています。
機械学習の比較は、Pythonと比較した場合、どの言語にとっても悪夢のようなシナリオです。実際、データサイエンスの世界では、特にアカデミアでは、この分野でのRubyとPythonの比較は、Rubyの粗雑な解雇を超えるものではありません。もしRubyがWeb開発で輝いているとすれば、Pythonはデータサイエンスと機械学習の分野を所有していることになります。Rubyは機械学習のプログラミング言語のトップ5にも入っていない。ここではPythonが首位に立っており、トップ5の機械学習言語は以下のようになっています。
- Python – データサイエンティストの57%が使用しており、トップの座を占めているが、業界の他の推計では70%に近い。
- C++ – データサイエンティストの44%が何らかの形で使用しており、2位にランクインしています。
- Java – 3位
- R – 4位
- JavaScript – 5位、データサイエンティストの31%が言語を使用している
機械学習の上位3言語、Python、C++、Javaは、本格的な機械学習の大部分を占めており、データサイエンティストの間では、わずかに異なる濃度で使用されていますが、それらの間では多くの重複があります。上位10位にランクインしている他の重要な機械学習言語は、Julia、Scala、Ruby、Octave、MATLABである。しかし、これらの言語のデータサイエンティストの間での利用率はそれぞれ5%未満である。これは、これらの言語が機械学習に向いていないと言っているわけではない。JuliaやOctaveのデータサイエンティストが指摘するように、これらの言語はPythonよりもさらにハードコアなデータサイエンスの計算を解くことを目的として作られています。しかし、Pythonはデータサイエンスの分野で早くからリードしており、巨大なコミュニティがあり、信じられないほどの汎用性、シンプルさ、大規模なチームでの作業性を持っていました。これらの要因により、機械学習では特に外れにくくなっています。もしあなたやあなたのチームがヘビーデューティーな機械学習を行うのであれば、PythonはRubyよりも人気があるべきであることは言うまでもありません。
RubyとPython、フレームワークとライブラリ
特に活発なコミュニティを持つオープンソースのプログラミング言語である Ruby と Python は、どちらも驚くほど完全なエコシステムを持っており、オープンソースのエートスの力を示すライブラリがあります。
どちらのプログラミング言語でも、自由に利用できるオープンソースパッケージがあれば、想像できることは何でも実現できます。Ruby の場合、プログラムの大部分は RubyGems で、Python の場合は Python Package Index (PyPI) で配布されています。
これらを補完する他のソフトウェア配布システムも存在し、双方に優れたツールが存在します。これはRubyとPythonの共通点であり、多くの点で異なるコミュニティが、オープンソースへのアプローチをより身近なものにしています。
ここでは、Ruby エコシステムのトップライブラリをいくつか見てみましょう。
- Web App Frameworks – rails, sinatra, rack
- Web servers – puma, unicorn
- Database adapters – pg, mysql2
- Ruby core extensions – activesupport, hashie
- Concurrent processing – eventmachine, concurrent-ruby
- Testing tools – rspec, capybara, minitest
Python の場合、トップライブラリの名鑑では、Python プログラミング言語がデータサイエンスに関連する分野に顕著な焦点を当てて本格的に進出してきた、より幅広い分野を紹介しています。
- Django (web framework)
- Numpy (data science)
- Pandas (data science)
- Scipy (data science)
- Theano (data science)
- Flask (web framework)
- Matplotlib (data science)
- Keras (machine learning, deep learning)
- TensorFlow (machine learning, neural networks)
- Scikit-learn (machine learning)
- PyQT (graphical user interface, GUI development)
- wxPython (GUI development)
- Tkinter (GUI package)
- Pygame (video game development)
Pythonの広大なデータサイエンスのフットプリントは成長を続けており、そのデータサイエンスライブラリは、多くの意味でその点でリードするライブラリであり、Python開発者の間でユーザーの採用が増加しています。
RubyとPython、まとめ
両方の言語の陣営が騒がしい議論をしているにもかかわらず、一方の言語が他方の言語よりも全体的に「優れている」とは言えません。
それぞれの言語には、その機能や同じ分野の他のユーザーからのサポートのおかげで、より適した分野があることは明らかです。Rubyの場合はRailsフレームワークを使ったWeb開発であり、Pythonの場合は科学的・学術的なプログラミングです。そして、それぞれには、他の言語にはない、あるいはうまくできない機能や能力があります。
また、この2つの言語は根本的に異なる哲学を唱えています。Rubyは開発者に好きなことを自由にさせ、邪魔にならないようにすることに焦点を当てています。
Pythonは、何かをするための正しい方法を一つだけに絞ることで、学習のしやすさと使いやすさを主張しています。Pythonの開発者はやや保守的で、変化よりも安定性を重視し、開発や新機能はゆっくりと追加されていきます。Rubyの開発者は変化と自由を重んじるようです。例えば、Railsフレームワークは常に変化しており、実際、Pythonの変更や新機能の多くはRubyで最初にテストされています。
なお、Rubyの将来性については以下でも解説されているので、興味があれば確認してみてください。