良い関数型/おっと/メタプログラミング言語を探しています:[終了]


9

なりたい

  • ネイティブコードの生成// GHCなどでコンパイルできる
  • クロスプラットフォーム(win / linux)
  • 機能的で少しオブジェクト指向
  • ラムダ、パターンマッチング、タプル、その他の機能的なもの
  • 優れたメタプログラミングサポート
  • インデントと最小ボーダー
  • 静的型付け
  • また、私はMixinのサポートを求めています:)
  • 一部のフレームワークに基づいてWebサイトを構築する可能性もプラスです。
  • そう、はい、パフォーマンスと安定性が重要です。

私はHaskellを起動しましたが、OCamlがあるため、それについてはまだわかりません。そして、F#の経験があります。しかし、私が知る限り、OCalmは少しOOPであり、時にはそれよりも速い(それについてはよくわかりません)ので、試したことはありません。アーランは、私がについて何も知らない、もありアーランを。そして多分私はもっと何かが足りない..?Python、私はここではpythonについて何も知りません、それは機能的であり、それはoopであり、ミックスインをサポートし、人気があり高速ですが、Pythonはすべての機能的なマジックに対応できるとは本当に思っていません。

このスレッド/トピックは、何も話さない、または言語戦争のようなものであることを知っていますが、私は真剣に、そしてあなたのビジョンを本当に聞きたいと思っています。


2
ネイティブコードの生成を要求すると、オプションが大幅に制限されると思います。ネメルは一撃の価値があると思います。
back2dos

@ back2dosええ、私はNemerleが好きですが、小さなutilsまたはwebのモノでそれを使用することは少しODDの仕事です。私はそう思う。そして、インデントはまだ悪いサポートを得ていました。私はネメルを使っていますが、時々。今のところ、F#よりも少ない値で使用しています。
CND

(ランタイム)関数パラダイムを備えたC ++が必要であるように見えます(すでにコンパイル時関数パラダイムがあります)。
クライム

@Klaim C ++は本当に欲しくない。ghc-> gccを使用したジェネレーションネイティブコードで問題ありません。
CND

2
これらの要件をすべて備えた言語?おそらく自分で書いたものでしょう。
Rein Henrichs、

回答:


8

Clojureは、すべての要件にかなり適しているようです。

  • ネイティブコード生成/ GHCなどでコンパイル可能 - はい(すべてのClojureコードはJavaバイトコードにコンパイルされ、その後、JVM上のJITを介してネイティブコードにコンパイルされます)

  • クロスプラットフォーム(win / linux)- はい-JVMが実行される場所

  • 関数型で少しオブジェクト指向- はい-Clojureは何よりもまず関数型言語ですが、(Javaの相互運用性またはCLスタイルのオブジェクトを介して)必要に応じてOOもサポートしています。そうは言っても、OOは一般的にClojureでは一義的であると考えられています。

  • ラムダ、パターンマッチング、タプル、その他の機能的なもの- はい-これは、かなり標準的な関数型言語です。作者(Rich Hickey)は、Haskellに触発されました。

  • 優れたメタプログラミングサポート- はい-「code-is-data」はすべてのLispと同様に適用され、優れたマクロ機能を取得します

  • インデントと最小限の境界線- はい、確かにそれは確かに実際には言語機能ではなくエディターですか?

  • 静的型付け- はい-Clojureはデフォルトで動的ですが、パフォーマンスを向上させるためにいつでも静的型またはプリミティブ型のヒントを提供できます

  • また、Mixinのサポートも必要です:)- はい-さまざまな方法(マクロなど)で実現できますが、Clojureのプロトコル機能を発見した後は、おそらく必要ないか、必要ありません。

  • 一部のフレームワークに基づいてWebサイトを構築する可能性もプラスです。- はい-ClojureにはRing / Compojureのようなフレームワークがあり、Javaフレームワークも使用できます

  • そう、はい、パフォーマンスと安定性が重要です。- はい-基本的に、エンタープライズアプリケーションで十分に実証されているJVMのすべてのパフォーマンス/安定性を取得します。

それ以外にも、Clojureには、同時実行性に関して非常に優れた機能がいくつかあります。このビデオを見るのは本当に価値がありますhttp : //www.infoq.com/presentations/Value-Identity-State-Rich-Hickey


1
「JVM上のJITを介してすべてがネイティブコードにコンパイルされる」まったく間違っている...ネイティブコードでコンパイルすると、仮想マシンのようなものは必要なくなります。ここでそれが必要です。
BenjaminB

1
ネイティブコードが必要な理由によって異なります。あなたが気にしているのが定常状態のパフォーマンスである場合、JVMはネイティブコードで完全にそこにあります。ネイティブライブラリが必要な場合は、JVMからJNIを使​​用できます(リアルタイム3Dゲームにはこれで十分です)。ただし、ミリ秒単位の起動時間が必要な場合や、組み込みデバイスのように厳しいメモリ制約がある場合は、JVMが理想的でない可能性があることに同意します。
mikera

mikeraは、展開を簡単にすることもできます(Linuxパッケージの依存関係が1つ少なくなるか、ユーザーがWindowsにJREをインストールする必要がなく、おそらく誰かに.exeまたはelfを与えることもできます)。はい、バイナリのみを指定するのは例外ですが、ネイティブアプリケーションでは可能ですが、JVMを必要とするプログラムでは不可能です。
アレクサンダー

