ソフト開発
OpenHSPのチュートリアル †
- HSPのソースはC++で書かれています。とはいえ、ほとんどBetter C(と一部クラスと例外が使われているくらい)と標準Cライブラリで構成されています。
- OpenHSPのソースはSubversionで管理されています。変更の履歴や、過去のソースを閲覧できるようになっている他、ソースをまとめてダウンロードすることもできます。
- Tracによりweb上から簡単にソースや変更履歴にアクセスできます。タイムラインで最近の更新を確認できたり、リポジトリブラウザからソースを閲覧できたりします。
- リポジトリ内のtrunkフォルダ内が開発の本流です。
- この記事ではHSP本体のソースに絞って見ていきますが、OpenHSPでは標準エディタやドキュメント、プラグインなども開発しています。
- OpenHSPのソースコードを更新するにはコミッタになる必要があります。コミッタになりたい人はおにたまさんにメールで連絡をとります。
- OpenHSPのソースコードはBSDライセンスです。License_j.txtやLicense.txtにかかれている条件を満たせば改編、複製、公開、配布することができます。
HSPは以下のような手順で実行されます。
- hspcmp.dll内のプリプロセッサにより入力されたスクリプト(*.hsp)からプリプロセス済みのスクリプトを出力します。これは#defineや#includeなどのプリプロセッサ命令を処理します。
- hspcmp.dll内のコードジェネレータによりプリプロセス済みスクリプトをAXファイル(start.axやobj)に変換し出力します。
- hsp3.exeがAXファイルを読み込みそれを解釈しながら実行します。
- プリプロセス済みのスクリプトは#cmpopt ppout 1をスクリプトに挿入することでファイルに出力することができます。(hsptmp.iというファイル名で出力されます)
- リポジトリのhspcmpフォルダ内がhspcmp.dllのソース、hsp3フォルダ内がhsp3.exe(などのランタイム)のソースです
- 標準エディタは「コンパイル+実行」時にhspcmp.dllの呼び出しとランタイムEXEの実行を行っています。
ソースコードを読むための技術という素晴らしい文書があります。ぜひ読んでみてください。OpenHSPのソースを読む上でも役に立つことでしょう。
OS:WindowsXP SP3
IDE:Microsoft Visual C++ 2008 Express Edition
HSP:ver.3.1
OpenHSP:ver.3.2beta1
以上の構成で進めていきます。
hsp3をビルドしてOpenHSP版のhsp3.exeを作成します。
- ダウンロードしたOpenHSPのフォルダの trunk\hsp3\win32gui\hsp3_vc2008.vcproj を開く。
- ソリューション構成を Release に変更します。
- その後F7でビルド開始。警告がたくさん出ますが気にせずに。(本来は気にしないといけないんですが)
- trunk\hsp3\win32gui\Release\hsp3.exe が出力されているはずです。
- 出力されたhsp3.exeを実行しても「Error Startup failed.」というメッセージボックスが表示されるだけですが問題ありません。
- hsp3clも同じ方法でtrunk\hsp3\win32\hsp3cl_vc2008.vcprojを開いてビルドすればOKです。
- 先ほど出力された trunk\hsp3\win32gui\Release\hsp3.exe を hsp3-trunk.exe という名前に変更します。
- 通常のHSPがインストールされているフォルダ(通常ならProgram Files\hsp31)に移動します。
- フォルダ内にhsp3.exeというファイルがあると思うので hsp3-31.exe という名前に変更してください。
- このフォルダに先ほどリネームした hsp3-trunk.exe をコピーしてください
- HSPエディタを立ち上げて1行目に #runtime "hsp3-trunk" と記入してF5で実行。
- 真っ白いウィンドウにタイトルが 「OpenHSP ver.3.2beta1」 と表示されていればOpenHSPでの実行は成功です。
- 通常のHSPで実行したいときは先ほどの1行目を #runtime "hsp3-31" とすれば切り替えることが可能です。
hspcmp.dllをビルドします。基本的にhsp3のビルドと同じです。
- trunk\hspcmp\win32dll\hspcmp_vc2008.vcprojを開きます。
- ソリューション構成をReleaseにし、F7でビルド。
- trunk\hspcmp\win32dll\Release\hspcmp.dll が出力されます。
- あとはHSPのインストールされているフォルダのhspcmp.dllだけなのですが、hspcmp.dllは実行ランタイムと違ってファイル名を指定して切り替えたりはできません。また、エディタを開いている間はhspcmp.dllが使われていてロックされているので上書きできません。ので、hspcmp.dllを切り替えたいときはエディタを一旦終了させてhspcmp.dllへ上書きコピーするしかありません。
- trunk\hspcmp\win32\hspcmp.vcprojを開いてビルドすれば実行ファイル版のhspcmp.exeを生成できます。
- hsp3struct.h
- 構造体や定数の定義
- hsp3int.h
- hsp3int.cpp
- 基本的な標準命令・関数(TYPE_INTCMD, TYPE_INTFUNC)の定義
- hsp3code.h
- hsp3code.cpp
- 中間コードの実行
- stack.h
- stack.cpp
- 式の評価での値や、関数のフレームなどを格納するスタック
- strnote.h
- strnote.cpp
- 文字列を行ごとに扱って追加・削除・取得などを行えるユーティリティ(note系命令の実装に使われる)
- strbuf.h
- strbuf.cpp
- malloc/freeのラッパ
- hsp3.h
- hsp3.cpp
- HSPの初期化・読み込み・終了処理など
- supio.h
- win32gui/supio_win.h
- win32gui/supio_win.cpp
- Shift_JISを考慮した文字列処理や、ファイル関係や日時の取得などのプラットフォームに依存する部分などのユーティリティ
- hspvar_core.h
- hspvar_core.cpp
- 変数の管理
- hspvar_label.h
- hspvar_label.cpp
- 変数型labelの定義
- hspvar_str.cpp
- 変数型strの定義
- hspvar_double.cpp
- 変数型doubleの定義
- hspvar_int.cpp
- 変数型intの定義
- hspvar_struct.cpp
- 変数型structの定義
- hsp3debug.h
- エラーコード、hsp3debug.dllとの通信用構造体、定数の定義
- hsp3debug.cpp
- エラーメッセージの定義と取得用関数
- makefile
- makefile.linux
- MinGWやUnixでのビルド用makefile(VC++でのビルドでは関係ありません)
- hsp3config.h
- コンパイルスイッチ、キャプションやバージョンの定義
- token.h
- CTokenクラス(プリプロセッサとコードジェネレータ)のヘッダ
- token.cpp
- プリプロセッサ
- codegen.cpp
- コードジェネレータ
- hspcmd.cpp
- 予約語の定義
- label.h
- label.cpp
- CLabelクラス(識別子の管理)
- errormsg.h
- errormsg.cpp
- コードジェネレータのエラーコードとメッセージ
- hsc3.h
- hsc3.cpp
- CHsc3クラス(コンパイラ)
- localinfo.h
- localinfo.cpp
- __DATE__, __TIME__定義用の日時取得
- main.cpp
- コンソール版のエントリポイント
- membuf.h
- membuf.cpp
- CMemBuf?クラス(汎用メモリバッファ)
- strnote.h
- strnote.cpp
- 文字列を行ごとに扱って追加・削除・取得などを行えるユーティリティ(note系命令の実装に使われる)
- supio.h
- win32/supio_win.h
- win32/supio_win.cpp
- Shift_JISを考慮した文字列処理や、ファイル関係や日時の取得などのプラットフォームに依存する部分などのユーティリティ
- tagstack.h
- tagstack.cpp
- CTagStack?クラス(#define特殊展開マクロ用スタック)
- win32dll/hspcmp3.cpp
- DLLの外部公開関数
- 手始めにHSPTVのaxファイルからソースを復元でもするか!axファイルは暗号化されてないしな! --