使用SWI-Prolog的qsave_program生成二进制文件有什么好处?

问题描述 投票:0回答:1

我一直在研究 Prolog 的 qsave_program 功能。我正在市场上寻找可以加速我的 Prolog 代码或可能允许与 C/C++ 集成的东西。

我使用以下命令从我的 SWI-prolog 程序生成二进制文件:

swipl -o prog -c prog.pl --stand_alone=true

在幕后,这称为

qsave_program

检查二进制文件后,它是预期的 ELF 格式,所以我尝试运行它。

但是,当我使用

./prog
在终端上运行这个已编译的
strace
程序时,输出日志表明可执行文件确实从各处提取了 swi-prolog 库。这对我来说表明,与通过 hashbang 脚本使用普通的旧 SWI-prolog 可执行文件相比,使用编译后的代码并没有那么多的性能优势。

我错过了什么吗?有没有办法强制编译过程打包到必要的库中(以实现更大的可移植性),整个过程是否涉及对 Prolog 代码的任何优化,或者是否最好在这里避免编译?

c compilation prolog elf swi-prolog
1个回答
0
投票

来自文档

另一个解决方案是使用保存的状态(本章的主题)以及已安装的开发系统,并使用

--no-autoload
autoload(false)
qsave_program/2
选项禁用自动加载需求到状态。这允许将应用程序创建为单个文件,同时避免需要确保状态是独立的。对于大型程序,此技术通常会将启动时间缩短一个数量级。这种机制特别适合内部和云端部署。它提供了一些针对检查源的保护。详细信息请参阅第 14.6 节。

因此,更容易分发(需要担心的文件更少)和更快的启动时间(SWI 不需要每次都读取源代码并将其编译为其内部格式)。听起来好像可以构建一个直接包含使用的库和 SWI VM 的映像,因此它确实是一个捆绑包:

最终的解决方案是确保所有必需的资源都处于保存状态。在这种情况下,状态可以添加到模拟器中,并且应用程序由具有状态的模拟器和使模拟器工作所需的共享对象/DLL 组成。如果模拟器可以静态链接到目标平台,这将创建一个不需要在目标计算机上安装 SWI-Prolog 的可执行文件。

© www.soinside.com 2019 - 2024. All rights reserved.