WSTP 程序的可移植性
在 Wolfram 语言这一方面与 Wolfram Symbolic Transfer Protocol (WSTP) 的关联对所有的计算机系统完全一样. 但在不同计算机系统中的外部程序之间肯定有所不同.
Install["file"] | 直接执行一个文件 file |
Install["file",LinkProtocol->"type"] | 使用低层数据传输的特殊协议 |
$SystemID | 将所用计算机系统看作同一类型 |
Install["dir"] | 执行名为 dir/$SystemID/dir 的一个文件 |
Wolfram 语言约定当 prog 是一个通常文件时,Install["prog"] 就试图执行它. 而当 prog 是一个目录时,Wolfram 语言将寻找它之中名称与 $SystemID 一致的一个子目录,然后试执行该子目录中名为 prog 的文件.
包含文件 wstp.h 含有 WSTP 库中所有函数的标准 C 原型.
WSPutInteger32() | WSGetInteger32() | 对应于 C 类型 int 的整数,即 32 位 |
WSPutInteger16() | WSGetInteger16() | 类型 short 的整数,即 16 位 |
WSPutInteger64() | WSGetInteger64() | 64 位整数 |
WSPutReal64() | WSGetReal64() | IEEE 双精度浮点数,对应于 C 语言类型 double |
WSPutReal32() | WSGetReal32() | IEEE 单精度浮点数,对应于 C 语言类型 float |
WSPutReal128() | WSGetReal128() | IEEE 四精度浮点数 |
如果您的程序正确匹配 WSTP 库函数的参数类型,则不必担心计算机系统之间的 C 类型差异. WSTP 会自动将 C 类型转换为适合每个平台的尺寸. WSTP 还根据需要交换字节,以便跨平台正确传输数字,并在浮点数字格式之间进行转换,并尽可能降低精度损失.
WSPutString(stdlink,char*s) | 放一个以 null 结尾的C字符串 |
WSPutUnicodeString(stdlink,unsigned short*s,int n) | |
放一个用 16 位UCS-2 Unicode字符编码的字符串 | |
WSPutByteString(stdlink,unsigned char*s,int n) | |
放一个仅含有 8 位字符代码的字符串 | |
WSPutUTF8String(stdlink, const unsigned char*s,int n) | 放一个用 UTF-8 的 Unicode 字符编码的字符串 |
WSPutUTF16String(stdlink, const unsigned short*s,int n) | 放一个用 UTF-16 的 Unicode 字符编码的字符串 |
WSPutUTF32String(stdlink, const unsigned int*s,int n) | 放一个用 UTF-32 的 Unicode 字符编码的字符串 |
WSGetString(stdlink,char**s) | 得到一个以 null 结尾的 C 字符串 |
WSGetUnicodeString(stdlink,unsigned short**s,long*n) | |
得到用 16 位 UCS-2 Unicode 字符编码的字符串 | |
WSGetByteString(stdlink,unsigned char**s,long*n,long spec) | |
得到仅含有 8 位字符代码的字符串,使用 spec 作为所有16位字符的代码 | |
WSGetUTF8String(stdlink, const unsigned char**s,int*m,int*n) | 得到用 UTF-8 的 Unicode 字符编码的字符串 |
WSGetUTF16String(stdlink, const unsigned short**s,int*m,int*n) | 得到用 UTF-16 的 Unicode 字符编码的字符串 |
WSGetUTF32String(stdlink, const unsigned int**s,int*n) | 得到用 UTF-32 的 Unicode 字符编码的字符串 |
在简单的 C 程序中,一般使用仅含有常规 ASCII 字符的字符串. 但在 Wolfram 语言中可以使用含有各类特殊字符的字符串.这些字符在 Wolfram 语言中用 Unicode 字符代码给出,如 "字符的原始代码" 中讨论的.
C 语言中 char* 字符串一般仅用8位去保存每个字符的代码. 而 UCS-2 编码字符串却需要 16 位. 所有,函数 WSPutUnicodeString() 和 WSGetUnicodeString() 用无符号的短整数 unsignedshort 数组工作. 对于 UTF-16 编码字符串和对应的函数 WSPutUTF16String() 和 WSGetUTF16String() 也同样适用.
当知道所用程序不涉及特殊字符时,用 WSPutByteString()和 WSGetByteString() 是方便的.这些函数直接用 8 位字符代码表示所有字符. 如果从 Wolfram 语言发送一个特殊字符时,就用 WSGetByteString() 将它转换成所给出的固定代码.
有些计算机系统或编译器则需要不同形式的主程序.要知道调用 WSMain()之前在 main() 内可以任意进行各种初始化.但调用了 WSMain()之后,程序就进入了无限循环,直到链接关闭之前它与来自 Wolfram 语言的需求相呼应.