WSTP 程序的可移植性

在 Wolfram 语言这一方面与 Wolfram Symbolic Transfer Protocol (WSTP) 的关联对所有的计算机系统完全一样. 但在不同计算机系统中的外部程序之间肯定有所不同.
首先,不同计算机系统几乎总是需要不同的可执行二进制代码. 于是,在调用 Install["prog"] 时,必须确认 prog 与一个能在所用的计算机系统上执行的程序相对应.
Install["file"]
直接执行一个文件 file
Install["file",LinkProtocol->"type"]
使用低层数据传输的特殊协议
$SystemID
将所用计算机系统看作同一类型
Install["dir"]
执行名为 dir/$SystemID/dir 的一个文件
在不同的计算机系统中安装程序.
Wolfram 语言约定当 prog 是一个通常文件时,Install["prog"] 就试图执行它. 而当 prog 是一个目录时,Wolfram 语言将寻找它之中名称与 $SystemID 一致的一个子目录,然后试执行该子目录中名为 prog 的文件.
mcc -o prog
将编译后的代码放在当前目录中的文件 prog
mcc -xo prog
将编译后的代码放在 prog/$SystemID/prog
编译外部程序的典型 Unix 命令.
即使可执行的外部程序的二进制在不同的计算机系统中肯定不同,但在从 C 语言等中得到该二进制代码的源代码基本上相同.
为了使 C 源代码具有可移植性,要注意下面几点:
首先,不要使用为特殊系统提供的 C 语言或 C 运行库而不是标准 C 中的功能. 另外,也不要使用段或其它特殊内存模式.
包含文件 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 四精度浮点数
使用特殊 C 类型的 WSTP 函数.
在便携式地调用 WSTP 库函数时,必须使用与函数中相同的类型.
如果您的程序正确匹配 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() 也同样适用.
UTF-32 编码字符串对每个字符需要32位,并且对应的函数 WSPutUTF32String()WSGetUTF32String() 适用于无符号整数 unsigned int 的数组.
当知道所用程序不涉及特殊字符时,用 WSPutByteString()WSGetByteString() 是方便的.这些函数直接用 8 位字符代码表示所有字符. 如果从 Wolfram 语言发送一个特殊字符时,就用 WSGetByteString() 将它转换成所给出的固定代码.
main() 可能会随计算机系统的不同而不同
产生便携式 WSTP 程序的一个注意点.
计算机系统和具有基于 Unix 模式的 C 运行库的编译器允许 WSTP 程序有一个主程序,其形式为 main(argc,argv),它简单地调用 WSMain(argc,argv).
有些计算机系统或编译器则需要不同形式的主程序.要知道调用 WSMain()之前在 main() 内可以任意进行各种初始化.但调用了 WSMain()之后,程序就进入了无限循环,直到链接关闭之前它与来自 Wolfram 语言的需求相呼应.