Vnanoのソースコードと開発リポジトリをGitHubで公開

Vnano Logo

6月2日のお知らせで概要をお伝えした通り、 RINEARNでは現在、Java® で記述された一般のソフトウェア上に搭載して使用するための、 小型・軽量スクリプト言語 & 処理エンジン「 Vnano (ブイナノ、VCSSL nanoの略) 」の開発が進行中です。

このVnanoについては2018年内の公開を目指しておりましたが、 先日の9月19日時点で、オンラインのソフトウェア開発プラットフォームである GitHub® において、 ソースコードを含む開発リポジトリを公開いたしました:

Vnano は現在も開発進行中ですが、サンプルコードやベンチマークプログラムなどは既に実行可能であるため、 ご興味をお持ちいただいた方は、実際にビルド・動作させて、スクリプトエンジンの使用感や方向性などをイメージしていただける状態となっています。

RINEARNでは、今後も引き続き上記の公開リポジトリにおいてVnanoの開発を進行し、バージョン1.0の正式リリースを目指します。

- 関連記事・Webページ -
- この記事の目次 -

Vnano について

Vnano は、Java で記述された一般のソフトウェア上に搭載し、 文字列データとして渡された計算式やちょっとしたスクリプトを処理する機能(いわゆる eval 的な機能)を提供するための、小型・軽量のスクリプトエンジンです。

言語仕様面では、C言語系のシンプルな文法を採用した簡易プログラミング言語のVCSSLをベースとし、 eval 的な用途には不要となる機能を大幅に削る事で、全体をコンパクトに抑えたサブセットとなっています。

また性能面では、一般的なPC環境での倍精度浮動小数点数(double)演算において、概ねスカラ演算時に数百MFLOPS程度、ベクトル演算時に数GFLOPS程度(共にピーク値)を見込んでおり、 ある程度のまとまった計算量の処理などもこなせる水準を目標にしています。

より詳しい概要や方向性などについては、下記の関連記事をご参照ください:

Vnano

Vnano のライセンス( MITライセンス )

Vnanoはオープンソースソフトウェアとして開発しており、ライセンスには「 MITライセンス 」を採用しています。 従ってVnanoは、ソフトウェアとして自由に使用できる上に、ソースコードの改造や流用なども、著作権表示・許諾表示さえ記載すれば自由に行えます。 商用・非商用の制限や、改造・流用先のソフトウェアがオープンソースかどうかに関する制限などもありません。

ソースコードを入手してビルド・実行する方法

今回は早速、実際にGitHub上の公開リポジトリからVnanoのソースコードを入手し、ビルドして実行してみましょう。

ダウンロード( git を使わず手動で行う場合)

まずは上記ページにアクセスし、画面右上から数段下くらいの位置にある「 Clone or download 」のボタン(緑色)をクリックします。 そして「 Download ZIP 」を選択して、ZIPファイル「 vnano-master.zip 」をダウンロードし、 それを右クリックしてメニューから「 すべて展開 」や「 ここに展開 」などを選んで展開します (※ このあたりの手順はOSの種類によって異なります)。

なお、展開時にセキュリティ的なエラーメッセージが表示される場合は、 ZIPファイルを右クリックして「 プロパティ 」を開き、 「 セキュリティ: 」の項目に「 許可する 」のチェックを入れてから、 再び展開してみてください。

展開が完了すると、同じ場所に「 vnano-master 」というフォルダができるため、 コマンドプロンプトやbash互換シェルなどのコマンドライン端末で、そのフォルダまで cd コマンドで移動してください:

cd 〜〜〜vnano-master       ※〜〜〜の部分はフォルダの存在場所のパス

git を使う場合は…

git の環境構築ができている場合は、以下のコマンドで手短に、 リポジトリをローカルに複製して入手する事もできます:

(コマンドライン端末で適当な作業フォルダ内に移動してから)
git clone https://github.com/RINEARN/vnano.git

実行すると、同じ場所に vnano というフォルダができるため、

cd vnano

で移動してください。

Vnanoエンジンのビルド

続いて、「 Vnanoエンジン 」を用意します。 これは、Vnanoのスクリプトを実行するためのスクリプトエンジン(処理系)です。 現在のVnanoはまだ正式リリース版ではないため、ビルド済みのエンジンは提供されていません。 なので、上で入手した中に含まれているソースコードから、手元でビルドする必要があります。

