更快速地编译因子程序

Yam*_*vic 8 compilation factor-lang

我真的很喜欢因子语言.但是我发现用它编写的编译程序非常慢,因此使用Factor创建真正的项目是不可行的.

例如,在我的笔记本电脑上编译示例计算器WebApp大约需要5分钟(i3处理器,2GB RAM,运行Fedora 15).

我已经四处寻找,但找不到比使用解释器(主要因素二进制可执行文件)更快的编译因子程序的方法.

当您尝试仅为每次运行使用解释器而不是将程序"部署"到本机二进制文件(甚至不能在许多程序上工作)时,这会变得荒谬.这意味着每次我想运行计算器时,我都要等待5分钟的冷启动时间.

我想知道这是否是一个常见的问题,以及是否有一个很好的方法来解决它.

seh*_*ehe 12

我承认在今天之前,我从未听说过因素.我借此机会玩它.它看起来不错(让我想起squeak-vm和lisp同时).我会削减smalltalk(非常有意思的双关语)并跳转到你的问题.

分析

似乎因子的工作方式导致加载词汇量变慢.

我在64位四核linux系统上编译了Factor(来自git revision 60b1115452,Thu Oct 6).将所有内容放在tmpfs上的构建目录需要641Mb,其中2x114Mb位于factor.image中,它是备份(factor.image.fresh).

strace加载计算器应用程序时,会加载大量因子文件:

  • 触摸了3175个因子文件.
  • 在我的盒子上编辑这些大约需要30秒
  • 内存使用量最大不超过500Mb(虚拟)和300Mb保留集

我强烈怀疑你的盒子内存不足,可能会变得非常快速
这肯定会解释编译花费5分钟

您能否确认是否属于这种情况(可能是您正在运行某种共享主机或VPS设备).如果运行虚拟机,请考虑增加可用的系统内存.


保存堆图像(快照)

我之前已经提到过factor.image文件(114Mb).它包含因子VM 的"预编译"(实际上是自举)堆映像.VM中的所有操作(处理UI侦听器或编译因子文件)都会影响堆映像.

为避免必须一次又一次地重新编译源文件,可以将最终结果保存到自定义堆映像中:

http://docs.factorcode.org/content/article-images.html

图片

要使用自定义图像启动Factor,请使用-i = image命令行开关; 请参阅VM的命令行开关.

保存自定义图像的一个原因是,如果您发现自己在每个因子会话中加载相同的库; 有些库需要一些时间来编译,因此使用加载的库保存图像可以节省大量时间.

例如,要在加载Web框架的情况下保存图像,

USE: furnace
save
Run Code Online (Sandbox Code Playgroud)

可以从头开始创建新图像:引导新图像

部署应用程序

保存堆映像会导致文件(通常)大于原始引导程序映像.

应用程序部署工具创建一个包含足够的代码精简图像运行一个应用程序

tools.deploy词汇表中实现的独立应用程序部署工具将词汇表编译为运行词汇表MAIN: hook 的本机可执行文件.部署的可执行文件不依赖于正在安装的因子,并且不公开任何源代码,因此适合于提供商业最终用户应用程序.

大多数情况下,不应直接使用tools.deploy词汇表中的单词; 相反,使用应用程序部署UI工具.

您必须明确指定所需的主要子系统,以及所需的反射支持级别.这是通过在部署之前修改部署配置来完成的.

结论

我希望你会受益(按最快的顺序):

  • 增加可用RAM (仅在虚拟环境中快速...)
  • 使用保存堆映像
    USE: db.sqlite
    USE: furnace.alloy
    USE: namespaces
    USE: http.server
    save
    
    Run Code Online (Sandbox Code Playgroud)

    这一步使我的系统编译从〜30s0.835s

  • 将计算器webapp部署到剥离的堆映像(请参阅部署提示的源代码)

简而言之,感谢我将因素引入我的注意力,我希望我的发现会有任何帮助,干杯