web-dev-qa-db-ja.com

Python vs. Rubyメタプログラミング用

私は現在、主に [〜#〜] d [〜#〜] プログラマーであり、ツールボックスに別の言語を追加しようとしています。できればメタプログラミングハッキングをサポートする言語が望ましいDのような静的にコンパイルされた言語で.

私はLISPについて少し調べましたが、LISPの奇妙な構文などを使用せずに、LISPが行うクールな機能のいくつかを許可する言語を見つけたいと思っています。私は言語のフレーム戦争を始めたくありません、そして、私はRubyとPythonにトレードオフがあるので、重要なものをリストしますRuby、Python、または他の言語が私にとって最適かどうか教えてください。

重要:

  1. 優れたメタプログラミング。実行時にクラス、メソッド、関数などを作成する機能。できれば、コードとデータの最小の区別、LISPスタイル。
  2. 素晴らしく、クリーンで、健全な構文と一貫した直感的なセマンティクス。基本的にはよく考え抜かれた、楽しく使用できるモダンな言語です。
  3. 複数のパラダイム。すべてのプロジェクトに適したパラダイムはなく、プロジェクト内の小さなサブ問題もありません。
  4. プログラミングについての考え方に実際に影響する興味深い言語。

やや大事な:

  1. パフォーマンス。パフォーマンスがまともなのはいいことですが、パフォーマンスが真の優先事項である場合は、代わりにDを使用します。
  2. よく文書化されています。

重要ではありません:

  1. コミュニティの規模、ライブラリの可用性など。これらはいずれも言語自体の特性ではなく、すべてが非常に迅速に変更できます。
  2. ジョブの可用性。私はフルタイムのプロのプログラマーではありません。私は大学院生であり、プログラミングは私の研究に正接しています。
  3. 非常に大規模なプロジェクトで主に設計された機能は、100万人のコードモンキーによって処理されます。
89
dsimcha

少なくともイデオロギーレベルでは、pythonとRubyの間に大きな違いはありません。ほとんどの場合、同じものの異なるフレーバーです。 。したがって、どちらがあなたのプログラミングスタイルに一致するかを確認することをお勧めします。

15
Jason Baker

私はLISPについて少し調べましたが、LISPのクールな機能のいくつかを許可する言語を見つけたいのですが、LISPの奇妙な構文などはありません。

みんなじゃないですか。

コードとデータの最小限の区別、LISPスタイル

悲しいことに、コードとデータの最小の違いと「奇妙な」構文は、お互いの結果です。

読みやすい構文が必要な場合は、Pythonがあります。ただし、コードはnotであり、よく使用される組み込みデータ構造のいずれかで表されます。ほとんどの言語と同様に、「重要」リストの項目1で失敗します。そのため、有用なヘルプを提供することが難しくなります。

すべてを手に入れることはできません。覚えておいて、あなたはこの考えを持っている最初ではありません。あなたの理想的な言語のようなものが存在するなら、私たちは皆それを使用するでしょう。現実の世界は理想に達していないため、ウィッシュリストの優先順位を変更する必要があります。 「重要」セクションは、あなたにとって重要な本当にを識別するために再配置する必要があります。

69
S.Lott

正直なところ、メタプログラミング機能に関する限り、RubyとPythonは、支持者の一部が認めるよりもはるかによく似ています。かなり良い比較/レビュー:

したがって、いくつかの基準に基づいて1つを選択してください。多分あなたはRailsで、そのコードを勉強したいかもしれません。たぶんSciPyがあなたのものです。ライブラリ、コミュニティなどのエコシステムを見て、1つを選んでください。どちらかの選択に基づいたメタプログラミングニルヴァーナ。

17
ars

免責事項:私はどちらかの言語でしか手を出せませんが、少なくとも小さな作業プログラムを作成しています(クイックスクリプトだけでなく、両方でPerl、bashまたはGNU make)を使用しています)。

Rubyは、「複数のパラダイム」ポイント3にとって本当に素晴らしいことがあります。ドメイン固有の言語を簡単に作成できるように努力しているからです。たとえば、オンラインで閲覧して、Ruby on RailsコードとRakeコードのビット。これらは両方ともRubyです。 、および類似点を見ることができますが、それらは通常同じ言語と考えるもののようには見えません。

Pythonはもう少し予測可能です(おそらく「クリーン」と「正気」のポイント2に相関しています)が、それは言語自体のせいなのか、それとも異なる値を持つ人々が通常使用しているのか本当にわかりません。 Pythonでディープマジックを試したことはありません。私は確かに両方の言語がよく考えられていると言うでしょう。

両方とも1と4で得点します。[編集:実際には1はかなり議論の余地があります-インタープリター言語で一般的なように、両方に「評価」がありますが、概念的に純粋ではありません。クロージャーを定義したり、オブジェクトにメソッドを割り当てたりすることができます。これがあなたの望むところまで行くかどうかはわかりません。]

