4

エンドユーザー向けの簡単な埋め込みスクリプト言語を必要とする計算指向のアプリの言語を評価しています。私は、Scalaを主要な基礎言語として使用し、Jythonをスクリプトインターフェイスとして使用することを考えていました。:*Scalaの魅力は、行列オブジェクトの要素ごとの乗算などのメソッドを定義し、それを中置構文で使用できることa :* bです。ただし、:*はPythonでは有効なメソッド名ではありません。Jythonはこれにどのように対処しますか?

柔軟性があるため、スクリプト言語としてScalaを使用することを検討します。しかし、型推論を使用しても、matlabのような動的言語に慣れている一般ユーザーにとって、すべてのvalおよびvar必要な型定義は多すぎます。比較すると、Booには機能する可能性のあるオプション-duckyオプションがありますが、.NETではなくJVMを使用したいと思います。-duckyScalaはないと思います。

より一般的には、潜在的ディリクレ割り当てをモデル化するために、次のDSL(http://www.cs.utah.edu/~hal/HBC/から)を検討してください。

model {
      alpha     ~ Gam(0.1,1)
      eta       ~ Gam(0.1,1)
      beta_{k}  ~ DirSym(eta, V)           , k \in [1,K]
      theta_{d} ~ DirSym(alpha, K)         , d \in [1,D]
      z_{d,n}   ~ Mult(theta_{d})          , d \in [1,D] , n \in [1,N_{d}]
      w_{d,n}   ~ Mult(beta_{z_{d,n}})     , d \in [1,D] , n \in [1,N_{d}]
}

result = model.simulate(1000)

この構文は、階層ベイズモデリングに精通しているユーザーにとっては素晴らしいものです(たとえば、PyMCMCと比較して)。Pythonのような基本的なスクリプト言語にアクセスできることに加えて、そのような構文を簡単に定義できるJVM上の言語はありますか?

感謝します。

4

3 に答える 3

2

個人的には、Scalaのオーバーヘッドを誇張していると思います。たとえば、これは次のとおりです。

alpha     ~ Gam(10,10)
mu_{k}    ~ NorMV(vec(0.0,1,dim), 1, dim)     , k \in [1,K]
si2       ~ IG(10,10)
pi        ~ DirSym(alpha, K)
z_{n}     ~ Mult(pi)                          , n \in [1,N]
x_{n}     ~ NorMV(mu_{z_{n}}, si2, dim)       , n \in [1,N]

次のように書くことができます

def alpha =                   Gam(10, 10)
def mu    = 1 to 'K map (k => NorMV(Vec(0.0, 1, dim), 1, dim)
def si2   =                   IG(10, 10)
def pi    =                   DirSym(alpha, 'K)
def z     = 1 to 'N map (n => Mult(pi))
def x     = 1 to 'N map (n => NormMV(mu(z(n)), si2, dim))

この特定のケースでは、定義、、、などを除いてほとんど何も行われず、からGamまたはへの暗黙の定義を作成し、後でそのような定義を格納するテーブルから読み取ります(同等のものなど)。このような暗黙の定義は次のようになります。VecNorMVSymbolIntDoubleloadM

import scala.reflect.Manifest
val unknowns = scala.collection.mutable.HashMap[Symbol,(Manifest[_], Any)]()
implicit def getInt(s: Symbol)(implicit m: Manifest[Int]): Int = unknowns.get(s) match {
  case Some((`m`, x)) => x.asInstanceOf[Int]
  case _ => error("Undefined unknown "+s)
}
// similarly to getInt for any other desired type

それもそのように書くことができます:

Model (
  'alpha    -> Gam(10, 10),
  'mu -> 'n -> NorMV(Vec(0.0, 1, dim), 1, dim)      With ('k in (1 to 'K)),
  'si2      -> IG(10, 10),
  'pi       -> DirSym('alpha, 'K),
  'z -> 'n  -> Mult('pi)                            With ('n in (1 to 'N)),
  'x -> 'n  -> NorMV('mu of ('z of 'n), 'si2, dim)) With ('n in (1 to 'N)) 
)

この場合GamMult渡されるシンボルを処理するために、、などを少し異なる方法で定義する必要があります。ただし、「'」の超過は間違いなく迷惑です。

~HBCに独自の特異性がないわけではありません。たとえば、型宣言の必要性、インデックスの前のアンダースコア、 " "を""に置き換える必要性\in、または後で先行する必要があるバックスラッシュなどです。HBC、MathLab、またはその人が慣れている他のものの代わりにそれを使用することから本当の利益がある限り、彼らは少し自分自身を悩ますでしょう。

于 2009-08-19T18:51:50.423 に答える
0

編集:

すべての議論を読んだ後、おそらく最善の方法は、DSLの文法を定義し、それをscalaの組み込みの解析ユーティリティで解析することです。

あなたが何を達成しようとしているのかわかりません。あなたのスクリプト言語は、より「何」または「どのように」タイプになりますか?あなたが私に与えた例は、「何」タイプのDSLです->あなたはあなたが達成しようとしていることを説明し、実装については気にしません。これらは問題を説明するために最もよく使用される言語であり、アプリを構築しているドメインによっては、それが最善の方法だと思います。ユーザーは、問題のドメインに非常に馴染みのある構文で問題を説明するだけです。アプリケーションはこの説明を解析し、シミュレーションを実行するための入力として使用します。このためには、文法を構築し、それをscala解析ユーティリティで解析するのがおそらく最善の方法です(ユーザーに機能の小さなサブセットのみを公開したい)。

「方法」スクリプトが必要な場合は、すでに確立されているスクリプト言語を使用するのが最善の方法です(ループや基本的なデータ構造などを自分で実装する場合を除く)。

システムの設計では、常にトレードオフが必要になります。ここでは、ユーザーに公開する機能の量とスクリプトの簡潔さの間にあります。私自身、仕事を成し遂げるためにできるだけ少ない機能を公開し、「どのように」それを成し遂げるつもりです。シミュレーションで問題が発生した場合、ユーザーは問題をどのようにシミュレートするかを知る必要はありません。結果を修正し、妥当な時間で実行します。

完全なスクリプト言語をユーザーに公開する場合、DSLはそのスクリプト言語の小さなAPIになり、ユーザーはそのフルパワーを使用できるように完全な言語を学習する必要があります。また、ユーザーにフルパワーを使用させたくない場合もあります(アプリに大混乱をもたらす可能性があります)。たとえば、アプリケーションがインターネットに接続する必要がないのに、なぜTCPソケットサポートを公開するのでしょうか。それはセキュリティホールの可能性があります。

--次のセクションでは、可能なスクリプト言語について説明します。私の上記の答えはそれらを使用することを勧めませんが、完全を期すために議論を残しました。

私はそれを使った経験はありませんが、Groovyを見てください。これは、JVM用の動的に型付けされたスクリプト言語です(JVMサポートはおそらくJDK 7で改善される予定invokedynamicです)。また、演算子のオーバーロードDSLの書き込みも適切にサポートしています。残念ながら、少なくとも私の知る限りでは、ユーザー定義の演算子はサポートされていません。

私はまだscalaを使います(静的型付けが好きで、その型推論が良いと思うからです:)。スクリプトのサポートは非​​常に優れており、ほとんどすべてのものを母国語のサポートのように見せることができます(たとえば、そのアクターライブラリを見てください!)。また、関数型プログラミングを非常によくサポートしているため、スクリプトを非常に短く簡潔にすることができます。また、利点として、Javaライブラリのすべての機能を自由に使用できます。

スクリプト言語としてscalaを使用するには、スクリプトをで終わるファイルに入れて.scalaから実行しますscala filename.scala。ScalaとJRubyを比較して、議論のためのスクリプト言語としてのScalaを参照してください。

于 2009-08-19T16:19:40.107 に答える
0

JVMスクリプト言語(JavaScript Rhino、JRuby、Jython、Groovy)の中で明らかな容疑者は、ユーザー定義の演算子(おそらく必要になるでしょう)をサポートしていません。ファンもそうではありません。

スーパーレーターの宝石でJRubyを使ってみてください。

于 2009-08-19T20:12:31.820 に答える