Perl 6 Rakudo Star为何安装耗时远长于Common Lisp?
好问题!我来拆解一下两者安装耗时差异的核心原因,完全聚焦在为什么慢这个点上:
安装包的内容复杂度天差地别
Rakudo Star不只是一个Perl 6编译器,它是一套完整的Perl 6开发环境——包含了Rakudo编译器本身、MoarVM虚拟机、zef包管理器、数十个常用核心模块、完整离线文档,甚至还有示例代码。这些组件大部分需要在你的机器上完成编译或配置步骤。而Portacle本质是预编译好的SBCL(Common Lisp实现)+ Emacs编辑器+基础工具链的打包合集,大部分内容是现成的二进制文件,你下载后基本就是解压+少量配置,没有大规模编译过程。Perl 6的实现链本身需要多阶段编译
Rakudo是用NQP(Not Quite Perl,一种Perl 6子集)编写的,安装时需要先编译NQP,再用编译好的NQP去编译Rakudo本身,最后还要把核心模块编译成MoarVM的字节码缓存。这个多阶段的编译链条本身就需要大量时间。而Common Lisp的SBCL是直接用C语言编译好的二进制程序,Portacle直接打包了这个预编译产物,不需要在你的笔记本上重新编译编译器本身。模块的处理方式不同
Rakudo Star里的很多核心模块是用Perl 6编写的,安装时需要将这些Perl 6源码编译成MoarVM能直接执行的字节码,这个过程对每个模块都要单独处理。而Portacle里的Common Lisp基础库,要么是预编译好的.fasl字节码文件,要么是直接加载源码——Common Lisp的解释/加载速度本身就很快,不需要额外的耗时编译步骤。平台适配的实现方式不同
Portacle是针对Windows、macOS、Linux等主流平台提前打包好的预编译版本,完全适配对应平台的架构和环境,用户拿到手就能用。而Rakudo Star很多时候需要在你的机器上进行本地编译适配,根据你的系统架构、依赖库版本生成最适合的二进制文件,这个适配过程自然会增加安装耗时。
内容的提问来源于stack exchange,提问作者Clint

