PythonとRubyのメタプログラミング[終了]


90

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

Lispについて少し読んだので、Lispの優れた機能のいくつかを可能にする言語を見つけたいと思いますが、Lispの奇妙な構文などはありません。言語の炎上戦争を開始したくないので、RubyとPythonの両方にトレードオフがあると確信しているので、個人的に重要なことをリストします。Ruby、Python、その他の言語のどちらが最適か教えてください。

重要:

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

やや大事な:

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

重要ではありません:

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

1
+1一般によく尋ねられる質問の場合。
トリプティク

悲しいことに、高評価の回答はすべて基本的に「依存する」と言っており、より低い回答は基本的にPythonとRubyの火炎戦争です。
Dan Burton

Clojureを検討しましたか?
マークトーマス

答えはジュリアです!当時は存在していませんでした:bit.ly/julia_meta ...喜んでください!ジュリアは@dsimchaによってリストされたすべての重要なポイントに加えてパフォーマンスをカバーし、ジュリアが成熟し続けるにつれて他のすべてのポイントが真実になります。
SalchiPapa

回答:


15

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


30
間違いなく同じことありません。一見、外観は似ていますが、Rubyの最も強力な機能を使用している方は、Pythonがまったく一致しないことを理解しています。例として、RubyでDSLを作成するか、Pythonを1つ作成するか、実行時に関数、メソッド、クラスなどを作成してみましょう。Rubyの方がずっと単純です。
FelipeC 2010

14
メタプログラミングを行う必要があることは珍しくありません。それが行われることはまれです。最も平凡なプログラム以外はすべて、通常のリファクタリングツールに当てはまらない繰り返しパターンを持っていますが、メタプログラミングによって容易に殺される可能性があります。
ウェインコンラッド

10
RubyとPythonは、設計を左右するアイデアでさえ、大きく異なります。Pythonは、物事を行うための1つの、できれば1つの明白な方法を望んでいます。そのため、一般的に言語はRubyよりも表現力が低くなりますが、一貫性が高まります。Rubyは、Perlのやり方からもう少しやって来て、いろいろなやり方があります。また、Rubyはいくつかのことを非常に簡単にし、実際にはプライベートメンバーのアイデアを含んでいます。一方、Pythonはせいぜいいくつかのことを難しくするだけなので、より明示的にする必要があります(クラスの動作を追加またはオーバーライドするなど)。
Sean Copenhaver

5
おそらく両方のコースを修了する必要がありますが、メタプログラミングを簡単にするためには、Rubyの方が適しているようです。私はあまり経験がありませんので、塩の粒でそれをとってください。
Sean Copenhaver

7
RubyとPythonは、「美しいコード」を説くという点でのみ類似しています。彼らはその美しさについて完全に異なる見解を持っています(これはIMOが良いです)
Gabi Purcaru

69

Lispについて少し読んだので、Lispの優れた機能のいくつかを可能にする言語を見つけたいと思いますが、Lispの奇妙な構文などはありません。

私たち全員ではないでしょうか。

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

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

読みやすい構文が必要な場合は、Pythonを使用できます。ただし、コードは、一般的に使用される組み込みデータ構造のいずれにも表されていません。ほとんどの言語のように、「重要」リストの項目1で失敗します。そのため、役立つヘルプを提供することは困難です。

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


3
多くの言語がLisp以外の構文でLispのようなマクロを実装していることを発見しました。コードが表現されるデータ構造を誰も自然に知らないため、マクロの記述が非常に難しくなるため、そこでマクロを記述するのは非常に困難です。誰もそれをしません。
プペノ2008年

11
Lispは構文に慣れていないため、人々はLispを読むのが難しいと感じています。LispはC#よりはるかに読みやすい(ただし、Pythonよりも難しい)と思います。
ジュール、

1
私はその点に大部分は同意しますが、RubyとLispの両方の私の経験は、前者が括弧なしで得られるのと同じくらいメタプログラミングに適していることを示しています。近づく他の代替手段としてはTCLとJavaScriptが考えられますが、他の理由でそれらを優先することはしません。
歌手2011

長い長いアギはまさにディランと呼ばれる言語がありました。
フリードリヒ

17