ビルドといっても、Vnanoエンジンは全てJava言語で実装されている上に、 外部ライブラリなどに依存せず単体で完結しているため、 色々と用意して格闘する必要はありません。 最低限Java開発環境(JDK)とJava実行環境(JRE)さえ入っていれば、一応のビルドが可能なようになっています。 これらが入っていない場合は、先にご用意ください。 要求バージョンはJava7以上です。

上で入手した中に、複数の環境に向けて自動ビルド用のファイルが用意されているので、それを利用しましょう。

Microsoft® Windows® をご使用の場合は、先ほどcdで移動したコマンドライン端末上で、以下のように入力します:

build.bat

Linux等をご使用の場合は以下です:

sudo chmod +x ./build.sh
./build.sh

OSを問わず、ビルドツールのApache Antが入っている環境では、以下の通りです:

ant -buildfile build.xml

繰り返し何度もビルドする場合には、最後の方法がお勧めです。 Apache Ant以外のビルドツールに向けたビルドファイルは、 現時点で標準では含まれていませんが、後々のタイミングでいくつか加わるかもしれません。 なお、単体テストを実行したい場合はJUnit4が必要ですが、 現時点の標準添付のビルドファイルでは実行されない状態になっています。 これについても後々で拡充予定です。

ビルドが正常に完了すると、同じフォルダ内に「 Vnano.jar 」が生成されます。 これがスクリプトを実行するためのVnanoエンジンです。

サンプルの実行や性能計測

サンプルのコンパイルと実行

続いて、上でビルドしたVnanoエンジンを使用し、実際にスクリプトを処理させてみましょう。

Vnanoは、ソフトウェア上に搭載して、その上での簡易スクリプト処理に使用するためのものなので ( 参照 )、 実行にはVnanoエンジンを搭載する側のソフトウェアも必要です。 Vnanoでは、そのようにエンジンを搭載する側のソフトウェアの事を「 ホストアプリケーション 」と呼びます。

先ほどダウンロードした中には、非常に単純なホストアプリケーションのサンプルコード「 Example.java 」も含まれています。 これはソースコード1枚で完結している100行程度のJavaアプリケーションで、 内部でVnanoエンジンを呼び出し、1から100までの和を単純に for 文で求めるスクリプトを処理させる内容になっています。 具体的なコード内容はGitHub上のこちらのページからブラウザ上で見る事ができます。

以下では、実際にこのホストアプリケーションのサンプルコードをコンパイルし、Vnanoエンジンと一緒に実行してみます。

まずはコンパイルです。VnanoエンジンはJavaの標準のスクリプトAPI( javax.script パッケージ )に対応しているため、 ホストアプリケーションは単体で普通にコンパイルできます:

javac Example.java -encoding UTF-8
※ -encoding UTF-8 は文字コードの指定で、このサンプルコードは UTF-8 で記述されているため、日本語のWindowsをご使用の場合は付けないとエラーになります。

続いて実行です。これは java コマンドの引数で、クラスパスに Vnano.jar を指定しつつ実行する必要があります。 簡単に言うとVnanoエンジンの存在場所を伝えるためなのですが、 この指定内容はOSの種類等によって僅かに(クラスパスの区切り文字が)異なります。

Microsoft Windows をご使用の場合は:

java -classpath ".;Vnano.jar" Example

Linux 等をご使用の場合は:

java -classpath ".:Vnano.jar" Example

※ 両者で違うのはセミコロン「 ; 」かコロン「 : 」かという点です。

正常な実行結果は以下の通りです:

Output from script: 5050

先にも少し述べましたが、これはスクリプト内で for 文を使用して 1 から 100 までの和を求めた値を出力していて、 ちゃんと正しい値になっています。

Vnanoエンジンが読み込まれて呼び出される流れ

このように Vnano.jar にクラスパスを通して実行すると、JARファイルのサービスプロバイダ機構により、 ホストアプリケーション内で呼び出している (コード参照) Java標準の javax.script.ScriptEngineManager クラスにVnanoエンジンが自動で検出され、 インスタンス化されます。 ホストアプリケーション側では、そうして取得したVnanoエンジンにスクリプトコードを渡して実行させます。

