XREA.COM LogoXREA.COM Ad

NILScript

NILScript ロゴ

NILScript(エヌアイエルスクリプト)は、JavaScriptベースのスクリプト実行環境です。
現在の所、SpiderMonkeyを使用したWindows用のスクリプトホストである「NG with JSAPI for Win32(仮称)」のスクリプトとして実装された処理系が存在します。
動作確認は32ビット版WindowsXPでしか行っていませんが、Windows7や64ビット版での動作例もあるようです。9x系及び2000未満のNT系では動作しないはずです。
Wine環境では一部の機能が正常に動作しませんが、そのうち(Wine側で修正されなければ)改善予定です。

Download

Latest zipped package(executable binary + base scripts + samples + documents)
※テスト版であるため、頻繁に更新される可能性があります。不具合に気付いた場合は、最新版でも発生するかどうか確認してください。

Link

Twitter(@NILScript)
開発状況の配信、連絡の受け付けなど
BBS
更新情報の掲載、動作不動作報告などの受け付け(書き込み時には、メール欄に「sage」と入力する必要があります)
NILScriptブログ
特徴や使用例の紹介記事
Facebookページ

特徴

JavaScript 1.8.1ベース
NILScriptのスクリプトエンジン部分は、Firefoxなどで使用されているJavaScriptエンジン「SpiderMonkey」を使用しています。
JavaScriptは、動的Webページやブラウザの拡張機能、デスクトップガジェットなど様々な場面で使用されており、多くの開発者にとってなじみ深く、情報源も充実しています。JavaScriptを使ったことがなくても、C言語やJavaなどの経験者であれば、スムーズに習得できるはずです。
ブラウザで使用されていることから、今後の仕様変更で互換性が失われる可能性は低く、盛んに高速化などの改良が進められているのも魅力的です。
継承やミックスイン(多重継承)に対応した独自のクラス機構
JavaScript非標準のクラスを簡単に定義できるように、独自のクラス機構が用意されています。
インスタンスのメソッドやプロパティの他、クラス自体にもメンバを定義できます。
既存のクラスに後からメンバを追加することも可能です。
また、オブジェクトの特定のメンバへのアクセスにフック関数を仕込むアスペクト指向プログラミングのような機能も用意されています。
標準オブジェクトへの拡張
文字列や配列などの標準オブジェクトに、多数の便利なメソッドが追加されており、いちいち自分で定義することなく利用できます。
ジェネレータの拡張
JavaScript1.7では、値を順に返す「ジェネレータ」オブジェクトが追加されています。NILScriptでは、このジェネレータに、列挙される要素にフィルタリングなどの加工を行って列挙する新たなジェネレータを返すメソッド群が追加され、配列などの加工処理をスマートに記述できるようになっています。
よく使用される機能をミックスインとして用意
イベント駆動、ストリーム読み書き、ロック機構などの機能がミックスインとして用意されており、簡単に自作のクラスに組み込んで利用できます。
DLLなどのネイティブコード関数の呼び出し、構造体バッファの直接操作機能
WinLibrary/NativeFunction/Structなどのクラスを利用することで、DLLなどが提供する関数を簡単に呼び出せます。
NILScriptの標準機能としては用意されていない機能も、WindowsのAPIやサードパーティ製DLLを呼び出せば、別途C言語など他の言語を使うことなく、比較的簡単に実現できます。
また、機械語の関数を16進数列として埋め込んで呼び出すことも可能です。
ネイティブなマルチスレッドに標準対応
Thread.create()メソッドを使用することで、スクリプトの関数を新規スレッドで並列実行させられます。クロージャ変数へのアクセスなども、通常の関数呼び出しと同様に可能です。
また、並行処理の制御を補助するMutexやSignalなどのクラス、LockableMixinなどの機能も用意されています。
各種マルチバイト文字列を扱うMBStringクラス
JavaScriptの仕様上、スクリプトの内部文字列はUTF-16のUnicode文字列として扱われるため、2バイト文字の駄目文字問題に悩まされることはありません。
さらに、別途マルチバイト文字列バッファを扱うMBStringクラスが用意されており、システム標準のShift_JISエンコーディングの他、UTF-8やEUC-JPなどのデータの読み書きも可能です。
ファイルをテキストとして読み込む際には、これらの文字コードを自動判別してデコードすることも可能です。
拡張性
機能追加を行うための仕組みとして、よく使う機能をライブラリ化しておいて動的に読み込む「ユニット」や、機能の追加や選択を行いやすいスクリプトを作成するための「プラグイン」が用意されています。
コンソール版と非コンソール版の両方に対応
コマンドプロンプトなどから呼び出すのに適したコンソール版と、エクスプローラなどから実行した際にコンソールウィンドウが表示されない非コンソール版の2つの実行ファイルが用意されています。
非コンソール版でも、println()などの入出力機能を利用すると、自動的にコンソールウィンドウが生成されるので、大抵のスクリプトはコンソール版・非コンソール版の両方で動作可能です。