正直なところ、メタプログラミング機能に関する限り、RubyとPythonは、認めているような支持者よりもはるかに類似しています。両方の言語のこのレビューはかなり良い比較/レビューを提供します:

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


そのブログエントリは、OPの主なポイントであるメタプログラミングではなく、個人の好み(十分に公平ですが、見る人の目には美しさがあります)と関係があるようです。
歌手2011

16

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

Rubyは、「複数のパラダイム」のポイント3にとって非常に優れています。なぜなら、ドメイン固有の言語を簡単に作成できるようにするためです。たとえば、オンラインで閲覧して、Ruby on Railsコードのいくつかのビットと、Rakeコードのいくつかのビットを見てください。どちらもRubyであり、類似点を確認できますが、通常は同じ言語と考えるものとは異なります。

Pythonは少し予測しやすいようですが(おそらく「クリーン」と「正気」のポイント2に関連付けられています)、それは言語自体が原因なのか、それとも単に異なる値を持つ人々が一般的に使用しているのか、本当にわかりません。Pythonでディープマジックを試したことがありません。どちらの言語もよく考えられていると思います。

どちらも1と4のスコアが優れています。クロージャの定義、オブジェクトへのメソッドの割り当てなどができます。これがあなたの望むところまで行くかどうかわかりません。]

個人的には、Rubyの方が楽しいと思いますが、それは、物事を行うためのクールな方法を考えすぎて気を取られやすいためです。私は実際にPythonをもっと使った。時にはクールになりたくない、それで乗りたいので、就寝前に行われます...

どちらも難しいことではないので、次のマイナータスクを1つで実行し、次のタスクを次のタスクで実行することを決定できます。または、ライブラリからそれぞれの紹介本を手に取り、両方をざっと読んで、何があなたをつかむか見てください。


15

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

現在の関連性の他の指標:名前を付けたい任意のプラットフォーム(iPhoneを含む)で動作します。Gilad BrachaはNewspeakの仕事をSqueakに基づいています。V8チームは、Smalltalk VM積極的に取り組みました。そして、Dan IngallsとRandal Schwartzは、何年もの間荒野で過ごした後、Smalltalkの仕事に最近戻ってきました。

幸運をお祈りしております-最終的に決定したことをお知らせください。


14

Lispは、パフォーマンスを含むすべての基準を満たし、(奇妙な)構文を持たない唯一の言語です。このような驚くほど知識がなく間違ったやり方でそれを避け、その結果、たとえばEmacs + SLIME + CLの使用経験を逃した場合、あなたは自分自身に大きな害を及ぼすでしょう。


4
または、Clojureを試してみることもできます。
pupeno 2008年

1
強く同意します。Lispのパワーが必要な場合は、飛び込んでそれを手に入れてください!かっこに慣れるのは実に簡単です。彼らはほとんどの人がそれらをするようにそれらを作るほど大したことではありません。
Dan Burton

11

4つの「重要な」ポイントは正確にRubyにつながりますが、2つの「やや重要な」ポイントはPythonによって支配されます。だからそれである。


11

あなたはRubyを説明しています。

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

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

たとえば、class_evalを使用して、構文シュガーのショートカットを作成することもできます。

  • 素晴らしく、クリーンで、健全な構文と、一貫性のある直感的なセマンティクス。基本的に、よく考えられた、楽しくて使える現代的な言語です。

Rubyは、驚きが少ないという原則に従っており、Rubyコードを他の言語の同等のものと比較すると、多くの人々はそれをより「美しい」と考えています。

  • 複数のパラダイム。すべてのプロジェクト、またはプロジェクト内のすべての小さな副問題でさえ、1つのパラダイムが適切ではありません。

命令型、オブジェクト指向型、機能型、反射型をフォローできます。

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

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

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


11
-1私はPythonを使用していますが、PythonとRubyの違いは他の点で完全に適合しています。ファンボーイっぽいノイズメーカー、あなたはそうです。
gorsky

6
話はたくさんありますが、散歩はできません。Pythonで動的にメソッドを追加する例、つまりStringクラスを提供することに注意してください。
FelipeC 2010

