首先,我知道动态语言是一个主要由供应商使用的术语;我使用它只是为了包含Perl (我最喜欢的语言)、Python、Tcl、Ruby、PHP等语言。它们是解释型的,但我感兴趣的是指具有强大功能的语言,这些语言支持程序员的效率和对现代解释型语言的典型构造的支持
我的问题是:有没有动态语言可以高效地编译成本机可执行代码--通常是针对Windows平台?哪几个?也许使用一些第三方的ad-hoc工具?我不是在谈论携带完整解释器或类似技巧的大型可执行文件,也不是一些能够包含自己的依赖项或所需模块的智能模块,而是诚实、直接、标准、可靠的可执行代码。
如果没有,是否有一些技术原因抑制了这种两全其美的功能的可用性?
谢谢!
丹尼尔
发布于 2010-05-19 21:39:04
我认为你是在一种误解下操作:这些可执行文件并不大,因为它们只是把解释器放在里面,它们很大,因为整个运行时都在里面。
在Windows上,你的大部分运行时都已经安装好了,所以你不需要发布它。您认为您的程序很小,但是快速查看虚拟内存映射会告诉您,即使是用C编写的小型"hello-world“类型的程序也有几兆字节大。
这就是有用的运行时有多大。
如果你真的想保持你的船大小很小,你唯一的选择就是使用已经存在的运行时,也就是C/C++和(最近的).
如果你真的不能接受运行时,那么Forth就是最小的。
拥有最好的Windows编译器的最好的、最激进的动态语言是商业Lisp。他们在生成可执行文件时做了大量的内联和修剪,所以你最终只能发布你所使用的东西。它们仍然比C/C++程序大1.5到5倍。
就您所知道的语言而言: Perl是最好的语言。ActiveState有perlapp,我相信你已经知道了,但你因为它的大小而不屑一顾。如果可以的话,请重新访问它。
现在,为了回答你的问题,是否有一些技术原因阻碍了这种两全其美的功能的可用性?:是的。
Perl不能被静态分析(proof),这意味着perl编译器无法分辨哪些内容可以被丢弃。这意味着Perl运行时的每个部分都需要对您的程序可用,因为您的程序无法指示哪些部分可以丢弃。
这意味着获得一个较小的可执行文件等同于获得一个较小的运行时,您应该欣然接受这样一个事实:如果perl开发人员知道如何在不丢弃任何特性的情况下使perl运行时变得更小,他们可能会这么做。
如果您愿意使用Python或PHP的严格子集编写代码,那么可以分析这些语言。Shed Skin和HipHop-php非常好,但是它们仍然很大,而且它们不支持Python和HipHop-php的所有特性,这意味着一些模块根本不能工作。据我所知,还没有人为这两种语言实现剪枝(这些编译器的大部分关注点是改善它们平淡无奇的性能),可能还需要十年或更长时间才会有人担心,但这些仍然是你在做这类事情时必须接受的限制。
发布于 2010-05-19 21:04:40
PyPy项目完成了您对Python相当完整的子集的描述。
在一般情况下,这是一个很难解决的问题,这很大程度上是由于使这些语言“动态”的属性:后期绑定、弱类型变量、数据结构和容器、eval
工具、编程和元编程之间的模糊划分等。但是,正在投入大量的工作,例如列出了here的JavaScript即时编译器项目。
发布于 2010-05-19 21:16:53
Shed Skin是一个实验性的(受限的) Python-to-C++编译器,它可以做你所描述的事情。正如Marcelo在上面使用PyPy时指出的那样,您可以使用Shed编译的内容存在限制,但是如果您愿意接受这些限制,您可以实现较大的加速。
https://stackoverflow.com/questions/2865669
复制相似问题