Lisp与Python——静态编译

13 投票
4 回答
2763 浏览
提问于 2025-04-15 22:35

为什么Lisp虽然有很多动态特性,却可以进行静态编译,而Python却不能(如果编译的话就会失去所有动态特性)?

4 个回答

4

其实,没有什么能阻止你把一个Python程序静态编译,只是到现在为止还没有人写出这样的编译器(我个人觉得Python的运行时比CL的简单多了)。

你可以说,主要的区别在于一些细节,比如“花了多少时间在编写编译器上,以及这个语言是否有正式的编写规范”。

我们来看看这些点:

  1. Lisp的编译器已经发展了超过40年,早在70年代就开始了(我不太确定具体的日期,懒得去查)。这就积累了大量关于如何编写编译器的知识。相对而言,Python最初是作为“教学语言”设计的,因此编译器并不是那么重要。
  2. 缺乏规范 - Python没有一个单一的来源来明确规定语言的具体语义。当然,你可以指向PEP文档,但这并不能改变一个事实,那就是唯一真正的规范就是主要实现的源代码,CPython。值得注意的是,这实际上是一个简单的编译器(将代码编译成字节码)。

至于是否可能 - Python使用了相对简单的结构来处理符号等,主要是它的字典。你可以把它们当作程序的符号表。你可以给数据类型打标签,以识别基本类型,然后根据存储的名称和内部结构获取其他类型。语言的其他部分也相当简单。唯一缺少的就是实际的工作来实现它,并确保它能正确运行。

4

说实话,当你执行Python脚本时,它们会被编译成.pyc文件,具体可以参考“编译过的”Python文件

你还可以使用像py2exe这样的工具,把Python程序编译成可执行文件。

13

其实,Python是可以进行静态编译的,虽然这样做的效率稍微低一些,因为Python的本地作用域比较灵活。此外,如果你想保留一些动态特性(比如eval这个功能),那么在编译后的程序中需要包含编译器,但这也不是不可能。

研究表明,大多数Python程序在静态分析时看起来是动态的,但在运行时其实是相对静态和单一的。这意味着在运行时使用即时编译(JIT)的方法对Python程序效果更好。你可以看看unladen-swallow、PyPy和Psyco这些项目,它们都是把Python编译成机器代码的方式。另外,还有IronPython和Jython,它们使用最初为静态语言设计的虚拟机来将Python编译成机器代码。

撰写回答