6
@johnそれがまさに私のポイントです。これは非常に複雑で見苦しいです(もちろん、Stringクラスでは不可能です)。RubyのOTOHは非常に簡単です: "self.class.send(:define_method、:method_name){method_code}"
FelipeC

2
Rubyはあり試すのPOLに従うことを、私はそれは言わないだろう。たとえば、lambda/ Proc.new混乱はここでは「意外な振る舞い」および「非常に直感に反する」と呼ばれています。:-) Rubyと同じくらい大きく複雑な言語には、このような混乱する領域があるはずです。
ケン

2
@TokenはString、メタプログラミングを目的としたRuby でのモンキーパッチングの例です。coldattic.info/ shvedsky / pro / blogs / a-foo-walks-into-a- bar / posts / です。サブクラス化は行いません。ただし、単純な2つの引数を持つ関数では可能です。
Pは、

8

異なる言語で同じことをする(リストの項目の空ではない改行と結合する)コード例を比較します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ガイドです。


3
(format nil "〜{
〜a〜

いいですが、メタプログラミングはどこにありますか?それは質問とは遠く離れた、少し機能的なスタイルのようです。
歌手2011

6

「主流」であるという点で、RubyはLispよりも優れています実際の意味は何です、現実的な懸念事項の1つは、Lispプログラミングに関する質問への回答を簡単に見つけることができるということです)。 、Rubyは非常に簡単に入手できることがわかりました。最初にPython(または他の言語)を習得したのと同じ時間に、すぐに以前よりもはるかに効率的に優れたコードを書き始めました。ただし、それは1人の意見にすぎません。一粒の塩と一緒に飲んでください。この時点では、PythonやLispよりもRubyについて多くのことを知っていますが、切り替える前のかなりの期間、私はPythonの人でした。

Lispは間違いなくかなりクールで、調べる価値があります。あなたが言ったように、コミュニティなどのサイズは非常に急速に変化する可能性があります。そうは言っても、サイズ自体はコミュニティのほど重要ではありません。たとえば、#ruby-langチャンネルはまだ信じられないほど賢い人で満たされています。Lispは本当に賢い人たちも惹きつけているようです。直接の経験はあまりないので、Pythonコミュニティについてはあまり話せませんが、時々「大きすぎる」ようです。(私は人々が彼らのIRCチャンネルで非常に失礼だったことを覚えています、そして私が本当にPythonにいる友人から聞いたことから、それは例外ではなく規則のようです)

とにかく、役に立つと思われるリソースは次のとおりです。

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

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


5

私は多くのプロジェクトでPythonを使用しており、Pythonは要求されたすべての機能を提供していると思います。

重要:

  1. メタプログラミング:Pythonはメタクラスやランタイムクラス/メソッドの生成などをサポートしています
  2. 構文:まあそれは何とか主観的です。私はPythonの構文が単純であることを気に入っていますが、一部の人々はPythonは空白を区別することに不満を持っています。
  3. パラダイム:Pythonは、手続き型、オブジェクト指向、および基本的な関数型プログラミングをサポートしています。
  4. Pythonは非常に実用的なスタイルを持っていると思います。それは私にとって非常に刺激的でした。

やや大事な:

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

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

よろしく、デニス


3
Pythonは空白を区別しませんインデントを区別します。
jfs 2008

5

@ジェイソン私はそれぞれ同意しません。Rubyをメタプログラミングに関してPythonよりも優れたものにする違いがあります-哲学的および実用的の両方。手始めに、RubyはSingle InheritanceとMixinsで継承を正しく取得します。そして、メタプログラミングに関しては、それはすべて自己についてであることを理解する必要があります。ここでの標準的な違いは、Ruby では実行時にselfオブジェクトにアクセスできることです。Pythonではアクセスできません。

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

class Ninja
  def rank
    puts "Orange Clan"
  end

  self.name #=> "Ninja"
end

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


4

まあ、lisp構文が気に入らない場合は、おそらくアセンブラーが適しています。:-)

それは確かにコードとデータの違いが最小限であり、マルチパラダイム(または多分それはパラダイムではない)であり、学習と実行可能なトリックの両方の面で(面倒であれば)心を拡張する経験です。


私は他のどの言語よりもアセンブリ言語でより多くのメタプログラミングを行ったと思います。コードはデータであり、データはコードである可能性があります。そして、データは署名も署名もされていません。決定するのはオペコードです。
Nosredna 2009

