BeanShell その1

BeanShellはJavaと似てる文法(70%ぐらいかな)を持つスクリプト言語だ。

つまり、プログラムソースをコンパイルせずにすぐ実行できるということだ。

BeanShellはJavaで作られていて、JVM上で動く。

 

今までJVM上で動く言語いくつかを見てきた。

例えば、JRubyJython、Scala、Groovy、Closureなど。。

これらの言語はJava文法の冗長さを減らし、言語の文法を表現豊かにし、

プログラムの作成を容易にしている。

それに並行処理機能など、言語特有の機能を付加したのもある。

 

真面目に勉強したScala言語を(今は思い出さないが -_-)振り返ってみると、

本当にJavaより少ない行数で多くのことができた。

 

しかし、問題は新しい文法を学ばなければならないということだ。

このコストは、われらのような会社員には決して軽いものではない。

われらには、飲酒、ゲーム、カラオケ、といった健全な文化を営む時間も

必要なのではないか。

 

Java言語文法をほぼそのまま活用できるBeanShellはこういう点で

格別なものだと思う。

 

もちろん、上記に並べた言語はスクリプトはもちろん、コンパイルもできるし、

メジャー級の機能を持っている。

それに比べるとBeanShellは小さいスクリプト言語に過ぎないので、

完全比較は無理だ。

 

しかし、JavaリソースをJavaと似てる文法でスクリプト的に活用するという

側面から見ると、断然BeanShellが有利ではないかと思う。

なぜなら、文法がJavaと似ていて、すごく簡単だからだ。

関数宣言とか、いくつか違う文法はあるが、そんなに難しくない。

 

BeanShellのBeanはJavaを特徴づけているだろう。

後ろのShellはスクリプトを強調しているだろう。

まさにJavaによるスクリプト。

 

ちなみにスクリプトファイル形態で実行できるだけでなく、

1:1のコンソールモードも持っている。

例えば、

import java.io.FileReader;

f = new FileReader("test.txt");

 

のようなソースを1行1行ずつ実行できる。

 

このBeanShellはJava標準の一つにもなった。

「JSR 274: The BeanShell Scripting Language」

という題名で...

 

次期JDKに標準で組み込まれるとすごく便利になりそうだ。

(ただし、組み込まれるかどうかは不明)

環境に必要なスクリプトをJavaで書いて実行する...

もうLinuxbashperlで難しいスクリプトを書かなくてもいいってこと。

 

環境スクリプトだけでなく、自分のプログラムに組み込んで活用することもできるし、

他のいくつかのプログラムでは既に使っている。

たとえば、JMeterでテストスクリプトの作成にBeanShellが使える。

 

スクリプト言語でプログラムの一部を構成するのはゲーム分野では

よくあることだ。特にLuaという言語が有名。これはWorld  of Warcraft

拡張モジュールを書くのに使われている。

 

次回はBeanShellの簡単な使用法と文法をまとめてみようか。

 

参考

http://www.beanshell.org/

http://journal.mycom.co.jp/column/jsr/031/index.html

 

Erlang 基礎ポイント1 - 紹介, 文法

1・2年ごとに新しい言語を勉強している。

PythonScalaLispに続けて、今年からはErlang.

メインはJavaJavascriptだが、他の言語を接することで

問題解決やアイデア作りに役立っているを実感している。

これから数回に分けて勉強した内容を書くつもり。

目標は網羅でなく、ポイントをつかむことだ。

 

Erlangとは

Erlangはエリクソン社が開発したプログラミング言語である。

少ないコード量で並列処理・ネットワーク処理を記述できる。

LinuxWindowsをはじめとして、色々なOSで動く。

 

参考書 

練習問題が曖昧な部分があるが、大体読みやすい。

実行環境

  1. REPL(Read Eval Print Loop)ができるシェル(erl)を備えている。勉強や検証時にうってつけだ。
  2. プログラムがある程度規模がある場合、コンパイル(erlc)して実行(erl)する。

 

文法

行の最後にはピリオドを置く。

 1> Fruit = "apple".

変数は大文字で始まる。

1> Fruit = "apple".

"apple"

 

小文字で始まると、アトムになる。

アトムはJavaenum定数のようなものだと考えればいいだろう。

変数のようにメモリ番地を指すのではなく、

名前(リテラル)そのものが意味を持つ。

 

つまり、以下のappleappleそのもので、メモリのある番地を

表すものではないのだ。

2> apple.

apple

 

=を使った変数への代入は一回しかできない。

2回代入するとエラーになる。

10> Fruit = "apple".

"apple"

11> Fruit = "mango".

** exception error: no match of right hand side value "mango"

変数を不変にすることで、変数の値がどう変わるかをしなくていいので、

プログラムの把握がしやすい。

 

タプルは複数の要素を一つにまとめるもの。

Javascriptのオブジェクトリテラルに似ている。

2> Person = { name, "Duke" }. 

{name,"Duke"}

 

実はErlangで=は代入でなくパターン照合を意味する。

6> Location = { "Japan", "Tokyo" }.

{"Japan","Tokyo"}

7> { Country, City } = Location.

{"Japan","Tokyo"}

8> Country.

"Japan"

9> City.

"Tokyo"

10> {A, atom} = { "Foo", atom}. 

{"Foo",atom}

11> A.

"Foo"

 

Locationには、まだ値がバインドされていないので、Locationにタプルが入り、無事実行される

Locationに値が入っていたとしても、その値が{"Japan", "Tokyo"}なら、6行は真となる。

もし違う値が入っていたら、エラーとなる。

10行で左辺のatomは、ただのアトムであり、右辺のタプルと要素数を合わせるための

ダミーのようなものだ。

 


リストを作るためのネイティブ表記がある。

 15> Planets = [{mercury, 1}, {venus, 2}, {earth, 3}].

[{mercury,1},{venus,2},{earth,3}]

16> [First,Second|Remaining] = Planets.

[{mercury,1},{venus,2},{earth,3}]

17> First.

{mercury,1}

18> Second.

{venus,2}

19> Remaining.

[{earth,3}]

 

22> lists:nth(1, Planets).

{mercury,1}

 

リストから要素を取り出したい時はパターン照合を使う。

listsモジュールのnthのような関数も使えるが、パターン照合の方が

Erlangらしくていいのでは?

 

 今日はここまで。

 

ブログを始めます。

今までは、調べて分かった情報やメモなどを

別途ファイルや紙に書いて、非公開にしていましたが、   

どこでもアクセスできる・考えをまとめられる・文章力を高められる

といった長所から、ブログを書いてみようと思っています。

これからの情報だけでなく、今までの情報も

ブログに載せるつもりです。

不正確な部分がありましたら、ご指摘いただければありがたいと思います。

宜しくお願いします。