忍者ブログ

2024-05-04(Sat)

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

2010-01-19(Tue)

スクリプトに対応したアプリケーションを作る

Scalaを始めてもうすぐ1週間。やっとScalaに慣れてきました。

ところで、Scalaというのはスクリプト言語であると言われます。スクリプト言語とは、あるアプリケーションの上で動かせる言語のことですが、実際、自分の作ったアプリケーションにスクリプトを組み込むにはどうすればいいんだろうとふと思いました。


実は、スクリプト言語には必ずコンパイラもしくはインタプリタが準備されていて、ライブラリのどこかに隠されているんです。

例えばLuaは、C/C++で書かれたプログラムに簡単にスクリプトを組み込むことができます。

(参考リンク)
"C++からLuaスクリプトを実行する"
http://blog.livedoor.jp/akf0/archives/51600634.html

"C言語アプリケーションに Pythonを組み込む"
http://d.hatena.ne.jp/Wacky/20060103/1136292735

ではJavaではどうするかといえば、Bean Scripting Framework(BSF)を使う方法が1つと、C/C++の場合と同様に、言語ごとに準備されているコンパイラ/インタプリタを呼び出すという方法があります。


(参考リンク)
"Embedded Scala Interpreter"
http://speaking-my-language.blogspot.com/2009/11/embedded-scala-interpreter.html

"Java技術最前線 11月のお題「Java関連スクリプト言語」第2回"
http://itpro.nikkeibp.co.jp/article/COLUMN/20051114/224543/


以下は、Scala上でScala&JRubyを走らせる方法です。しかも同時に走らせてみようという無謀なものです。

Scalaで組み込みインタプリタを実行すると、実行時にscala-compile.jarとscala-library.jarが上手く読み取られず、"object scala not found"というエラーが出てしまいます。そのあたりの細工をちょこっと行っているため、JRubyインタプリタに比べて冗長な表現になっています。。残念。。

(ただし以下のコードを実行するには、jruby.jarをプロジェクトのライブラリとしてリンクしておく必要があります。その方法はNetBeansのリファレンスや、JARの読み込み方法を解説したブログなどを参照してください。)


package scalaonscala

import scala.tools.nsc._
import scala.util.DynamicVariable

import org.jruby.Ruby


class Evaluator {
val settings = new GenericRunnerSettings(println _)
val i = new Interpreter(settings)

{
val origBootclasspath = settings.bootclasspath.value
val compilerPath = jarPathOfClass("scala.tools.nsc.Interpreter")
val libPath = jarPathOfClass("scala.ScalaObject")
val pathList = List(compilerPath,libPath)
settings.bootclasspath.value = (origBootclasspath :: pathList).mkString(java.io.File.separator)
}

def eval(line: String): Any = {
i.interpret(line)
Evaluator.result.value
}

def jarPathOfClass(className: String) = {
val resource = className.split('.').mkString("/", "/", ".class")
val path = getClass.getResource(resource).getPath
val indexOfFile = path.indexOf("file:")
val indexOfSeparator = path.lastIndexOf('!')
path.substring(indexOfFile, indexOfSeparator)
}
}

object Evaluator {
val result = new DynamicVariable[Any](())
}

object EvalTest {
def main(args: Array[String]): Unit = {
val e = new Evaluator

println("Hello, Scala!")
var r = e.eval("println(\"Hello, Scala on Scala!\")")
println(r)

r = e.eval("println(\"Hello, Scala on Scala!!!!\")")
println(r)

val runtime = Ruby.getDefaultInstance();
runtime.evalScriptlet("puts \"Hello, Ruby on Scala!\"");
runtime.evalScriptlet("puts \"Hello, Ruby on Scala!!!!!\"");
}
}

object Hoge {
def somefunc = "mogemoge"
}



実行してみた結果がコレ↓




おぉ!ちゃんと実行されています!

ただし、インタプリタが起動するには時間がかかるらしく、Ruby, Scalaのいずれも最初の1行を処理するのに数秒かかり、次の1行からは瞬時に実行されました。


ここでびっくりするのは、Scala上でScalaが動いているということ。ちなみに、Javaの上でJavaを走らせることも可能です。

実際、このような方法でスクリプトはアプリケーションに実装されています。GimpやBlenderはPythonを実装していますし、MaxはJava/JavaScript/Pythonを実装しています。



これで自作ソフトでもスクリプトが使えるようになりますね!すばらしすすす。
PR

2010-01-19(Tue)

集合と写像

おはようございます。数式をブログに貼り付けれる「Formula」というをサービスを見つけたので早速サンプル。

  

綺麗に表示されてますでしょうか?? 本当はWikipediaでいうところのTexのタグがほしいところだけど、まぁしょうがないか。


------


昨日Ackeyと一緒に圏論を勉強したら、関数型プログラミングの本質がだいぶわかってきました。

関数型指向では、全ての問題は集合Xから集合Yへの写像fがあるとして、

  

と表現できることがもっとも"扱いやすく"、美しいとされているみたいです。

その点、命令型指向では、モジュール(手続きをまとめた="抽象化した"まとまり)の記述には関数やオブジェクトを使うものの、ミクロな部分は手続きを記述することに終始します。このことが関数型と命令型の大きな違い。

特にその違いが出てくるのが、配列やリストの処理。


関数型言語では、配列やリストを「集合」であると捕え、写像する関数を使って値を処理するという風に処理します。具体的には次のような構文が使われます。

  print( Array(1,2,3,4,5).map(_*2) ) // 2,4,6,8,10が表示される

命令型では、その手続きを考えて、一般には次のように処理します。

  int[] a = {1,2,3,4,5};
 
   for(int i=0; i<5; i++){
     print( a[i]*2 );
   }

どちらが直感的かは、見て分かることと思います。

この処理の違いは、"関数が引数としてとれる"からと見ることもできますが、そうではなくて、"計算とは、ある要素からある要素への写像で表すことができる"という見方があり、その結果として関数が引数に渡せるようになっていると考えるのがベストだと感じました。


とりま、百聞は一見に如かず。

次回から、Scalaの能力をフルに生かしたプログラムを作っていこうと思います。

Calender :

04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

New Comments :

[11/18 DSLR-A900]
[02/03 daveenbooh]
[02/03 tiaunaande]
[02/03 arnottkilb]

Profile :

HN:
funatii
年齢:
36
HP:
性別:
男性
誕生日:
1987/11/02
職業:
音響設計学科3年
趣味:
メディアアート・散歩

for mobile :

Search for funattii :

Welcome to funattii's blog !