BeanShell その1
BeanShellはJavaと似てる文法(70%ぐらいかな)を持つスクリプト言語だ。
つまり、プログラムソースをコンパイルせずにすぐ実行できるということだ。
BeanShellはJavaで作られていて、JVM上で動く。
今までJVM上で動く言語いくつかを見てきた。
例えば、JRuby、Jython、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で書いて実行する...
もうLinuxのbashかperlで難しいスクリプトを書かなくてもいいってこと。
環境スクリプトだけでなく、自分のプログラムに組み込んで活用することもできるし、
他のいくつかのプログラムでは既に使っている。
たとえば、JMeterでテストスクリプトの作成にBeanShellが使える。
スクリプト言語でプログラムの一部を構成するのはゲーム分野では
よくあることだ。特にLuaという言語が有名。これはWorld of Warcraftの
拡張モジュールを書くのに使われている。
次回はBeanShellの簡単な使用法と文法をまとめてみようか。
参考
http://journal.mycom.co.jp/column/jsr/031/index.html
Erlang 基礎ポイント1 - 紹介, 文法
1・2年ごとに新しい言語を勉強している。
Python・Scala・Lispに続けて、今年からはErlang.
メインはJava・Javascriptだが、他の言語を接することで
問題解決やアイデア作りに役立っているを実感している。
これから数回に分けて勉強した内容を書くつもり。
目標は網羅でなく、ポイントをつかむことだ。
Erlangとは
Erlangはエリクソン社が開発したプログラミング言語である。
少ないコード量で並列処理・ネットワーク処理を記述できる。
Linux・Windowsをはじめとして、色々なOSで動く。
参考書
練習問題が曖昧な部分があるが、大体読みやすい。
実行環境
- REPL(Read Eval Print Loop)ができるシェル(erl)を備えている。勉強や検証時にうってつけだ。
- プログラムがある程度規模がある場合、コンパイル(erlc)して実行(erl)する。
文法
行の最後にはピリオドを置く。
1> Fruit = "apple".
変数は大文字で始まる。
1> Fruit = "apple".
"apple"
小文字で始まると、アトムになる。
アトムはJavaのenum定数のようなものだと考えればいいだろう。
変数のようにメモリ番地を指すのではなく、
名前(リテラル)そのものが意味を持つ。
つまり、以下のappleはappleそのもので、メモリのある番地を
表すものではないのだ。
2> 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らしくていいのでは?
今日はここまで。
ブログを始めます。
今までは、調べて分かった情報やメモなどを
別途ファイルや紙に書いて、非公開にしていましたが、
どこでもアクセスできる・考えをまとめられる・文章力を高められる
といった長所から、ブログを書いてみようと思っています。
これからの情報だけでなく、今までの情報も
ブログに載せるつもりです。
不正確な部分がありましたら、ご指摘いただければありがたいと思います。
宜しくお願いします。