从插入到本机代码:“动态”语言编译器支持

时间:2010-05-19 13:00:32

标签: python perl programming-languages

首先,我知道动态语言主要由供应商使用;我正在使用它只是为了包含像Perl(我最喜欢的),Python,Tcl,Ruby,PHP等语言的容器词。它们被解释但我在这里感兴趣的是指具有强大功能的语言,以支持程序员的效率和对现代解释语言的典型结构的支持

我的问题是:有些动态语言可以在本机可执行代码中高效编译 - 通常用于Windows平台吗?哪个?也许使用一些第三方的临时工具?我不是在谈论带有完整解释器或类似技巧的大型可执行文件,也不是一些智能模块能够包含自己的依赖或一些必需的模块,而是一个诚实,直接,标准,可靠的可执行代码。

如果没有,有一些技术原因会阻碍这种世界上最好的功能的可用性吗?

谢谢!

丹尼尔

3 个答案:

答案 0 :(得分:4)

我认为你在误解的情况下运行:这些可执行文件并不大,因为它们只是将解释器放在那里,它们很大,因为整个运行时都在那里。

在Windows上,大部分运行时已经安装,因此您无需发货。您认为您的程序很小,但快速查看虚拟内存映射会告诉您,即使是用C编写的小型“hello-world”类型程序也只有几兆字节。

这就是有用的运行时间。

如果确实希望保持较小的出货量,您唯一的选择是使用已经存在的运行时, 意味着C / C ++和(最近)dot-net。

如果确实无法吞下运行时,则Forth会尽可能小。

最好的,最具侵略性的动态语言和最好的Windows编译器是商业Lisps。在生成可执行文件时,它们会进行大量的内联和修剪,因此您最终只能运送您使用的内容。它们仍然比C / C ++程序大1.5到5倍。

就你所知道的语言而言:Perl和他们一样胖。 ActiveState有perlapp,我相信你已经知道了,但你因为它的大小而被解雇了。如果可以,请重新访问。

现在,要回答你的问题(是),有一些技术原因会阻碍这种两全其美的功能的可用性吗?。< / p>

Perl无法进行静态分析(proof),这意味着perl编译器无法告诉可以丢弃的内容。这意味着 Perl运行时的每个部分都需要可用于您的程序,因为您的程序无法指出哪些部分可以被丢弃。

意味着获得一个较小的可执行文件相当于获得一个较小的运行时,如果perl开发人员知道如何在不丢弃任何功能的情况下使perl运行时更小,你应该很自在地接受它们可能会这样做。

如果您愿意使用严格的Python或PHP子集编写,则可以分析这些语言。 Shed SkinHipHop-php非常好,但它们仍然很大,并且它们不支持所有Pythons和PHP的功能,这意味着某些模块根本不起作用。据我所知,没有人对这些语言中的任何一种进行修剪(这些编译器中的大部分焦点都在于改善其低迷的性能),并且在任何人困扰之前可能还有十年或更长时间,但这些仍将是在做这类事情时你必须接受的限制。

答案 1 :(得分:2)

PyPy项目完成了您为相当完整的Python子集所描述的内容。

在一般情况下,这是一个非常难以解决的问题,主要是由于使这些语言“动态”的特性:后期绑定,弱类型变量,数据结构和容器,eval设施但是,编程和元编程等之间存在模糊的分歧。但是很多工作正在涌入其中,例如列出的JavaScript JIT编译器项目here

答案 2 :(得分:1)

Shed Skin是一个实验性(且受限制的)Python-to-C ++编译器,可以执行您描述的操作。正如Marcelo在PyPy中指出的那样,使用Shed Skin可以编译的内容存在限制,但是如果你愿意接受这些限制,你可以实现大的加速。