マーシャリング

この記事では、AliceScriptの型と他の言語の型とを相互に変換する手法について説明します。


taiseiue | 2023-10-02

AliceScriptの型システムと.NETやネイティブの型システムは、厳密には一致しません。 このため、AliceScriptと他の言語との間で相互にやり取りを行う場合にはデータ型の変換を行う必要があります。マーシャリング はこの機能を指します。マーシャリングは通常、他の言語で定義された関数に引数を渡し、その関数の戻り値を受け取るために使用します。

ほとんどの型は、AliceScriptと他の言語との間に共通するものがあります。 この場合は、単にこれを一対一で変換します。例えば、AliceScriptのBool型は.NETのBoolean型と一対一で対応しています。 しかし、他言語の複数の型がAliceScriptのひとつの型に対応している場合など、一対一の関係で処理できない場合もあります。この場合は、必要に応じて型の範囲を拡大したり、縮小する必要がある場合は範囲チェックを行います。ある型で表されている値が変換先の型では表せない場合、例外が発生します。

マーシャリングは、普段開発者が意識する必要がないように設計されています。 しかし、他の言語との間で相互にデータをやり取りしていて、問題が発生している場合にマーシャリングの手法に関する知識が役に立つ可能性があります。 この記事では、AliceScriptの型と他の言語の型とを相互に変換する手法について説明します。

関数呼び出しの概念

AliceScriptの実装は、他の言語で公開されている関数を使用できるようにするため、自動的に(または、extern属性のついた関数を定義することで)他言語の関数と対応するAliceScriptの関数を登録します。登録された関数は以下の図のように呼び出します。

.NETのメソッドの場合

引数

関数バインド

戻り値

AliceScriptの関数

.NETのメソッド

ネイティブ関数の場合

引数

関数バインド

戻り値

引数

P/Invoke

戻り値

AliceScriptの関数

.NETのメソッド

ネイティブ関数

上記の図のように、.NETのメソッドを呼び出す場合でもネイティブ関数を呼び出す場合でも、一度.NETのメソッド呼び出しに変換します。この流れはコールバック関数が関係しない限り逆向きには作用しません。このとき、AliceScriptの型を正確に.NETの型に変換します。そのためには変換先の.NETの型を特定する必要があります。

AliceScriptから明示的に他言語で定義された関数を呼び出すためには、この変換先の型を明記する必要があります。 以下に、AliceScriptの型と、対応する型キーワード、対応するネイティブ型を示します。

型キーワード AliceScriptの型 .NETの型 ネイティブ型
VOID void System.Void Win32のVOID
BOOL bool System.Boolean Win32のBOOL型(実体はINT)
LPSTRLPWSTRSTRINGBUILDER string System.Text.StringBuilder char*またはchar16_t*(文字コードによる)
LPTSTRLPCSTRLPCTSTRLPCWSTRSTRING string System.String const char*またはconst char16_t*(文字コードによる)
型キーワード AliceScriptの型 条件 小数 .NETの型 ネイティブ型
INT8SCHARSBYTE number -128~127 無視 System.SByte int8_t
UCHARCHARBYTEBOOLEAN number 0~255 無視 System.Byte uint8_t
INT16SHORT number -2,147,483,648~2,147,483,647 無視 System.Int16 int16_t
UINT16USHORTWORD number 0~4,294,967,295 無視 System.UInt16 uint16_t
INT32INTLONG32 number -2,147,483,648~2,147,483,647 無視 System.Int32 int32_t
UINT32UINTULONG32DWORD number 0~4,294,967,295 無視 System.UInt32 uint32_t
INT64LONGLONG64LONGLONG number -9,223,372,036,854,775,808~9,223,372,036,854,775,807 無視 System.Int64 int64_t
UINT64ULONGULONG64ULONGLONG number 0~18,446,744,073,709,551,615 無視 System.UInt64 uint64_t
FLOATSINGLE number ±1.5 x 10−45~±3.4 x 1038 有効 System.Short Win32のSINGLE
DOUBLE number 条件なし 有効 System.Double Win32のDOUBLE
HDCHWNDHANDLEIntPtr number 32ビットまたは64ビット以内 無視 System.IntPtr intptr_t
UIntPtr number 符号なし32ビットまたは64ビット以内 無視 System.UIntPtr uintptr_t