更快速地编译因子程序

时间:2011-10-06 11:05:21

标签: compilation factor-lang

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

例如,在我的笔记本电脑上编译样本Calculator WebApp大约需要5分钟(i3处理器,2GB内存,运行Fedora 15)。

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

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

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

1 个答案:

答案 0 :(得分:12)

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

分析

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

我在我的64位四核linux系统上编译了Factor(来自git revision 60b1115452,10月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

  

图片

     

要使用自定义图像启动因子,请使用-i = image命令行开关;见Command line switches for the VM

     

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

     

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

USE: furnace
save

可以从头开始创建新图像:Bootstrapping new images

部署应用程序

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

Application deployment tool创建精简图像,其中包含足以运行单个应用程序的代码

  

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

     

大多数情况下,tools.deploy词汇表中的单词不应直接使用;相反,请使用Application deployment UI tool

     

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

结论

我希望你能从中获益(按最快的顺序获胜):

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

    此步骤将我的系统上的编辑从〜30s下调到0.835s

  • 将计算器webapp部署到剥离的堆映像(有关部署提示,请参阅source

简而言之,感谢您将因子引入我的注意力,我希望我的研究结果会有所帮助,干杯