Ruby,PHP或Perl可以为像Python这样的代码创建预编译文件吗?

对于Python,它可以创建一个预编译的版本file.pyc,以便程序可以运行而无需再次解释。 Ruby,PHP和Perl可以在命令行上执行相同的操作吗?

Ruby没有可移植的字节码规范,因此也没有加载预编译字节码存档的标准方法。 但是,几乎所有Ruby实现都使用某种字节码或intcode格式,其中一些可以转储和重新加载字节码存档。

YARV总是在执行代码之前编译为字节码,但这通常只在内存中完成。 有办法将字节码转储到磁盘。 但是,目前还没有办法再读回来 。 这将在未来发生变化:YARV的字节码validation器正在进行工作,一旦完成,字节码可以安全地加载到VM中,而不用担心损坏。 此外,JRuby开发人员表示,一旦YARV字节码格式和validation程序稳定,他们愿意在JRuby中实现YARV VM模拟器 ,以便您可以将YARV字节码加载到JRuby中。 (请注意,此版本已过时 。)

Rubinius也总是编译为字节码,它有一个编译文件的格式 ( .rbc文件,类似于JVM .class文件),并且有关于字节码存档格式( .rba文件,类似于JVM .jar文件)的讨论。 如果部署应用程序作为YARV字节码变得流行,那么Rubinius有可能实现YARV模拟器。 此外,JRuby开发人员表示,如果Rubinius字节码成为部署Ruby应用程序的流行方式,他们愿意在JRuby中实现Rubinius字节码模拟器 。 (请注意,此版本已过时 。)

XRuby是一个纯编译器,它直接将Ruby源代码编译为JVM字节码( .class文件)。 您可以像任何其他Java应用程序一样部署这些.class文件。

JRuby最初是一个解释器,但它有一个JIT编译器和一个AOT编译器 ( jrubyc ),可以将Ruby源代码编译为JVM字节码( .class文件)。 此外,正在开展工作以创建一个新的编译器,该编译器可以将(通过类型注释的)Ruby代码编译为实际看起来像Java类的JVM字节码 ,并且可以无障碍地从Java代码中使用。

Ruby.NET是一个纯粹的编译器,可以将Ruby源代码编译为CIL字节码(PE .dll.exe文件)。 您可以像任何其他CLI应用程序一样部署它们。

IronRuby也编译为CIL字节码,但通常在内存中执行此操作。 但是,您可以将命令行开关传递给它 ,因此它会将.dll.exe文件转储到磁盘。 一旦你拥有了它们,它们就可以正常部署。

BlueRuby自动将Ruby源代码预解析为BRIL(BlueRuby中间语言),这基本上是一个序列化的分析树。 (有关详细信息,请参阅Blue Ruby – SAP ABAP中的Ruby VM (PDF)。)

认为 (但我绝对不确定)有一种方法可以让Cardinal转储Parrot字节码存档。 (实际上,Cardinal只编译为PAST,然后Parrot接管,所以Parrot的工作就是转储和加载字节码档案。)

Perl 5可以将字节码转储到磁盘,但它有点错误和令人讨厌。 Perl 6有一个非常干净的方法来创建Parrot可以运行的字节码可执行文件。

Perl的即时编译速度非常快,在大多数情况下并不重要。 它重要的一个地方是在CGI环境中,这是mod_perl的用途。

对于歇斯底里的葡萄干,Perl 5在搜索模块时在.pm文件之前查找.pmc文件。 这些文件可能包含字节码,但默认情况下Perl不会写出字节码(与Python不同)。

Module :: Compile(或者:这个PMC的东西是什么?)深入探讨了这个不起眼的function。 它们不经常使用,但……

编写Module :: Compile的聪明人利用这一点,将Perl代码预编译成……好吧,它仍然是Perl,但它已经过预处理。

除了其他好处之外,这还加快了加载时间,并且在使用源filter时更容易调试(Perl代码在由解释器加载之前修改Perl源代码)。

不适用于PHP,尽管大多数PHP设置都包含一个字节码缓存 ,它会缓存已编译的字节码,以便下次运行脚本时,运行编译版本。 这大大加快了执行速度。

我无法通过命令行实际获取字节码。

对于Perl,您可以尝试使用B :: Bytecode和perlcc 。 然而,这两者都是高度实验性的。 而Perl 6即将推出(理论上)并且将在Parrot上并将使用不同的字节码,因此所有这些都将在某种程度上没有实际意义。

这是命令行的一些示例魔术词

 perl -MO=Bytecode,-H,-o"Module.pm"c "Module.pm" 

根据Programming Perl的第三版,可以通过一些实验方式对其进行近似。

如果在PHP脚本上使用Zend Guard ,它实际上是将脚本预编译为字节码,如果加载了Zend Optimizer扩展,则可以由PHP引擎运行。

所以,是的,Zend Guard / Optimizer允许使用预编译的PHP脚本。

对于PHP, Phalanger项目编译为.Net程序集。 我不确定那是不是你要找的东西。

有没有人考虑使用LLVM的字节码,而不是另一个自定义字节码?

Ruby 1.8实际上并不使用字节码(甚至是内部),因此没有预编译步骤。