28

私はプロのプログラマーではありません (私の分野は医学研究です) が、C/C++ およびさまざまなスクリプト言語はかなりの能力があります。しばらく前に Lisp に興味を持ちましたが、真剣に学ぶ時間がありませんでした。Rに少し触れた後、関数型プログラミング言語により多くの時間を投資することにしました。

JVM 言語の実用性が欲しいので、Clojure と Scala に絞り込みました。私が理解していることから、どちらも既存の Java ライブラリを使用でき、パフォーマンスが重要なコードを Java に委譲することができ、比較的同等にうまく機能する可能性があります。

これらの言語は、私が必要とするアプリケーション空間でどのように比較されますか? どちらかを使用したバイオインフォマティクスの実際のプロジェクトはありますか?

優れたドキュメントとかなり穏やかな学習曲線と同様に、既存のコードは深刻なプラスになります。また、両者の同時実行モデルはどのように比較されますか?

誰もが持っている重要な利点/欠点はありますか?

4

9 に答える 9

32

個人的には、Clojure がこの種の作業に最適なツールであることを保証できます。(Scalaも素晴らしいと思いますが、経験が少ないだけです)。

私の個人的な研究は予測モデリング/機械学習の分野であり、非常に計算量が多いため、バイオインフォマティクスや生物統計学と多くの類似点があると思います.

私の個人的なアプローチ/セットアップには以下が含まれます:

  • Incanterは、主にデータ視覚化ツールとして使用されます。REPL で通常は 1 ライナーだけであるクイック ビジュアライゼーションを生成するのに最適です。内部でColtライブラリを使用していると思われる統計処理ツールや数値処理ツールもたくさんあります。私は R の専門家ではありませんが、Incanter は大まかに「R を Clojure/Lisp に変換したもの」であることは理解しています。

  • 必要に応じて、かなりの数の Java ライブラリを利用します。これらのいくつかは私が独自に作成したものです。たとえば、JVM から微調整された最高のパフォーマンスを引き出すために Java で作成したアルゴリズムです。ただし、Clojure から Java を呼び出すのは非常に簡単なので、利用可能な他の優れた Java ライブラリを同じように簡単に使用できます (.methodName object param1 param2)。

  • 私のワークフローを自動化するための非常に多くの高次関数。たとえば、指定された時間ループ内で任意の種類の最適化アルゴリズムを実行し、各反復で改善の Incanter グラフを生成する高次関数があります。ロケット科学ではありませんが、数行の Clojure でコードを作成するのは非常に簡単です。

  • パフォーマンスについて本当に心配する必要はありません。必要に応じて Clojure をかなり高速に動作させることもできますが (たとえば、型ヒント、プリミティブ算術サポートなどを使用)、通常はサイクルの 99% 以上を十分に最適化されたライブラリ コードに費やすことになるため、関係ありません。したがって、「グルー」コードのオーバーヘッドはごくわずかです。動的で高レベルの関数型言語を使用することで、個人の生産性が大幅に向上したと感じています。

  • Clojure の同時実行機能の主な使用- これは、Clojure の最も強力な機能の 1 つに違いありません。私は、STM を使用して、相互に干渉できないトランザクションを伴う並行プロセスをコーディングし、その後、長時間実行される計算を開始して、他のタスクを続行し、結果の通知を待つことができるようにします。

  • 必要に応じて「言語を拡張」するための、ゆっくりと成長しているマクロのコレクション。実際、私は思っていたよりもマクロをあまり使用していません (高階関数の方が良い選択であることがよくあります)。しかし、あなたがそれらを必要とするとき、それらはかけがえのないものです。言語自体に新しい構文を効果的に追加できるため、必要な DSL を構築するために正しく使用すると非常に強力になります。

要するに、Clojure を研究者として利用することは間違っていないと思います。

私がおそらくそれを (まだ) 使用しないことの 1 つは、実際に新しい数値ライブラリを作成することです。これはおそらく、より命令型/OOP スタイルを採用したいので、Scala または純粋な Java で行う方がよいでしょう。

