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

nop*_*ole 20 php ruby perl pre-compilation

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

Jör*_*tag 31

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

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

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

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

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的工作就是转储和加载字节码档案.)


Cha*_*ens 13

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

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


eph*_*ent 11

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

Module :: Compile(或者:这个PMC的东西是什么?)进一步深入探讨这个模糊的功能.它们不经常使用,但......

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

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

  • @Lars:"歇斯底里的葡萄干"等"历史原因".Perl 5从很早就开始支持.pmc文件,但是在被一些Perl 6实现者重新发现之前,它已经多年未使用了. (3认同)

Kek*_*koa 6

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

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


Chr*_*utz 5

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