エリック・マックス・フランシスはこう書いている:
「ブランドン・J・ヴァン・エブリイ」はこう書いています:
PythonよりもRubyの方が優れているのは何ですか?私は何かがあると確信しています。それは何ですか?Pythonの人ではなく、Rubyの人にこれを尋ねる方がはるかに理にかなっていますか?
目的に応じて、またはそうでない場合があります-たとえば、目的がPythonコミュニティの「社会学的研究」を含む場合、そのコミュニティに質問をすることは、他の場所に置くよりも、それに関する情報を明らかにする可能性が高くなります:-)。個人的には、前回のOSCONでDave Thomasの1日のRubyチュートリアルを喜んでフォローしました。シンタックスの違いの薄いベニアの下で、RubyとPythonが驚くほど似ていることに気付きます-ほぼすべての言語セットの中で最小のスパニングツリーを計算していれば、PythonとRubyが合体する最初の2つの葉になると確信しています中間ノード:-)。
確かに、Rubyでは、各ブロックの最後に愚かな「終わり」を入力するのにうんざりします(単にインデントを解除するのではなく)-しかし、:
Pythonの開始時に必要
な同等に愚かな入力を避けることができます各ブロック、それはほとんど洗浄です:-)。以下のような他の構文の違い@foo
に対して
self.foo
、またはPythonの対Rubyで例が高い重要性は、ちょうど私には無関係としてについて実際にあります。
他の人は間違いなくそのような問題に基づいてプログラミング言語を選択し、最もホットな議論を生み出していますが、それは私にとってはパーキンソンの法則の1つの例にすぎません(問題に関する議論の量は問題の量に反比例します実際の重要性)。私が重要だと思っている構文の違いの1つは、Pythonに有利なことですが、他の人々は間違いなくその逆を考えるでしょう-「パラメーターをとらない関数をどのように呼び出すか」です。Python(Cなど)で関数を呼び出すには、常に「呼び出し演算子」を適用します-呼び出しているオブジェクトの直後に後かっこ(これらの後かっこ内に、呼び出しで渡した引数を入れます-if引数を渡していない場合、括弧は空です)。これにより、特別な場合、例外、アドホックルールなどを伴わずに、あらゆるコンテキストで、オブジェクトへの参照を意味するものとして、演算子を含まないオブジェクトの単なる言及が残されます。(Pascalのような)Rubyでは、関数WITH引数を呼び出すには、引数(通常は括弧で囲みますが、常にそうではありません)を渡します-ただし、関数が引数を取らない場合は、関数を暗黙的に呼び出すだけです。これは多くの人々(少なくとも間違いなく、以前のプログラミングの経験がPascal、またはVisual Basicなどの同様の「簡易呼び出し」を持つ他の言語であった人々)の期待に応えることができますが、私にとっては、オブジェクトの単なる言及は、オブジェクトへの参照、またはオブジェクトの呼び出しを意味する場合があります。オブジェクトのタイプによって異なります。そして、単に言及するだけではオブジェクトへの参照を取得できない場合、明示的に「これへの参照を与えてください、呼び出してはいけません!」を使用する必要があります。それ以外の場合は必要ない演算子。これは、関数(またはメソッド、または他の呼び出し可能なオブジェクト)の「ファーストクラス」に影響を与え、オブジェクトをスムーズに交換できる可能性に影響を与えます。したがって、私にとって、この特定の構文の違いはRubyに対する深刻なブラックマークです-しかし、私は他の人がそうでないことを理解していますか?構文の下で、基本的なセマンティクスのいくつかの重要な違いに入ります。たとえば、Rubyの文字列は可変オブジェクト(C ++など)です。Pythonでは(JavaやC#のように)可変ではありません。繰り返しますが、主にすでに慣れていることで判断する人は、これがRubyにとってプラスだと思うかもしれません(もちろん、JavaやC#に慣れていない限り:-)。私は、不変の文字列は素晴らしいアイデアだと思います(そして、Javaが独立して、すでにPythonにあったアイデアを再発明したことは驚くことではありません)。 (理想的には、Java独自の「文字列バッファー」よりも使いやすいもの)。そして、Javaを勉強する前に、関数型プログラミング言語を除き、親しみがあるためにこの判断をしません。主に既に慣れ親しんでいることで判断する人は、これがRubyにとってプラスだと思うかもしれません(もちろんJavaやC#に慣れていない限り:-)。私は、不変の文字列は素晴らしいアイデアだと思います(そして、Javaが独立して、すでにPythonにあったアイデアを再発明したことは驚くことではありません)。 (理想的には、Java独自の「文字列バッファー」よりも使いやすいもの)。そして、Javaを勉強する前に、関数型プログラミング言語を除き、親しみがあるためにこの判断をしません。主に既に慣れ親しんでいることで判断する人は、これがRubyにとってプラスだと思うかもしれません(もちろんJavaやC#に慣れていない限り:-)。私は、不変の文字列は素晴らしいアイデアだと思います(そして、Javaが独立して、すでにPythonにあったアイデアを再発明したことは驚くことではありません)。 (理想的には、Java独自の「文字列バッファー」よりも使いやすいもの)。そして、Javaを勉強する前に、関数型プログラミング言語を除き、親しみがあるためにこの判断をしません。不変の文字列は素晴らしいアイデアだと思います(そして、Javaが独立して、すでにPythonにあったそのアイデアを再発明したことは驚くことではありません)。理想的には、Java自身の「文字列バッファ」よりも使いやすいものです。そして、Javaを勉強する前に、関数型プログラミング言語を除き、親しみがあるためにこの判断をしません。不変の文字列は素晴らしいアイデアだと思います(そして、Javaが独立して、すでにPythonにあったそのアイデアを再発明したことは驚くことではありません)。理想的には、Java自身の「文字列バッファ」よりも使いやすいものです。そして、Javaを勉強する前に、関数型プログラミング言語を除き、親しみがあるためにこの判断をしません。すべてのデータは不変であり、私が知っているすべての言語には変更可能な文字列がありましたが、Javaで不変文字列のアイデアを初めて見たとき(Pythonを学ぶ前に十分に学んだ)、すぐに優れた、非常に適していると思いました高度なプログラミング言語の参照セマンティクス(マシンに近い言語やCなどのアプリケーションから遠い言語に最適な値セマンティクスとは対照的に)ファーストクラスの組み込み(およびかなり重要)データ型。
Rubyには基本的なセマンティクスにいくつかの利点があります。たとえば、Pythonの「リストとタプル」の非常に微妙な区別の削除です。しかし、ほとんどのスコア(私がそれを保持しているように、シンプルで大きなプラスと微妙な、巧妙な区別は顕著なマイナス)は、Rubyに対してです(例えば、a..bとa。の表記で、閉じた間隔と半分開いた間隔の両方を持っています) .b [誰がどちらが明らかであると主張したいのですか?-)]、愚かです-もちろん私見です!)。繰り返しになりますが、言語の中心に多くの類似しているが微妙に異なるものがあることを考えると、マイナスではなくプラスになります。もちろん、これらの「逆」を数える方法から数えます:-)。
二つの言語がある考えにこれらの比較に惑わされてはいけない
非常に違う、気に。そうではありません。しかし、「capelli d'angelo」と「spaghettini」を比較するように頼まれた場合、これらの2種類のパスタは誰とでも区別がつかず、あなたが準備するかもしれないどんな料理でも交換可能であることを指摘した後、私は必然的に長さと直径の違いが微妙にどのように変化するか、ある場合にはストランドの端がどのようにテーパー状になり、他の場合にはテーパー状にならないかなどの顕微鏡検査に移ります。アンジェロは、あらゆる種類のスープのパスタとして使用されますが、パスタシュータとしてスパゲッティーニは、このような細長いパスタの形に適したソース(オリーブオイル、ニンニクのミンチ、赤唐辛子のミンチ、細かく砕いたアンチョビなど)たとえば、ニンニクと唐辛子を刻むのではなくスライスした場合、スパゲッティニのより薄いエバネッセンスではなく、スパゲッティのより健全なボディを選択する必要があり、アチョビューを控えて代わりに新鮮な春のバジルを追加することをお勧めします[または、私は異端者です...!-ライトミント...]葉-料理を出す直前の最後の瞬間)。おっと、申し訳ありませんが、それは私が海外に旅行していて、パスタをしばらく食べていないことを示しています。しかし、アナロジーはまだかなり良いです!-)そして、achoviewを控えて、代わりにいくつかの新鮮な春のバジルを追加することをお勧めします[または-私は異端者です...!-ライトミント...]葉-料理を出す直前の最後の瞬間)。おっと、申し訳ありませんが、それは私が海外に旅行していて、パスタをしばらく食べていないことを示しています。しかし、アナロジーはまだかなり良いです!-)そして、achoviewを控えて、代わりにいくつかの新鮮な春のバジルを追加することをお勧めします[または-私は異端者です...!-ライトミント...]葉-料理を出す直前の最後の瞬間)。おっと、申し訳ありませんが、それは私が海外に旅行していて、パスタをしばらく食べていないことを示しています。しかし、アナロジーはまだかなり良いです!-)
そこで、PythonとRubyに戻って、2つの大きな問題に取り組みます(適切な言語の観点から、ライブラリや、ツールや環境などのその他の重要な付属品、各言語の埋め込み/拡張方法など)とりあえず、それらはいずれにせよ各言語のすべての実装に適用されるわけではありません。例えば、Jython対Classic PythonはPython言語の2つの実装です!):
RubyのイテレーターとコードブロックとPythonのイテレーターとジェネレーター。
Pythonの広大しかしVS -すべて内蔵のものを含む任意の既存のクラスを、「再度開く」、および実行時にその動作を変更する機能など、RubyのTOTAL、奔放な「ダイナミックさ」、 有界
既存の動作を変更することはありませんダイナミシティ、組み込みクラスとそのインスタンス。
個人的に、私は1をウォッシュと見なします(違いは非常に深いので、どちらか一方に近づき敬意を払う人々を簡単に見ることができますが、私の個人的なスケールではプラスとマイナスがほぼ均等に増えています)[2]重要な問題-Rubyを「いじくり回し」にはるかに適したものにする問題ですが、Pythonは大規模な実稼働アプリケーションでの使用にも同等に適しています。面白いことに、両方の言語は他のほとんどの言語よりもはるかに動的であるため、POVとの重要な違いは最終的にはこれに依存するはずです-この点でRubyは11になります(参照もちろん、ここは「Spinal Tap」です)。Rubyでは、私はそれができます!つまり、組み込みの文字列クラスを動的に変更して、
a = "Hello World"
b = "hello world"
a == bの場合
「等しい!\ n」を印刷
そうしないと
「異なる!\ n」を印刷
終わり
「等しい」を印刷します。Pythonでは、それを行う方法はありません。メタプログラミング、実験的フレームワークの実装などの目的のために、Rubyのこの驚くべき動的能力は非常に優れています
魅力的。しかし、多くの人々によって開発され、さまざまなソースからのすべての種類のライブラリを含むさらに多くによって維持される大規模なアプリケーションについて話している場合、クライアントサイトでの生産に行く必要があります...まあ、私はしたくないとても動的な言語です。ありがとうございました。私は、文字列が異なることに依存している他の無関係なライブラリを無意識に壊すライブラリのアイデアを嫌います-それは一種の深くて深く隠された「チャンネル」であり、LOOKが分離し、SHOULD BEが分離し、死を綴る大規模プログラミング。モジュールを他の「ひそかに」の動作に影響させることにより、
そのような大規模なアプリケーションにRubyを使用しなければならなかった場合、コーディングスタイルの制限、多くのテスト(何かが変更されるたびに再実行されます-まったく関係のないものでも...)などに依存しようとします。この言語機能の使用を禁止します。しかし、私の意見では、最初に機能を持たないことはさらに良いです-特定の数のビルトインを「固定」できる場合、Python自体がアプリケーションプログラミングのためのさらに良い言語であるように、私はそれを知っていました、たとえば、
len("ciao")
4です(誰かlen
が__builtins__
モジュール内の名前のバインディングを変更したかどうかについて潜在的に心配する必要はありません...)。最終的には、Pythonがその組み込み関数を「特定」することを願っています。
ただし、ビルトインの再バインドは非推奨であり、Pythonのまれなプラクティスであるため、問題は軽微です。Rubyでは、
他の言語の非常に強力なマクロ機能(たとえば、ディラン)が私自身の意見で同様のリスクを提示するのと同じように、私はメジャーとして印象づけられます(Pythonがそのような強力なマクロシステムを取得しないことを願っています「人々に言語自体に埋め込まれた独自のドメイン固有の小さな言語を定義させる」という魅力は重要です-私見では、Pythonのアプリケーションプログラミングに対するすばらしい有用性を損ないます。すべてのプログラマーの心に潜んでいます...)。
アレックス