我一直在玩Prolog的qsave_program功能. 我在市场上寻找一种可以加速我的Prolog代码的东西,或者可能允许与C/C++集成的东西.

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

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

在引擎盖下面这是qsave_program.

在判断了二进制文件后,它是预期的ELF格式,所以我try 运行它.

然而,当我在终端上运行这个编译好的./prog程序时,输出日志(log)表明可执行文件确实从各个地方拉入swi—prolog库. 这对我来说表明,与通过hashbang脚本使用普通的旧SWI—prolog可执行文件相比,使用编译后的代码没有那么多的性能好处.

我错过了什么吗? 有没有一种方法可以强制编译过程打包到必要的库中(为了更大的可移植性),整个过程是否涉及到Prolog代码的优化,或者避免这里编译?

推荐答案

the documentation:

另一个解决方案是使用保存的状态(本章的主要主题)和安装的开发系统,并使用--no-autoloadqsave_program/2autoload(false)选项禁用自动加载要求到状态中.这允许将应用程序创建为单个文件,同时避免需要确保状态是自包含的.对于大型程序,这种技术通常会减少一个数量级的启动时间.该机制特别适合于内部和云部署.它提供了一些保护,防止判断源.详情见第14.6节.

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

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

我认为stand_alone(true)个选项是你需要的.

C++相关问答推荐

Pure Win32 C(++)-除了替换控件的窗口程序之外,还有其他方法可以在输入时禁用按钮吗?

malloc实现:判断正确的分配对齐

通过管道将一个子系统的标准输出发送到另一个子系统的标准输出

ZED for SDL上的C语言服务器

为什么双重打印与C中的float具有不同的大小时具有相同的值?

在c++中使用堆栈的有效括号

使用双指针动态分配和初始化2D数组

有什么方法可以将字符串与我们 Select 的子字符串分开吗?喜欢:SIN(LOG(10))

在txt文件中找到指定的字符串,并从数字中减go 相同的值

从C文件中删除注释

C语言中的外部关键字

仅从限制指针参数声明推断非混叠

For循环不会迭代所有字符串字符吗?(初学者问题)

为什么编译器不能简单地将数据从EDI转移到EAX?

当用C打印过多的';\n';时输出不正确

'printf("%s", user_input)' 危险吗?

macos/arm64 上地址空间不使用第一位吗?

如何用用户输入的多个字符串填充数组?

UEFI 应用程序中的计时器回调仅在 AMI BIOS 中挂起

段错误try 访问静态字符串,但仅有时取决于构建环境