Vnanoエンジンの最上階層のクラスは org.vcssl.nano.VnanoEngine で、 これはJava標準の javax.script.ScriptEngine インターフェースを実装しているため、 ホストアプリケーション側では ScriptEngine インターフェースのメソッドを通じてVnanoエンジンの各機能を呼び出せます。 例えば、スクリプトコードを渡して実行させるには eval メソッドを呼び出します。

このような仕組みにより、ホストアプリケーション側のコードはVnanoエンジンの細かい実装に深入りする必要は無く、 Java標準のAPIのみを使用して開発・コンパイルできます。

ベンチマークプログラムでのピーク性能計測

ところで、Vnanoを搭載するホストアプリケーションの動作環境(計算機的なスペック等)において、 最大でどの程度までのスクリプト処理速度が得られるのかを、大まかに見積もりたい場合があるかもしれません。 そこで、上で用いたホストアプリケーションのサンプルコードの他に、 スクリプトエンジンの演算速度面での性能を計測するためのベンチマークプログラムも同梱されています。

ベンチマークプログラムのコンパイルと実行方法は、 先ほどのホストアプリケーションのサンプルコード Example.java と全く同じで、 以下のようにファイル名が異なるだけです:

Float64ScalarFlopsBenchmark.java
倍精度浮動小数点数(double, 64bit-float)での、スカラ演算(配列でない普通の変数同士の演算)の性能を計測
Float64VectorFlopsBenchmark.java
同様に倍精度浮動小数点数での、ベクトル演算(配列同士のSIMD演算)の性能を計測

実行には1分程度かかり、計測が完了すると複数行の内容が表示されますが、1行目が演算速度です。 単位は「 FLOPS(フロップス) 」で、1秒回に1回の演算を行った場合の演算速度が 1 FLOPS になります。 実際にはそれよりずっと速いので、単位に「 M(メガ、100万) 」や「 G(ギガ、10億)」などを付けて表示されます(MFLOPS、GFLOPS等)。

ただし、これらのベンチマークプログラムで実行しているスクリプトコードは、 可能な限りの性能を引き出す事だけを考えた記述内容になっています。 従って、これらのベンチマークで計測できるのは、 実際はコードの記述内容によって大きく異なるはずである性能の、最良条件における最大値(ピーク性能的なもの)です。 普通に書いた実用目的のコードでの演算速度は、恐らくピーク値からはだいぶ落ちる事が見込まれるため、 その点には留意が必要です。

現状の開発段階と今後

最後に、Vnanoの現時点での開発段階についてです。 冒頭でも触れた通り、Vnanoはまだ開発の進行中であり、リポジトリの公開には至りましたが、 バージョン1.0の正式リリースにはまだ作業量的に少し距離がある段階です。

機能的な面では、VnanoはもともとVCSSLの言語仕様から用途に合わせて機能を絞ったサブセット ( 参照 )である事から、 当初の予定していた範囲を既にほぼカバーできています。

一方でテストの固まり具合では、全体の比率的にはまだまだ先が長いという段階で、 処理系を構成するコンポーネントによって相当なばらつきもあります。 従って、リファクタリングと呼べるレベルの整理を一度も経ていないコンポーネントもあり、 そのようなコンポーネント内には、手っ取り早く処理系全体が動く段階に到達するための、 場当たり的な足場のようなコードも残っています。

よって今後しばらくの間は、テストコードを追加しながらバグを潰す工程が続き、その後にある程度集中的なリファクタリングを行う予定です。

そこまでが済んだ段階で、ベータ版相当となるバージョン0.9(もしくは、状況に応じてより低いバージョン)をリリースする予定です。 その時点で、それまでの過程と課題などの色々な面を踏まえて、改めて正式リリース版となるバージョン1.0の目標について検討する見込みです。

次回は、Vnanoエンジンの構造的な面(アーキテクチャ)について解説する予定です!

※: GitHubは、GitHub inc., の米国及びその他の国における登録商標または商標です。
※: OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。
※: Windows は、米国 Microsoft Corporation の米国およびその他の国における登録商標です。この記事は独立著作物であり、Microsoft Corporation と関連のある、もしくはスポンサーを受けるものではありません。
※: Linux は、Linus Torvalds 氏の米国およびその他の国における商標または登録商標です。
※ その他、文中に使用されている商標は、その商標を保持する各社の各国における商標または登録商標です。