インタプリタ実装のカスタマイズ

通常スクリプトはJavaバイトコードにコンパイルされて実行されますが、スクリプトが実行されるまでの手順はContextの属性(pnutsImpl)を設定することでカスタマイズできます。 たとえば、Javaバイトコードにコンパイルせずに実行したり、コンパイルしたものをキャッシュして二度目以降はコンパイルしないようにすることができます。

pnuts.lang.Implementation オブジェクト

pnuts.lang.Implementationインタフェースは、スクリプトインタプリタ実装の抽象インタフェースを定義します。 Implementation のインスタンスは、あるContextに対応づけられます。 Context.setImplementation() メソッドと Context.getImplementation() メソッドは、それぞれその settter、getter メソッドです。

既定義のImplementationクラス

次のクラスは、そのインタフェースを実装するクラスで、Pnutsの配布パッケージに含まれています。

pnuts.lang.PnutsImpl
ASTインタプリタ。
pnuts.compiler.CompilerPnutsImpl
On-the-fly コンパイラ。pnutsコマンドを使った場合のデフォルトクラス。
pnuts.ext.CachedPnutsImpl
Mixed モード。コンパイル(またはパーズ)されたスクリプトをキャッシュして再利用する。
pnuts.security.SecurePnutsImpl
セキュアモード。Java2 Security APIを使ってスクリプトを安全に実行する。
pnuts.security.JAASPnutsImpl
JAASを使ってスクリプトを安全に実行する。

実行効率の観点でのImplementation クラスの選び方については、「パフォーマンス向上のためのヒント」をご覧ください。

import pnuts.lang.*;
import pnuts.ext.*;

Context context = new Context();
context.setImplementation(new CachedPnutsImpl());
Pnuts.loadFile(fileName, context);

SecurePnutsImplおよびJAASPnutsImpl は、他のPnutsImplサブクラスにセキュリティ機能を追加するためのラッパクラスです。スクリプトがリモートホストからダウンロードされた場合でも安全に読み込むことができます。詳細は、「コードソースに基づく安全なスクリプティング」「ユーザ認証に基づく安全なスクリプティング」をご覧下さい。

context.setImplementation(new SecurePnutsImpl(new CompilerPnutsImpl()));
Pnuts.load(new URL("..."), context);

プロパティ'pnuts.lang.defaultPnutsImpl'

Pnuts APIが最初に読み込まれる時に、プロパティpnuts.lang.defaultPnutsImplがPnutsImplのサブクラスである場合、そのクラスがデフォルトのPnutsImplとして使われます。

SecurePnutsImplJAASPnutsImplは、デフォルトコンストラクタを持たないので、このプロパティで指定して使うことはできません。

どのImplementationが使われているかを知るには、Context.getImplementation()を呼び出します。

> getContext().getImplementation()
pnuts.compiler.CompilerPnutsImpl@1764be1
>