個人的に私はRubyより楽しいが、それは部分的には物事を行うクールな方法について気を散らすことを容易にするためです。私は実際に使用しましたPython more時々、クールになりたくない場合は、就寝前にそれを行うために、それを取得したい...

どちらも入るのが難しくないので、次の小さなタスクを1つで、次のタスクをもう1つで行うことを決定できます。または、図書館からそれぞれの入門書を取り上げ、それらの両方をざっと読んで、何があなたをつかむかを見てください。

16
Steve Jessop

Smalltalkを検討しましたか?反射性とイントロスペクション機能を備えた非常にシンプルで明確で拡張可能な構文と、それらの機能を活用する完全に統合された開発環境を提供します。 実行中の作業の一部 in Squeak Smalltalk をご覧ください。 Squeakを使用している多くの研究者が Squeakメーリングリスト およびfreenodeの#squeakにたむろしているので、複雑な問題のヘルプを非常に簡単に得ることができます。

現在の関連性の他の指標:名前を付けたい任意のプラットフォームで実行されます( iPhone を含む)。 Gilad BrachaはNewspeakの仕事をSqueakに基づいています。 V8チームは Smalltalk VM ;そして、ダン・インガルスとランダル・シュワルツは、何年も荒野で過ごした後、最近スモールトークの仕事に戻りました。

あなたの検索で幸運-あなたが最終的に決定するものをお知らせください。

15
mykdavies

LISPはパフォーマンスを含むすべての基準を満たしており、(奇妙な)構文を持たない唯一の言語です。あなたがそのような驚くほど不十分な情報/間違った方法でそれを避け、その結果、例えば、 Emacs + SLIME + CL、あなたは自分自身に大きな損害を与えるでしょう。

14
user23611

4つの「重要な」ポイントはRubyに正確に結びつきますが、2つの「やや重要な」ポイントはPythonによって支配されています。

11
Neo

Rubyについて説明しています。

  • 優れたメタプログラミング。実行時にクラス、メソッド、関数などを作成する機能。できれば、コードとデータの最小の区別、LISPスタイル。

実行時に既存のプリミティブを拡張および変更するのは非常に簡単です。 In Rubyすべてがオブジェクト、文字列、整数、さらには関数です。

class_eval などを使用して、構文糖のショートカットを作成することもできます。

  • 素晴らしく、クリーンで、健全な構文と一貫した直感的なセマンティクス。基本的にはよく考え抜かれた、楽しく使用できるモダンな言語です。

Rubyは それほど驚くことではない原則 に従い、Rubyコードと他の言語の同等のコードを比較する場合、多くの人はそれをより「美しい」と考えています。

  • 複数のパラダイム。すべてのプロジェクトに適したパラダイムはなく、プロジェクト内の小さなサブ問題もありません。

命令的、オブジェクト指向、機能的、および反射的に従うことができます。

  • プログラミングについての考え方に実際に影響する興味深い言語。

それは非常に主観的ですが、私の観点からは、同時に多くのパラダイムを使用する能力は非常に興味深いアイデアを可能にします。

私はPythonを試しましたが、それはあなたの重要なポイントに適合しません。

11
FelipeC

比較 コード例 同じこと(myListリストの項目の空でない説明の改行と結合)を異なる言語で行います(言語はアルファベットの逆順に並べられます):

ルビー

myList.collect { |f| f.description }.select { |d| d != "" }.join("\n")

または

myList.map(&:description).reject(&:empty?).join("\n")

Python

descriptions = (f.description() for f in mylist)
"\n".join(filter(len, descriptions)) 

または

"\n".join(f.description() for f in mylist if f.description())

Perl

join "\n", grep { $_ } map { $_->description } @myList;

または

join "\n", grep /./, map { $_->description } @myList;

Javascript

myList.map(function(e) e.description())
      .filter(function(e) e).join("\n")

Io

myList collect(description) select(!="") join("\n")

Ioガイド です。

8
jfs

「メインストリーム」であるという点では、RubyはLISPより優れています(reallyが意味するものは何でも、現実的な懸念の1つは、答えを見つけることがいかに簡単かということです。いずれにせよ、LISPプログラミングに関するあなたの質問に答えてください。)いずれにしても、私はRubyを見つけるのは非常に簡単です。最初の学習に費やしたのと同じ時間で= Python(または他の言語))、すぐにbetterコードを書いていました以前よりも効率的に。それはただ一人の意見ですが、それを一粒の塩で取ります、私は推測します。Ruby私がするよりもこの時点でPythonまたはLISP、しかしあなたは私がPython私が切り替える前にかなり長い間人だったことを知っているべきです。

