華和梨ソース概略¶
- C++, STLを使用。
- Phase 9.0.0から内部文字列はすべて
wchar_t(WindowsはUTF-16、POSIXはUTF-32)。入出力の境界で文字コード(UTF-8 /Shift_JIS)を変換する。非WindowsではiconvをSJIS等の変換に使う。 - さおり部分でPython, Javaへの対応を試みた形跡あり。
- 一つのプロセス内に複数の華和梨エンジンを生成可能。
ソース構成¶
-
libkawari/
華和梨コア。TKawariEngineが全て管理する。
-
辞書データ構造
全てのデータをフラグメントごとに32bitID化して管理するデータ構造は、華和梨が持つ最大の特徴の一つである。等しいデータには必ず同じIDが与えられるため、実行時の各種演算が極めて高速となる一方、データ読み込みコストは高い(一回の単語格納コストはstd::mapの検索コストに比例)。
華和梨データ構造(辞書)は
String-<KISコード配列>マップ(実際はID-<ID配列>)であり、さらにキー文字列はドット('.')を区切り文字としたツリー構造として別管理される。これが華和梨の唯一のデータ構造・データ空間である。つまり、通常用いられるメモリアドレスの代わりに、キー文字列(実際はキーID)を用いた検索によってのみ、データ(KISコード)を取得できる。辞書には、華和梨エンジン一つに対して一つ用意される静的なグローバル辞書のほか、履歴参照や一時変数などに用いるいわゆるスタックフレームとして、動的に生成廃棄されるものが存在する。華和梨ではこのスタックフレーム辞書を「コンテキスト」と称している。
また、華和梨7までは一度ID化された文字列は二度と削除されなかったが、華和梨8でガーベジコレクションもどきが導入された。GCは、中間コード評価終了時に、評価中、辞書から一度でも削除されたIDをテストする。等しいデータを同じIDとする性質から、複数のキーによって参照されるIDが存在するため、全ての削除予定IDについて、他のキーが参照しているかどうかのチェックが行われる。
wordcollection:データのID化
kawari_ns:マップ+ツリー構造のキーkawari_dict:グローバル辞書+コンテキスト管理。エンジン一つにつき一つ。
-
パーサ、コンパイラ
kawari_crypt:暗号化関連kawari_lexer:文字解析。モード分けが大変。kawari_compiler:構文解析。構文木構築。(
kawari_engine):辞書読み込み機能の最上位ルーチン(変更予定)
-
中間コードオブジェクト
構文コマンドのほとんどは実行時にパースされるため、
kawari_codeに記述される。KISと、いわゆる台詞・単語は、同じようにKIS中間コードオブジェクトとして扱われる。通常の文字列は「副作用無しに文字列を返す中間コード」となる。KISのユーザ関数は、関数名に特別なprefixのついた通常のエントリに格納される。従って、辞書表記や呼び出し方こそ異なるが、スクリプトと台本は華和梨内部の格納形式は同じである。
kawari_code:スクリプト、エントリ配列呼び出しkawari_codeexpr:演算式kawari_codeset:エントリ呼び出し、集合演算kawari_codekis: KIS構文(ifのみ)
-
実行
VMと言っているが、構文木をそのまま実行するので、全然VMではない。VMが行うのは評価開始時およびユーザ関数呼び出し時の、コンテキスト生成管理ぐらいである。それすらnativeスタックを消費してそのまま呼び出すので、KISのスタックはまともに管理されていないと言える。
TKawariEngineは「華和梨エンジン」オブジェクトであり、他のモジュールの生成・管理責任を負う。KISコマンドの多くは、Engineのメソッドによって華和梨機能にアクセスする。細かい制御が必要な場合は、Engineから各モジュールオブジェクトを得て、操作する。
kawari_vm:中間コード実行kawari_engine:華和梨エンジン
-
ログ・リソース
kawari_log:ロガーkawari_rc:リソース(エラーメッセージなど。言語ごとに用意される)kawari_version:バージョン、ライセンスメッセージ
-
-
kis/
組み込みKISコマンドの実装。
-
saori/
さおりクライアント(さおりを呼び出す側)実装。無闇にフレームワーク風に書かれている。
-
saori
エイリアス-モジュールパス対応管理。ロードタイプ(noresidentなど)による動的生成(ロード)管理。
-
saori_moduleFactoryパターンによるモジュール生成の開始点、通信インターフェース。各種形式のさおりI/Fを呼び出す分岐点になる。
-
saori_uniqueモジュール多重起動を防ぐ、モジュール生成FactoryのDecorator。アクティブなバインド数をカウントし、0になったらアンロードする。現在、プロセスごとではなく、エンジンごとに一つ生成する状態(潜在バグ)。
-
saori_native共有ライブラリ形式さおりの生成、通信。
-
saori_javaJava形式さおりの生成、通信。コンパイル環境未整備(JVMのexport libが必要)。
-
saori_pythonPythonスクリプト形式さおりの生成、通信。未完。
-
-
include/
華和梨SHIORIがexportするAPIの仕様。
-
shiori/
華和梨のSHIORIインターフェース実装。
-
misc/
ユーティリティ
-
tool/
幸水など、外部ツール群