编译组件
引言
编译组件代表编译功能的集合. 这包括可在已编译代码中使用的声明和可在顶层代码中使用的已安装函数. 编译组件提供了打包和分发此功能的框架.
创建基于编译器的程序包
与程序包系统的集成使得分发编译组件及相关构建可能在单个内核会话之外实现. 在这个示例中,定义了一个编译组件,它对一些已安装函数进行公开,并且依赖于外部库.
定义程序包
PacletObject[
<|
"Name" -> "ComponentPaclet",
"Version" -> "0.0.1",
"WolframVersion" -> "13.2+",
"Extensions" -> {
{"Kernel", "Root" -> "Kernel", "Context" -> "ComponentPaclet`"},
{"LibraryResources"}
}
|>
]
BeginPackage["ComponentPaclet`"]
AddOne
RaiseToPower
Begin["`Private`"]
(* Declare compiler declarations *)
DeclareCompiledComponent["ExampleComponent", {
LibraryFunctionDeclaration["addone", "compilerDemoBase", {"CInt"}->"CInt"],
FunctionDeclaration[AddOne,
Typed[{"CInt"} -> "CInt"]@
Function[arg, LibraryFunction["addone"][arg]]
],
FunctionDeclaration[RaiseToPower,
Typed[{"MachineInteger","MachineInteger"} -> "MachineInteger"]@
Function[{x,y}, x^y]
]
}];
(* Declare installed functions *)
DeclareCompiledComponent["ExampleComponent", "InstalledFunctions" -> {
AddOne,
RaiseToPower
}];
(* Declare library functions *)
DeclareCompiledComponent["ExampleComponent", "LibraryFunctions" -> <|
"sqrt" -> Function[Typed[arg,"Real64"], Sqrt[arg]]
|>];
(* Declare external library dependencies *)
DeclareCompiledComponent["ExampleComponent", "ExternalLibraries" -> {
"compilerDemoBase"
}];
End[] (* End `Private` *)
EndPackage[]
加载程序包
构建组件
对 BuildCompiledComponent 的调用创建并填充了程序包中的 LibraryResources 目录,其中包含由该组件指定的所有函数的动态库:
加载组件
这里使用 FindLibrary 来定位组件构建,它将在程序包中被找到,因为它在 PacletInfo.wl 文件中被赋予了 "LibraryResources" 扩展名.
或者,可以使用 LoadCompiledComponent 显式加载组件构建,从而可以访问构建的所有属性:
LoadCompiledComponent 使得访问组件中指定的库函数成为可能:
现在它已经被构建, "ComponentPaclet" 程序包可以立即在新的内核会话中使用,而无需重新编译其源代码. 它也可以分发到其他机器,但只与构建它所用的平台兼容. 如要构建跨平台组件库,BuildCompiledComponent 需要在每个目标平台上运行.