LISPは間違いなく非常にクールで、検討する価値があります。あなたが言ったように、コミュニティのサイズなどは非常に急速に変化します。とはいえ、サイズ自体はコミュニティのqualityほど重要ではありません。たとえば、#Ruby-langチャンネルはまだ信じられないほど優秀な人でいっぱいです。 LISPには、非常に優秀な人もいるようです。 Pythonコミュニティについてはあまり話せませんが、実際の経験はあまりありませんが、時々「大きすぎる」ようです。彼らのIRCチャンネル、そして私がPythonに本当に興味がある友人から聞いたことから、それは例外というよりむしろ規則のようです。)

とにかく、役に立つかもしれないいくつかのリソースは次のとおりです。

1)Pragmatic Programmers Ruby Metaprogramming series( http://www.pragprog.com/screencasts/v-dtrubyom/the-Ruby-object-model-and-metaprogramming) )-無料ではありませんが、後のエピソードは非常に興味深いものです(ダウンロードして、学習内容を確認したい場合は、コードは無料です)。

2)Paul GrahamによるLISP( http://www.paulgraham.com/onlisp.html )。少し古いですが、クラシックです(そして無料でダウンロードできます)。

6
Benjamin Oakes

@ジェイソン私はそれぞれ反対します。 RubyをPythonよりもメタプログラミングで優れたものにするための違いがあります-哲学的かつ実用的です。まず第一に、 Rubyは単一継承とMixins で継承を取得します。そして、メタプログラミングに関しては、単にselfであるということを理解する必要があります。ここでの標準的な違いは、Rubyでは実行時にselfオブジェクトにアクセスできることです-Pythonではアクセスできません!

Pythonとは異なり、Rubyには別個のコンパイルまたは実行段階はありません。 Rubyでは、特定のselfオブジェクトに対してすべてのコード行が実行されます。 Rubyでは、すべてのクラスがオブジェクトと隠しメタクラスの両方から継承します。これにより、いくつかの興味深いダイナミクスが作成されます。

class Ninja
  def rank
    puts "Orange Clan"
  end

  self.name #=> "Ninja"
end

self.nameを使用すると、Ninjaクラスのメタクラスnameメソッドにアクセスして戻ります忍者のクラス名。メタプログラミングはPythonでとても美しいですか?私は心から疑います!

5
Eric Davidson

私はPython=多くのプロジェクトで使用していますが、Pythonはあなたが要求したすべての機能を提供しています。

重要:

  1. メタプログラミング:Python=メタクラスとランタイムクラス/メソッド生成などをサポート
  2. 構文:まあそれはどういうわけか主観的です。 Pythonのシンタックスはシンプルであるのが好きですが、一部の人々はPythonは空白文字に敏感です。
  3. パラダイム:Pythonは手続き型、オブジェクト指向、基本的な関数型プログラミングをサポートします。
  4. Pythonは非常に実用的なスタイルを持っていると思うので、とても刺激を受けました。

やや大事な:

  1. パフォーマンス:それはスクリプト言語です。ただし、PythonのC拡張機能を記述することは、一般的な最適化手法です。
  2. ドキュメント:文句を言うことはできません。誰かがJavaから知っているほど詳細ではありませんが、十分です。

あなたが大学院生であるとき、あなたは Pythonは科学者が必要とするすべて であると主張してこの論文を読みたくなるかもしれません。残念ながら、私はPythonとRubyを比較できません。その言語を使用したことがないためです。

よろしく、デニス

5
xardias

LISP構文が気に入らない場合は、おそらくアセンブラーが最適です。 :-)

確かに、コードとデータの区別は最小限であり、マルチパラダイム(またはパラダイムではないかもしれません)であり、学習と実行可能なトリックの両方の面で(退屈な場合は)経験を広げる心です。

4
rickardg

Ioは、すべての「重要な」ポイントを満たします。クレイジーなメタハッカーを行うための優れた言語は存在しないと思います。

4
frigolitmonster

静的にコンパイルされた言語では実行できないのメタプログラミングハッキングをサポートするもの