于 2011-03-09T21:19:42.887 に答える
22

バイオインフォマティクスと生物統計学自体についてはよくわかりませんが、科学的データ分析を頻繁に行っており、Scala を使用すると Java と同じくらい高速なコードを比較的簡単に記述できることを高く評価しています。現在、Clojure では多くの場合可能だと思いますが、それを裏付けるベンチマークは見たことがありません。当面は、両者のパフォーマンスが同等ではないことを想定するのが賢明だと思います。たとえば、すべてのテストで Scala が Clojure よりも高速であるComputer Languages Benchmark Gameを参照してください。(Clojure の恐ろしい "ピディジット" の結果は無視してください。Scala (および Java) は C で記述された GMP ライブラリを呼び出しています。Clojure はこれを行うことができますが、技術的な詳細のためにライブラリの別のラッピングが必要になるため、現在は許可されていません)ゲーム)。見つめているマルチコア比較は Clojure の表示を改善しません。Clojure コードは、この種の低レベルのアルゴリズム タスクに対しては短くないことに注意してください。

Clojure は当分の間、並列コレクションで先を行っていますが、Scala の次の 2.9 リリースがその違いの大部分を補うはずです。どちらも C++ からの学習曲線は緩やかです。Scala は、構文が外見上、もう少しなじみがあるように見えるため、少し簡単かもしれません。それぞれに良い教材があると思います。


編集:PS rJava(特にJRIインターフェース)を使用して、Javaから(したがってClojureまたはScalaから)Rを呼び出すことができます。編集から編集: そして、最近ではrScala .

編集 #2: 執筆時点では、Scala はすべての点で Clojure よりも高速でした。この編集の時点で、Clojure は (膨大な量のコードを犠牲にして) 少し先を行っていますが、全体的な要点は変わりません。(そして、その 1 つのテストでの Scala の実装は高速化される可能性があります。)

于 2011-03-09T19:02:34.670 に答える
17

R が好きなら、Incanterを試してみてください! Clojureの R です。

Scala は、Java から来た人々にとって構文的に簡単になるように調整されています。これは、C から来た人々にとって構文的に簡単になるように意図されていましたが、このような 2 つのレベルの間接化により、利点が失われる可能性があります。

Clojure はビッグ データの分野で多くの注目を集めており、Huge Data のHadoopジョブにうまく対応しています。これはバイオインフォマティクスの世界で大きなアドバンテージになると思います。

本当に、これらは主に個人的な好みなので、両方を試してみて、それがあなたを幸せにすることを確認してください:)

多くの「知的オーバーヘッド」なしで Clojure の感触をつかもうとしている場合は、テスト プロジェクトをすぐに開始するために leiningen を使用することをお勧めしますか?

于 2011-03-09T18:46:50.187 に答える
12

Rexの回答に基づいて構築するために、興味のあるScalaライブラリ/製品をいくつか追加したいと思います:

于 2011-03-09T19:49:25.883 に答える
10

私は Scala を知らないので比較はできませんが、バイオインフォマティクス プロジェクトで Clojure を積極的に使用しています。

Java の統合は優れており、BioJavaライブラリを問題なく使用できます。

Clojure の並行性モデルが優れているのは、不変のデフォルト データ型とseq抽象化による関数型プログラミングです。

私のバイオインフォマティクスの仕事では、同じ分析を行う必要のある大量の入力データ (遺伝子配列など) を頻繁に使用します。分析関数を取得したらmap、一連の入力に対して実行できます (結果は遅延生成されます)。mapに変更するだけで、大規模な 48 コア サーバーを最大限に活用できますpmap

1 つの文字変更による大規模な並列化には勝るものはありません。

もちろんpmap、これは特効薬ではなく、分析関数が計算上支配的である場合にのみ役立ちますが、プラグインとプラグアウトが可能であるという事実はmappmapClojure の設計によって可能になった優雅さと単純さを示しています。

