コンテンツにスキップ

華和梨ソース概略

  • 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_module

      Factoryパターンによるモジュール生成の開始点、通信インターフェース。各種形式のさおりI/Fを呼び出す分岐点になる。

    • saori_unique

      モジュール多重起動を防ぐ、モジュール生成FactoryのDecorator。アクティブなバインド数をカウントし、0になったらアンロードする。現在、プロセスごとではなく、エンジンごとに一つ生成する状態(潜在バグ)。

    • saori_native

      共有ライブラリ形式さおりの生成、通信。

    • saori_java

      Java形式さおりの生成、通信。コンパイル環境未整備(JVMのexport libが必要)。

    • saori_python

      Pythonスクリプト形式さおりの生成、通信。未完。

  • include/

    華和梨SHIORIがexportするAPIの仕様。

  • shiori/

    華和梨のSHIORIインターフェース実装。

  • misc/

    ユーティリティ

  • tool/

    幸水など、外部ツール群