Skip to content

FUKUZAWA-Tadashi/Hayat

Repository files navigation

-*- coding: sjis-dos; -*-

スクリプト言語 Hayat
「ハヤット」と読みます。


クラスベースの動的型オブジェクト指向スクリプト言語です。
ゲーム機上で動作するように作成されました。
Rubyを参考にして作ったので、Rubyに似ています。


例えばこんなスクリプトを書けます:

  男 = new Person("宇絵夫")
  女 = new Person("久家子")
  3.times {
    男「愛してるよ、{女.name}」
    女「わたしもよ、{男.name}」
  }


ゲームスクリプターには理解しやすいのではないでしょうか。

receiver「string1{value}string2」 という形式は、
ヒアドキュメントに似て非なるsayCommandという仕組みです。
「 」 の替わりに << >> を使って
receiver<<string1{value}string2>> とも書けます。
他言語のヒアドキュメントでは、全てが文字列に変換されて結合される訳ですが、
Hayatでは要素毎に逐次実行します。
内部的に複数のメソッド呼び出しに分解され実行されます。

  receiver.sayCommandStart(1,1)   // 通し番号、行数
  receiver.sayCommand(string1)
  receiver.sayCommand(value)
  receiver.sayCommand(string2)
  receiver.sayCommandEnd()

プログラマは、sayCommandStart, sayCommand, sayCommandEnd を定義した
クラスを用意します。
これにより、途中で文字の色を変えたりサイズを変えたりといった動作が
わかりやすく記述できます。

  アインシュタイン「人生は{青}退屈すれば長く{白}、
                    {赤}充実すれば短い{白}。」

これは以下の動作となります。

  アインシュタイン.sayCommandStart(1,2)
  アインシュタイン.sayCommand("人生は")
  アインシュタイン.sayCommand(青)
  アインシュタイン.sayCommand("退屈すれば長く")
  アインシュタイン.sayCommand(白)
  アインシュタイン.sayCommand("、\n")
  アインシュタイン.sayCommand(赤)
  アインシュタイン.sayCommand("充実すれば短い")
  アインシュタイン.sayCommand(白)
  アインシュタイン.sayCommand("。")
  アインシュタイン.sayCommandEnd()

sayCommand内で、BLUE,RED,WHITE などの値を解釈するようにしておけば
良いのです。 

  enum { 白, 青, 赤 }   // 0,1,2
  class Person
    def sayCommandStart(serialNo, numLines) {}
    def sayCommand(x) {
      if (x.getClass() == Int)
        Font.setColor(x)
      else
        myGamePrintString(x)
    }
    def sayCommandEnd() {}
  end




======== その他の特徴 ========

●インタプリタではない
コンパイラにてバイトコードにコンパイルしてから、エンジンで実行します。
しかし、実行中にバイトコードの差し替えができるので、インタプリタと同様に
動作中にスクリプトの挙動を変更する事ができます。


●動作環境
過去動作した事のある環境は以下の通り:
  linux
  cygwin
  Microsoft VisualStudio 2008
  Nintendo DS
  SONY PSP
  SONY PS3
なお、linux、cygwin、VisualStudio以外は、機種依存コードを同梱していません。


●C++にて作られている
今時C言語しか使わないプロジェクトも無いかと思います。
実機上で動作する部分では、boostやSTLなどのテンプレートライブラリを使用していません。
コンパイラも実機上で動かす可能性があったので、同様です。(動かした事はありません)
独自開発のPEGパーサジェネレータを使用しています。
STL使用禁止プロジェクトでも動作させる事ができます。(そんなプロジェクトがあるのか?)


●フレーム単位の実行
ゲーム機上での動作を主眼として、フレーム単位での処理を前提としています。
1tick毎に、 Hayat::Engine::gThreadManager.exec1tick(); を呼んでもらいます。

OSネイティブスレッドに対応していません。
マルチスレッドセーフではありません。
Hayat標準ライブラリのThreadクラスは、エンジン内部でフレーム単位での
動作切り替えをサポートするクラスです。


●文字コード
スクリプトで使用する文字コードとして UTF-8, SJIS, EUCJP を使用できます。
バイトコードに出力する文字コードとして UTF-8, SJIS, EUCJP を指定する事が
できます。スクリプトとバイトコードで文字コードが異なる場合には、コンパイラが
変換します。

識別子に全角文字を使用する事ができます。
スペース文字として、全角スペースを使用する事ができます。


●インクリメンタルGCを実装
GCはインクリメンタルに実行しますので、時々コントロールできないタイミングで
GCの処理が重くなって処理落ちするといった事は少ないはずです。


●実行速度が遅い
パフォーマンスチューニングをしていません。Ruby1.8より倍くらい遅いかと。
特にメソッド検索が遅い事はわかっているので、まずはメソッドオーバーロードの
仕組みを無くすか簡略化すべきとは思っています。
しかしそれでも、DS上で動作するアドベンチャーとかボードゲームなどでは
十分処理は間に合っていました。


●名前の由来
出身地のお寺「光前寺」に伝わる「霊犬早太郎の伝説」から名前の一部を頂いて
Hayat としました。


●今後
ゲーム業界から足を洗ってしまったので、今後のサポートを期待されても
あまり対応出来ないかと思います…。
xtal とか squirrel とかが sayCommand の仕組みを入れて識別子に全角を
使えるようになれば、そっちを使う方が良いだろうと思います。


●ライセンス
MITラインセンスです。
どんどん改造して無断で有料ソフトにて使用してもかまいません。
無保証です。

Copyright (c) 2011 福澤 正  alien@apple.nifty.jp

About

script language for game machine (documents are written in Japanese)

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published