BeanShellもGroovyと同様にJavaで実装されたスクリプト言語です。Javaに似た文法を使えるという点で、両者は似通っていますが、もちろんいくつかの点で違いがあります。
Groovyが「Javaに似た文法+Rubyのような文法」を目指している
のに対して、
BeanShellはJavaと完全に同じ文法のスクリプト言語を目指しています。ですから、Groovyの様にクロージャは使えないですし、セミコロン、かっこの省略もできません。ですが、BeanShellはBeanShellでJavaの文法+簡略化された文法を許しています。たとえば以下のようなものです。
・型のない変数
・プリミティブ型のAutoBoxing/Unboxing(JDK1.5と同等)
・forループの拡張(JDK1.5と同等)
・JavaBeansプロパティやMapへの簡略化されたアクセス
また、Groovyのクロージャと同等の機能として、ScriptedMethodというのがあります。以下のGroovyとBeanShellのコードは同等です。
また、スクリプトの内部表現もかなり異なっています。
BeanShellがスクリプトを構文木として表現し、Javaオブジェクトへのアクセスにリフレクションを使用するのに対し、Groovyではスクリプトを一旦Javaのクラスに変換します。このため、Groovyスクリプトにはバイトコードにコンパイルすることが出来たり、パフォーマンスの向上などのメリットがありますが、その一方で。BeanShellよりJavaVMの制限を直接受けやすくなっており、ちょっと変なことをやるとすぐIncompatibleClassChangeErrorとかが発生してしまいます。
個人的にはBeanShellの方が機能も豊富だし、スクリプト言語らしい動的なプログラミングもやりやすいので好みです。動的にクラスパスを変更したり、クラスパス上においてある.javaファイルを読み込んだりといった機能は強力ですし、APIもGroovyよりわかりやすいと思います。ただ、Groovyの文法はやっぱり魅力で、手続き的な処理はBeanShell、宣言的なものはGroovyというように、当面は目的に応じて使い分けて行くことになりそうです。
Groovyが「Javaに似た文法+Rubyのような文法」を目指している
のに対して、
BeanShellはJavaと完全に同じ文法のスクリプト言語を目指しています。ですから、Groovyの様にクロージャは使えないですし、セミコロン、かっこの省略もできません。ですが、BeanShellはBeanShellでJavaの文法+簡略化された文法を許しています。たとえば以下のようなものです。
・型のない変数
・プリミティブ型のAutoBoxing/Unboxing(JDK1.5と同等)
・forループの拡張(JDK1.5と同等)
・JavaBeansプロパティやMapへの簡略化されたアクセス
また、Groovyのクロージャと同等の機能として、ScriptedMethodというのがあります。以下のGroovyとBeanShellのコードは同等です。
(Groovy) hello = {println("hello, world")} hello() (BeanShell) void hello() { print("hello, world"); } hello()
また、スクリプトの内部表現もかなり異なっています。
BeanShellがスクリプトを構文木として表現し、Javaオブジェクトへのアクセスにリフレクションを使用するのに対し、Groovyではスクリプトを一旦Javaのクラスに変換します。このため、Groovyスクリプトにはバイトコードにコンパイルすることが出来たり、パフォーマンスの向上などのメリットがありますが、その一方で。BeanShellよりJavaVMの制限を直接受けやすくなっており、ちょっと変なことをやるとすぐIncompatibleClassChangeErrorとかが発生してしまいます。
個人的にはBeanShellの方が機能も豊富だし、スクリプト言語らしい動的なプログラミングもやりやすいので好みです。動的にクラスパスを変更したり、クラスパス上においてある.javaファイルを読み込んだりといった機能は強力ですし、APIもGroovyよりわかりやすいと思います。ただ、Groovyの文法はやっぱり魅力で、手続き的な処理はBeanShell、宣言的なものはGroovyというように、当面は目的に応じて使い分けて行くことになりそうです。