[〜#〜] lisp [〜#〜]が行うクールなものを許可する言語を見つけたい

LISPをコンパイルできます。

3
RHSeeger

Rebolを試しましたか?

3
Anon

私の答えはどちらでもないでしょう。私は両方の言語を知っており、Rubyでクラスを取り、数年の間pythonでプログラミングを行っています。LISPはその唯一の目的のためにメタプログラミングが得意です。リストを変換することであり、独自のソースコードはトークンのリストにすぎないので、メタプログラミングは自然です。入力ストリーム、それに対して式を実行し、言語で記述されたルールを使用してそれを変換します。非常に表現力があり、方言が非常に優れています。ほとんどの場合、独自の言語で記述されています。伝統的な意味でアプリケーションを作成するのではなく、独自の単語を記述して特定のアプリケーションを定義することで言語を拡張します。そしてソースコードでの作業。本当に素敵なワークスペース、インタラクティブなドキュメントなど.

3
ToddB

実際にPythonとRubyを分離することはあまりありません。PythonコミュニティはRubyコミュニティ、そしてそれは私にとって非常に重要です。Rubyは、より柔軟な言語であり、肯定的および否定的な影響があります。しかし、これらの両方の言語について詳しく説明しますので、3番目のオプションをリングに追加します。

JavaScriptは元々Web用のScheme向けに設計されており、プロトタイプベースであり、これはPython and Ruby構文は他の2つほどニースではありませんが、おそらく最も広く展開されている言語であり、パフォーマンスは日々向上しています。

2
Jim

私はPythonを少し使用しましたが、より多くのRubyを使用しています。

あなたの4つのポイントすべてを見たら、少なくとも次を確認できます。 http://www.iolanguage.com/

そして、モーツァルト/オズもあなたにとって興味深いかもしれません: http://mozart.github.io/

よろしく

2
Friedrich

Python、Smalltalk、Rubyを調査した後、Rubyを選択しました。

2
ryw

LISPスタイルのcode-is-dataコンセプトが好きで、Lispy構文が好きではない場合、多分 Prolog が良い選択でしょう。

それが「使う楽しさ、現代の言語」としてふさわしいかどうか、私は判断するために他の人に任せます。 ;-)

2
JesperE

OCamlはどうですか?

OCamlの機能:静的型システム、型推論、パラメトリック多相性、末尾再帰、パターンマッチング、ファーストクラスの語彙的クロージャー、ファンクター(パラメトリックモジュール)、例外処理、および増分世代別自動ガベージコレクション。

私はそれが次の条件を満たすと思います:

重要:

  1. 素晴らしく、クリーンで、健全な構文と一貫した直感的なセマンティクス。基本的にはよく考え抜かれた、楽しく使用できるモダンな言語です。
  2. 複数のパラダイム。すべてのプロジェクトに適したパラダイムは存在しません。また、プロジェクト内のすべての小さなサブ問題さえありません。
  3. プログラミングについての考え方に実際に影響する興味深い言語。

やや大事な:

  1. パフォーマンス。パフォーマンスがまともであれば良かったのですが、パフォーマンスが真の優先事項である場合は、代わりにDを使用します。
  2. よく文書化されています。
2
Robert Vuković

あなたがバラを愛しているなら、あなたはとげと一緒に暮らすことを学ばなければなりません:)

1
AgentOrange

Pythonスタイルの構文とLISPのようなマクロ(実際のコードであるマクロ)および適切なDSLについては、 converge を参照してください。

1
Kasprzol

POSIXスレッドはRubyでは不可能であると考えて、Rubyプログラミング言語とRuby実装を混在させないでください。

単純にpthreadサポートを使用してコンパイルすることができ、- これは、このスレッドが作成された時点ですでに可能でした 、もししゃれを許せば。

この質問に対する答えは簡単です。 LISPが好きなら、おそらくRubyを好むでしょう。または、あなたが好きなもの。

1
nonanonym

Rubyをお勧めします。

私が最初にそれを学び始めたとき、私はそれを拾うのが本当に簡単であるとわかりました。

1
Mardix

Pythonがあなたが望むすべてのこと(特にコードとデータの最小限の区別に関するポイント)を満たすかどうかはわかりませんが、Pythonを支持する議論が1つあります。プロジェクトがあります。これにより、Dでpythonの拡張機能を簡単にプログラミングできるため、両方の長所を活用できます。 http://pyd.dsource.org/celerid .html

1
Mauli

両方の言語を試して、自分に合った言語を選択することをお勧めします。 PythonとRubyはあなたが望むことをすることができます。

このスレッド も読んでください。

Haskellをお勧めします。 「重要な」基準1(テンプレートHaskellを含めない場合)または3(Haskellは堅固に機能的な言語ですが、実際にHaskellで命令型にコーディングするのがどれほど簡単かは驚くかもしれませんがに)。ただし、Haskellのファーストクラスの機能をお楽しみいただけます。

Haskellは、「重要な」基準2および4の堅実な選択肢です。特に#4:「プログラミングに関する考え方に実際に影響する興味深い言語」。かなりの量のHaskellを学んだ人は誰でも、あなたの心を広げる能力を証明できます。

0
Dan Burton

JSを使用するには、github http://github.com/visionmedia でAJS(代替JavaScript構文)をチェックアウトするだけです。

0
TJ Holowaychuk

主な点(メタプログラミング)について:Groovyのバージョン1.6には、標準機能および統合機能としてAST(Abstract Syntax Tree)プログラミングが組み込まれています。 RubyにはRubyParserがありますが、これはアドオンです。

0
groovy