1
@Alexander-依存関係の見方にもよりますが、Clojureにとってプラスのポイントになる可能性はありますが、ネイティブバイナリには少なくとも2つ(オペレーティングシステム)があるのに対し、Clojureアプリには1つの直接的な依存関係(JVM)があります。および特定のハードウェアアーキテクチャ)
mikera

「JVM上のJITを介してすべてがネイティブコードにコンパイルされます」:いいえ。(それを明確にして、私は-1を削除します)
ヘイレム

8

Common Lisp

上記の要件をすべてサポートしているようです。リンクをクリックすると、開始するために知っておく必要があるすべてをカバーするオンラインブックに移動します。


1
Common Lispはネイティブコードを生成しますか?
クライム

6
@Klaim:Common Lispはプログラミング言語です。プログラミング言語はコードを生成しませんが、コンパイラは生成します。したがって、地球上のほとんどすべてのプログラミング言語(C、C ++、Java、Ruby、ECMAScriptなど)と同様に、ネイティブコードを生成するCommon Lisp用のコンパイラがあります。そして、他のほとんどすべてのプログラミング言語と同様に、JVMLバイトコード、CILバイトコード、Cソースコード、ECMAScriptソースコードを生成するコンパイラーがあります。そして、他のほとんどすべてのプログラミング言語と同じように、通訳がいます。
イェルクWミッターク

2
@クライム:あなたはそのeval機能について話しているのですか?これは単なる関数であり、好きなように実装できます。一部の実装には、コンパイルされた実行可能ファイルに付属する別個のインタープリターがあります。コンパイラ自体をコンパイル済みの実行可能ファイルとともに出荷するだけのものもあります。とにかく実行時にコードをコンパイルするだけのものもあります。そして、あなたはマクロについて話している場合:これらはのみで実行コンパイル時とにかく。それがその美しさです。
イェルクWミッターク

2
@nCdy Lispの()は、s式内のリストアトムを区別するための構文を提供した結果として生まれました。
Gary Rowe

1
@JörgW Mittag:私はあなたが「直交」という言葉を言うのが好きだと疑い始めています。;)
FrustratedWithFormsDesigner

5

OCamlは、必要なすべての機能を提供する唯一の言語です。(しかし、mixinについては知りません。)Ocsigenという名前のWebフレームワークさえあります。それは誇大宣伝言語以上のものであり、古い言語であり、実際のユーザーベース(企業、大学、趣味)と長年の改善とテストが行​​われています。 。


2
ただし、メタプログラミングはシングルパス外部ツール(CamlP4)によってのみ行われます。
SKロジック

今日の「誇大宣伝言語」の一部は、明日の「古い言語、実際のユーザーベース[...]と長年の改善とテスト」になる可能性があることに注意してください。彼らは、同じレベルの市場浸透と国民の受容さえ達成するかもしれません。:)
ヘイレム2012年

2

間違いなく、Scalaは要件に一致できます。

  1. コンパイルされ、JVMで実行されるため、win / linux / macになります。
  2. 関数型プログラミングとオブジェクト指向プログラミングの両方をサポートします。
  3. あなたが言及する機能的なものをサポートします。パターンマッチングは見栄えがよく、積極的に使用されています。JVMはサポートしていないため、末尾再帰のサポートはありませんが、場合によっては再帰呼び出しを最適化できます。
  4. メタプログラミングはサポートされていません。言語は素晴らしいです^ W DSLにはかなり良いです。(修繕)
  5. ミックスイン(特性)があります。
  6. Liftウェブフレームワークをご覧ください。言語の機能的特徴を使用し、高度な特徴を備えているため、非常に興味深いものです。他にもいくつかのWebフレームワークがあります(play!など)。
  7. 非常に安定したJVMに基づいています。
  8. 構文はかなりきれいです。そこには括弧の地獄(すみませんlispers、それは私の個人的な意見です)はなく、セミコロンの使用は多くの場合オプションに削減されています。

さらに、Scalaは(アクターによる)並列プログラミングを強力にサポートしています。Scalaコミュニティは成長しており、実際のプロジェクト(Twitter)で使用されています。この言語は、多くの機能と構文上の糖を備えているため、習得が非常に困難ですが、一度処理すると、間違いなくプログラミングを楽しむことができます。


clojureと比較した場合、Scalaの特性は、特性(インターフェース)がtype- linearizationを介してクラスを継承できるミックスイン構成を許可します。
prasonscala 2011年

2
4.メタプログラミング サポートされていません。DSLはメタプログラミングの助けなしに、高次関数とオーバーロードで実装されます。その結果、これらのDSLは制限され、制限され、遅くなります。Scalaではコンパイル時のコード生成は利用できません。Lispマクロのようなものはありません。
SKロジック

結局のところ、私はScala構文が本当に嫌いです...それは個人的なものです)
cnd

1
@ SK-logic私はそれをチェックしました、そして今、私はあなたに同意します。「DSL in Action」を調べたところ、Scala DSLの例があったので、DSLには問題ないと思いました。明らかにLisp、Clojureはここではるかにうまく機能します。
make_sense
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.