Lisp与Python——静态编译

Lisp与Python——静态编译,python,lisp,compilation,dynamic-languages,Python,Lisp,Compilation,Dynamic Languages,为什么Lisp及其所有动态特性都可以静态编译,而Python却不能(不丢失其所有动态特性) 有关Python脚本的价值,请参阅执行时将Python脚本编译成.pyc文件 您还可以使用诸如之类的工具将Python程序编译成可执行文件。没有任何东西可以阻止Python的静态编译。它的效率有点低,因为Python显示了更多可变的局部作用域,而且,为了保留一些动态属性(例如eval),您需要在编译程序中包含编译器,但没有什么可以阻止这一点 也就是说,研究表明,大多数Python程序虽然在静态分析下是动态

为什么Lisp及其所有动态特性都可以静态编译,而Python却不能(不丢失其所有动态特性)

有关Python脚本的价值,请参阅执行时将Python脚本编译成.pyc文件


您还可以使用诸如之类的工具将Python程序编译成可执行文件。

没有任何东西可以阻止Python的静态编译。它的效率有点低,因为Python显示了更多可变的局部作用域,而且,为了保留一些动态属性(例如eval),您需要在编译程序中包含编译器,但没有什么可以阻止这一点


也就是说,研究表明,大多数Python程序虽然在静态分析下是动态的,但在运行时却是相当静态和单态的。这意味着运行时JIT编译方法在Python程序上工作得更好。请参阅unladenswallow、PyPy、Psyco,了解将Python编译成机器代码的方法。还有IronPython和Jython,它们使用最初用于静态语言的虚拟机将Python编译成machinecode。

事实上,没有任何东西可以阻止您静态编译Python程序,只是到目前为止还没有人编写这样的编译器(我个人觉得Python的运行时与CL相比非常简单)

你可以说,区别在于细节,比如“实际编写编译器花费了多少时间,语言是否有编写编译器的正式规范”

让我们谈谈这些要点:

  • Lisp编译器已经发展了40多年,如果不是更早的话,也要追溯到70年代(我不确定自己的日期,太懒了,谷歌也不知道确切的日期)。这就产生了大量关于如何编写编译器的知识。OTOH,Python名义上被设计为“教学语言”,因此编译器并没有那么重要
  • 缺乏规范-Python没有一个单一的源代码来指定语言的确切语义。当然,您可以指向PEP文档,但它仍然没有改变这样一个事实,即真正的规范是主实现CPython的源代码。这是一个简单的编译器(转换成字节码)

  • 至于是否可能——Python使用相当简单的结构来处理符号等,即它的字典。你可以将它们视为程序的符号表。你可以标记数据类型以识别原始类型,并根据存储的命名和内部结构来获取其余的数据类型。该语言的其余部分也相当简单。唯一的一点是sing是实现它并使其正确运行的实际工作。

    Python可以被“编译”,编译被视为从一种图灵完整语言(源代码)到另一种图灵完整语言(目标代码)的转换。然而,在Lisp中,对象是汇编,这在理论上可以用Python实现(已证明),但不可行

    然而,真正的原因是不那么扁平化。Lisp在许多方面是一种革命性的语言,它在方言方面开创了我们今天习惯的编程语言的许多功能。然而,在Lisps中,它们只是从语言的基础逻辑上“遵循”。语言的灵感来自Lisps的原始表达能力,如JavaScript、Ruby、Perl和Python都必须进行解释,因为要在一种具有“类似Algol语法”的语言中获得这些特性非常困难

    Lisp从“homo-IGNORIC”中获得了这些特性Lisp程序和Lisp数据结构之间没有本质区别。Lisp程序是数据结构,如果您愿意,它们是用这样的S表达式对程序进行的结构描述,因此编译后的Lisp程序可以有效地“解释自身”,而无需词法分析器所有这些东西,一个lisp程序可以被看作是一个解析树的手动输入。这需要一种语法,许多人觉得这种语法是不直观的,因此有很多人试图将这种范式的原始表达能力转换成一种更可读的语法,这意味着使用c语言是不可行的,但不是不可能的将其向装配方向移动

    此外,将Python编译成汇编可能比在虚拟机上“解释”它的一半要慢和大,Python中的许多特性都依赖于语法分析


    尽管上面的内容是由一个巨大的lisp粉丝编写的,但请记住这种利益冲突。

    不确定它是否具有可比性。没有python解释器,您无法运行pyc文件。相反,(一些)Lisp编译为本机机器代码。py2exe生成的EXE中嵌入了字节码、python解释器和DLL,但它不是机器代码。@joaquin:编译和解释之间没有硬性规定。没有任何东西可以阻止我们构建一个直接运行python字节码的处理器。或者从另一端,您可以使用编译后的代码x86机器代码,并在x86仿真器中进行解释。毕竟,代码就是数据,数据就是代码。@Ants:谢谢。我想我理解你的观点,但是,对于给定的条件和处理器,本机机器代码将是更优化的代码形式,速度可能更快。你提到的其他可能性至少还有一步,还有连续不会那么快。这是错的吗?也许在概念上没有区别,但在实践中是一样的吗?我不是计算机科学家,所以如果我说了什么请原谅stupid@joaquin:只需将字节码替换为执行部分,即可将获取分支执行解释器循环转换为编译器s删除获取分支开销(包括昂贵的间接分支)数据显示,对于Python来说,循环开销与操作码执行相比并没有那么大。一个好的解释器很容易比简单的编译方法更快。还有一些技术,如子程序线程,其中