1
私はあなたがオブジェクト指向であると主張できるアセンブラコードを持っています。メソッドのように見えるものがあります-「クラス」に依存するものを呼び出します。
ジャスティンタイム2009年

4

イオはあなたの「重要な」ポイントをすべて満たします。私はクレイジーなメタハッカーを行うためのより良い言語があるとは思いません。


それをありがとう、それを知りませんでした。一見楽しいように見えますが、(())はたくさんありますが、とにかく。そろそろ見てみる時間を見つけてほしい。
flq 2009

3

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

Lispが行うクールな機能のいくつかを可能にする言語を見つけたい

Lispはコンパイルできます。



3

私の答えはどちらでもありません。私は両方の言語を知っており、Rubyのクラスを受講し、Pythonで数年間プログラミングを行っていました。Lispは、その唯一の目的がリストを変換することであるという事実により、メタプログラミングが得意です。独自のソースコードは単なるトークンのリストなので、メタプログラミングは自然です。私がこの種のものに最も好む3つの言語は、Rebol、Forth、およびFactorです。Rebolは、入力ストリームからコードを取得し、それに対して式を実行し、その言語で記述されたルールを使用して変換する非常に強力な方言言語です。非常に表現力豊かで、方言が非常に得意です。FactorとForthは、構文とはほぼ完全に分離されており、単語を定義して呼び出すことでプログラミングします。彼らは通常、ほとんどが自分の言語で書かれています。あなたは伝統的な意味でアプリケーションを書くのではなく、独自の単語を書いて特定のアプリケーションを定義することにより、言語を拡張します。Factorは、ソースコードを評価および操作するためにsmalltalkでしか見たことのない多くの機能を備えているため、特に優れています。本当に素晴らしいワークスペース、インタラクティブなドキュメントなど


2

PythonとRubyを分離することはそれほど多くありません。PythonコミュニティはRubyコミュニティよりも大きく、成熟していると思います。それは私にとって本当に重要です。Rubyはより柔軟な言語であり、ポジティブとネガティブな影響があります。ただし、両方の言語について詳しく説明する人はたくさんいると思いますので、3つ目のオプションをリングに追加します。JavaScriptはどうですか?

JavaScriptはもともとWeb用のSchemeであるように設計されており、プロトタイプベースです。これは、マルチパラダイムとメタプログラミングに関する限り、PythonとRubyよりも優れています。構文は他の2つほど良くありませんが、おそらく最も広く展開されている言語であり、パフォーマンスは日々向上しています。


2

Lispスタイルのコードとデータの概念は好きだが、Lispyの構文が気に入らない場合は、Prologが良い選択でしょう。

それが「使うのが楽しい、現代の言語」に該当するかどうかは、他の人に判断してもらいます。;-)



2

OCamlはどうですか?

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

以下を満たしていると思います。

重要:

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

やや大事な:

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

OCamlでは、実行時にクラス/メソッドを作成できますか?それはどのように機能しますか?
Jason Creighton、

私はOCamlについて読んだだけで、実行時にものを作成できない可能性があるため、削除しました。
RobertVuković


1

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


1

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


1

あなたがバラを愛しているなら、あなたはとげと一緒に暮らすことを学ぶ必要があります:)


1

Rubyを使用することをお勧めします。

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


1

Rubyプログラミング言語とRuby実装を混在させないでください。RubyではPOSIXスレッドは使用できないと考えています。

あなたは単にpthreadサポートでコンパイルすることができます、そしてあなたがしゃれを許すならば、これはこのスレッドが作られた時にすでに可能でした

この質問への答えは簡単です。lispが好きなら、おそらくルビーを選ぶでしょう。または、あなたが好きなもの。


0

両方の言語を試して、自分に合った言語を選ぶことをお勧めします。PythonとRubyのどちらでも、必要な処理を実行できます。

このスレッドもお読みください。



0

要点(メタプログラミング)について:Groovyのバージョン1.6には、標準および統合された機能としてAST(抽象構文ツリー)プログラミングが組み込まれています。RubyにはRubyParserがありますが、これはアドオンです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.