標準で用意されている機能

File
フォルダ内の項目の列挙や、サイズなどの情報取得、コピーや削除などの操作を行うクラスが用意されています。
NTFSのサブストリームを列挙・読み書きする機能も搭載されています。
また、ファイルの作成・削除・変更などをイベントハンドラで監視することも可能です。
Process
コマンドラインを指定して新規のプロセスを実行する他、システム上で実行されているプロセスを列挙したり、プロセスの強制終了などの操作も可能です。
StreamMixin
自プロセスや子プロセスの標準入出力、ファイル、TCP通信などをストリームとして読み書きできます。
マルチバイト文字列の他、バイナリデータの読み書きも可能です。
HTTP
HTTPやHTTPSで指定のURLにアクセスするHTTPクライアント機能が用意されています。
一つのメソッド呼び出しで簡単にレスポンスボディの取得やファイルへの保存を行なえる他、レスポンスボディをストリームとして読み書きすることも可能です。
HTTPD
HTTPDは、簡易的なWebサーバを実行するためのクラスです。
任意のパスにコンテンツ生成関数やディレクトリを割り当てることができます。
これを利用すれば、ブラウザ上からNILScriptの機能を呼び出して利用することが可能になります。
ブラウザ上のJavaScriptとサーバ側のNILScriptの連携を補助する機能なども用意されています。
また、プロキシサーバとして動作し、通常のWebページへのリクエストを乗っ取って任意のコンテンツに差し替えたり、HTMLをフィルタで改変することも可能です。
プラグイン機構も用意されており、機能の追加や流用も行いやすくなっています。
FTP
FTPによるファイルのアップロード/ダウンロードを行うユニットが用意されており、Webサイト更新処理の自動化やログの自動バックアップなどの機能も簡単に実現できます。
Mail
電子メールの送受信に使用するPOP3/SMTPサーバへアクセスする機能を提供するMailユニットにより、イベントの発生をメールで通知したり、受信したメールに応じた処理を実行させることが可能です。
Socket
HTTP以外にも、TCPやUDPのポートを開いて通信を受け付けたり、クライアントとして通信を行うことが可能です。
VFS
VFSは通常のローカルファイルに加え、ZIPファイル内のファイルや、Web掲示板の投稿など、様々なものをファイル・ディレクトリとして扱えるようにするための仮想ファイル機構です。
プラグインを作成することで対応形式を追加可能で、各オブジェクトがデータと子孫の両方を持つこともできるなど、通常のFile/Directoryオブジェクトより柔軟な作りになっています。
LooseXML
LooseXMLは、XMLやHTMLをパースするDOMのようなクラスです。
XMLを逐次読み込みでパースしながらノードにアクセスでき、途中で切れたり不正なデータが混ざったりしているXMLも可能な限り処理できます。
SQLite
扱いが手軽なことから多くの採用例のあるデータベースエンジン「SQLite」を操作するクラスが用意されています。
SELECTクエリの結果はジェネレータとして取得できるので、結果に対する反復処理を記述しやすくなっています。
また、面倒なクエリの記述を簡略化できる各種ラップメソッドも用意されています。
Cihper
Cipherは、AESなどの共通鍵暗号や、公開鍵暗号方式RSAによるデータの暗号化や署名などを行うユニットです。
opensslコマンドのenc/rsa/rsautilなどのサブコマンドと互換性のある暗号化データを生成できます。
署名やハッシュ値、暗号化データなどはBASE64文字列としても得られるので、JSONファイルに埋め込んだりネットサービスを介して送受信したりし易くなっています。
Hash
CRC32やMD5,SHA-*などのハッシュ関数で文字列やバイト列のハッシュ値を計算するクラス群が用意されています。
バイト列の逐次読み書きを行うストリームオブジェクトをラップすることで、大きなメモリ容量を消費することなく、大容量のデータのハッシュ値を計算することも可能です。
Image
Imageクラスを使うことで、BMP/JPEG/PNGなどの画像ファイルの読み込み・保存や、切り抜き・リサイズなどの加工、テキストや図形の描画などの画像処理を行なえます。
Windowユニットで生成した自前ウィンドウに画像を描画することも可能です。
ぼかしなどのフィルタ処理の本体部分は、アセンブラで作成した効率的な機械語コードを埋め込んで呼び出しているので、十分高速に動作します。
CSV
ファイルや文字列をCSVとして解析してレコードを列挙するCSVクラスやCSVFileクラスが用意されています。「"」で囲まれて「,」や改行を含むフィールドにも対応しています。
レコードの列挙はジェネレータとして行われるので、ジェネレータの各種拡張メソッドを利用することで、検索や集計などの処理を簡単に行なえます。
Keyboard
キーボードの状態取得や操作イベントの発生、フックによるイベントハンドラの割り当てなどが可能です。
Mouse
ボタンの押し下げ状態やカーソル位置を取得したり、ボタン操作やカーソル移動を発生させる他、ボタン操作やカーソル移動をフックして処理を実行させることも可能です。
Hotstrokes
登録されたキー操作が発生したときに別のキー操作に変換したり、任意の関数を実行させたり出来ます。
複数の操作からなるストローク列を割り当て対象に出来、モディファイアキーを自由に定義することも可能です。
キーその他の機能はプラグインで追加可能で、マウスジェスチャ機能を追加するMouseプラグインなどが標準で用意されています。
Window
存在しているウィンドウを列挙したり、タイトルやサイズなどの情報を取得・設定する他、自前のウィンドウを生成して情報の表示や入力の受付を行うことも可能です。
また、ウィンドウの生成や表示、アクティブ化などのイベントをフックする機能も用意されています。
その他、タスクトレイアイコンやポップアップメニュー、ダイアログなど、デスクトップユーティリティの作成に役立つ機能が色々と用意されています。
COM/ATL
COMユニットを利用することで、WSHのActiveXObjectなどで使われるコンポーネントを使用できます。
IDispatchインターフェイスを持つオブジェクトだけでなく、その他の任意のインターフェイスをラップするクラスを定義することも可能です。Windows SDKに含まれるIDLファイルからクラス定義を生成するスクリプトも用意されています。
オブジェクトに対するイベントハンドラ関数の割り当ては、他のNILScriptオブジェクトと同様に「observe()」メソッドで行なえます。
WindowユニットとCOMユニットを利用したATLユニットでは、Windowクラスを使用して生成した自前ウィンドウ上にTrident(IEコンポーネント)などのActiveXコントロールを埋め込み、Dispatchなどのラッパーオブジェクトで操作できます。
Clipboard
クリップボードの内容が変化したときに処理を実行したり、内容を読み書きする機能などが用意されています。
通常のテキストの他、HTML形式やファイルリスト、画像などに対応しており、対応形式を追加することも可能です。
Registry
Windowsのレジストリの項目を列挙したり、内容を読み書きすることが可能です。
SystemMonitor
CPUやメモリの使用状況、ネットワークの転送量などを監視するシステムモニタ用クラス群が用意されています。
タスクマネージャのような情報表示ツールだけでなく、ソフトの自動操作の進行条件などとしても役立つでしょう。
また、システムをシャットダウン・再起動するメソッドや、システムのシャットダウン前などに実行されるイベントハンドラを登録する機能も用意されています。
ContentExtractor
ContentExtractorは、ルールに従ってWebページから本文などを抽出する機能です。
HTMLの置換処理をプラグインで定義可能なHTMLRewriterや、転送URLの解決を行うURLResolver、プラグインで不要URLのフィルタリングルールを定義できるURLFilterなどの関連機能と連携することで、広告やソーシャルサービスのリンクで埋め尽くされたサイトから必要な部分を抽出して利用するプログラムを簡単に作成できます。

構想中の機能

影響を受けた言語・処理系

AutoHotkey, C, Delphi, DMonkey, prototype.js