于 2011-03-09T20:37:41.080 に答える
8

私は Scala に少しだけ慣れているだけなので、Clojure について少しだけ伝道することしかできません。これは素晴らしい言語ですが、熱狂的な人からのアドバイスなので、このすべてのアドバイスは鵜呑みにしてはいけません。

並行性を探しているなら、Clojure はプログラミングの容易さとパフォーマンスの両方の点で優れています。不変のデータ構造は、手動でエラーが発生しやすいロックを行わずに、世界の首尾一貫したスナップショットを操作するのが簡単であることを意味します。STM を使用すると、他のユーザーのスナップショットを壊すことなく、スレッド センシティブな方法でデータを簡単に変更できます。

私の理解では、Scala には Clojure が提供する優れた関数型ツールがたくさんありますが、Clojure は Lisp であるため、構文的には常に勝利します。バイオインフォマティクスに特化したものを探している場合、Clojure は必要のない Lisp の部分を隠し、独自の構造を組み込み言語構造と同じレベルに引き上げることができます。私は今のところ参照を見つけることができませんが、Lisp について次のような有名な引用があります。

Lisp は、どのプログラムにとっても完璧な言語ではありません。しかし、すべてのプログラムに最適な言語を構築するのに最適な言語です。

それは恐ろしく言い換えられていますが、私の経験ではそれは真実です。かなり特殊化されたツール セットが必要になるように思われますが、それらを Lisp ほど自然に感じさせる言語はありません。

于 2011-03-09T18:59:03.227 に答える
5

関数型プログラミングが自分にとってどれほど重要かを自問する必要があります。あなたは C++ を知っているので、おそらく OO も知っているでしょう。Clojure で FP を実行する方が簡単だと思います (オブジェクト指向スタイルに戻すことはできないため)。

あなたのアプリケーション空間については何も言えません。

あなたがRに言及したので、 Incanterと呼ばれる統計用のRに似たClojureライブラリがあります。あなたのアプリケーション スペースにある他の既存のプロジェクトについては知りません。

両方の言語について多くの情報があるので、問題にはなりません。どちらの言語でも学習曲線は急勾配です。Clojure ははるかに小規模な言語であり、すでにいくつかの Lisp を知っているので、重要なことを学ぶのは難しくありません。あなたの主な経験は C/C++ であるため、Scala には特に理解しにくい型システムがあります。

どちらの言語にも優れた並行性モデルがあり、おそらく両方に満足するでしょう。

于 2011-03-09T19:29:11.447 に答える
2

私はScalaの経験があり、Clojureの知識はほとんどありませんが、何年も前にLispをプログラムしました。

Lispは美しい言語ですが、制限が多すぎたため、世界に広まることはありませんでした。堅牢なシステムを開発するには、静的に型付けされた言語が必要だと思います。Scalaの型システムは、その恩恵を受けるために習得するのは難しくありません。ライブラリをばかげたものにするためにそれを使って非常に高度なことをしたいのなら、それは可能ですが、それなら型システムをもう少し勉強する必要があります。

Scalaは不変型を好みますが、問題なく可変を使用できます。これは時々必要になります。Scalaの並行性は非常によく実装されており、akkaのようなフレームワークはこれらの可能性を拡張および強化します。

Scalaはより完全な言語であるため、主流の言語になる可能性が高くなります。ClojureはLispに非常に似ているのではないかと思います(ただし、JVMで再実装されています)。私はLispがとても好きでしたが、実際のプログラムにはあまりにも多くの欠点がありました。Scalaを使用すると、クリーンな結婚生活で両方の長所(OOと機能)を利用できると思います。その上、Scalaは本当に市場で流行しているようです。

于 2011-03-10T17:37:05.960 に答える
1

GitHub の Rudolf/BioClojure プロジェクトで実験的なコードに取り組んでいます。また、より構造化された Jan Aert の BioClojure プロジェクトを見てください。

さらに、進行中のBioCamlプロジェクトがあります...

于 2011-10-31T06:09:42.450 に答える