ActBa64

ActiveBasic との相違点

完全互換ではない。言語の共通核は language.md、ビルドは build.md。AB 4.20 と同じ挙動として残る既知の問題は known.md。

ActiveBasic 4.20 仕様の参照: ローカル docs/ActiveBasic4.20.md(gitignore。BasicHelp 抽出。型・文法・Win32/DirectX API・dx_*.sbp 等)。
実装が本書より進んでいるときは language.md を優先する。


機能の対応状況(非対応・制限を含む)

実装の正本は language.md。本書は結果や有無が AB とずれる点だけを書く。対応していて結果も同じものは言語仕様側に書く。

DirectX 9(ActiveBasic 付属ライブラリ)

制御・プリプロセス

項目 ActiveBasic 仕様 (BasicHelp) ActBa64
#ifdef / #ifndef 条件付きコンパイル(_DEBUG, _WIN64, _AB_VER4 等を自動定義) 構文は language.md §7.7。.pj の各ソースと #include にも適用する。自動定義は _WIN64(64bit 時)、_AB_VER4、_ACTBA64。_DEBUG は自動定義しない。_ACTBA64 は AB 4.20 には無い
#include の再取り込み 同じパスを複数回 #include すると、都度展開される パス単位で一度だけ(2 回目以降はスキップ。AB 4.20 の都度展開とは異なる)
On Error / Resume エラートラップ 非対応

言語機能

項目 ActiveBasic 仕様 (BasicHelp) ActBa64
Trim$ なし StrUtils.abp(default.idx 自動挿入)。前後の空白(スペース、タブ、CR、LF)を除く
UDT 配列の複数添字 a(i, j) / a(i, j, k) 添字 1 個の平坦アクセスのみ(2 次元以上)
関数ポインタの引数型 引数型の一致検査 厳密照合は未(呼び出し自体は language.md §5.2.1)

リソース

項目 ActiveBasic 仕様 (BasicHelp) ActBa64
rc ファイル取り込み リソース埋め込み 部分対応(#resource "file" → RCDATA 1。.rc の ICON は隣の rc.exe。MENU は未)

GUI・対話・マルチメディア命令

項目 ActiveBasic 仕様 (BasicHelp) ActBa64
Cls Prompt 窓のクリア コンソール全面クリア(Prompt 窓ではない。引数は受け取るが常にテキスト画面)
Inkey$ Inkey$() — 非同期 1 文字 #n88basic / #prompt のみ(n88key.abp)。窓の WM_KEYDOWN。無ければ ""
Input$(Length) 同期、指定長読み取り #n88basic / #prompt のみ。同じキーを Length 文字待つ
RAD / #RESOURCE Project Editor・リソース #resource 埋め込みは部分対応。RAD / .pj #RESOURCE= は未

動作が異なるもの

BasicHelp どおりに書いても結果が一致しない、または別の経路で実現する項目。

項目 ActiveBasic 仕様 (BasicHelp) ActBa64 の動作
#strict 厳密型チェック。異なる基本型間代入・ポインタ不一致等を警告 変数代入に加え、Long→Byte(呼び出し結果を含む)と引数の String→VoidPtr・VoidPtr→Long を warning(As で抑制)。数値リテラルは対象外。Include\default は抑制
Single / Double IEEE 浮動小数点演算 Single の汎用演算は未(格納と Input 変換のみ)。Double の配列要素と UDT フィールドは -actba32 でも 8 バイト転送。Print の Double は 64bit と -actba32 で StrD$。科学記法(1.0e10)は未対応
Class Inherits、Virtual、Super.Method、New/Delete、アクセス制御 Inherits は親フィールドを先頭に置く。Virtual 呼び出しは COM vtable。Super は親関数の直接呼び出し(基底 ctor/dtor は自動では呼ばない)。New / Delete は対応(ヒープ塊の先頭 8 バイトが要素数)。メソッドはマングル名 + 暗黙 This
N88 LOCATE 本家 N88 BASIC は行・桁 1 始まり LOCATE x, y は 0 始まり(桁 x, 行 y)
N88 CIRCLE … F タイルストリングによる塗りつぶし F 塗りつぶしのみ(タイル未対応)
組込 vs Include Left$ / Len / InStr / Hex$ 等は basic\function.sbp 等 Len / Asc / Chr$ / … / ELM / ビットマクロ等は組込。InStr / Hex$ / Val は StrUtils.abp(default.idx 自動挿入)。GetByte 等は Memory.abp(同上)
数学関数 Sin / Cos / Abs / Sqr 等(浮動小数) Math.abp のマクローリン展開。複雑な入れ子は一時変数経由が安全
Int64 / QWord / Char 基本型として定義 Char / Int64 / QWord 型なし(Byte / Long / DWord 等)
DLL 再配置 ロード時のベース再配置 DLL は末尾に .reloc を出す。32bit は絶対アドレスの HIGHLOW。64bit は空の再配置表(コードは RIP 相対)。EXE は出さない。DYNAMIC_BASE は立てないので、優先ベースが空いていればそのまま、塞がっていればローダーが移動する
ソース拡張子 .sbp 推奨 .abp(.pj で結合)
Win32 API api_*.sbp に Declare 定義が同梱 default.idx + api.idx + UnicodeApi.sbp 自動挿入。任意 Declare Lib "dll"(自作 DLL 含む)可。未登録呼び出しはエラー
DirectX DirectX 9 + dx_*.sbp DirectX 11(改良点)。高レベル dx_* 一式はサンプルのみ
64bit ver 4.20 はバグで実質困難 64bit PE32+ を正式サポート(ポインタ・String・HANDLE = 8、Long = 4)
コンパイル GUI IDE が主 CLI actba64 src -o out.exe

改良点

コマンドラインからのコンパイラ実行

64bit 対応

DirectX 11


今後対応していくもの(現時点では未対応)

メモ・チェックリスト。実装状況は language.md を優先する。

言語・構文

項目 ActiveBasic 仕様 (BasicHelp) メモ
関数ポインタの厳密シグネチャ照合 引数型の一致検査 *Function / 間接 call 自体は済

ファイル I/O

項目 ActiveBasic 仕様 (BasicHelp) メモ
rc / #resource リソースファイル取り込み ファイル→RCDATA(1) は済。ICON は隣の rc.exe。MENU は未

GUI・Win32・マルチメディア

項目 ActiveBasic 仕様 (BasicHelp) メモ
DirectX 9 Include Include\directx9\(d3d9 / d3dx9* / dinput / dsound / dmusic*) 未移植。D3D11 基盤はサンプルで動作。dx_input・dx_music 相当は未
RAD Project Editor 機能拡充予定
Prompt 窓 basic\prompt.sbp(PromptProc / DrawPromptBuffer) 未移植。Print / Input はコンソール。Inkey$ / Input$ は #n88basic のみ
デバッガランタイム system\debug.sbp の _DebugSys_* IDE デバッガ用。未移植