如果编译Python的exec和eval?

Nic*_*ick 5 python eval compilation exec

eval和exec的等价物是否可以用编译语言存在?如果是这样,他们将如何编译(粗略地说)?

Gre*_*ill 5

当然,各种Lisp环境已有数十年的能力.Lisp编译器通常基于每个函数工作,编译器和运行时系统协同工作.

当被问到eval什么时,Lisp运行时环境会将列表(数据结构)传递给编译器进行编译.编译器可以生成机器代码(或者可能是字节码,具体取决于系统),然后该函数将在机器级别调用,就像程序中的每个其他函数一样.


Nic*_*tin 5

对于初学者来说,python 一种编译语言,它只是在运行时进行编译.话虽这么说,你需要做的eval任何其他编译语言的实现都是能够运行编译器(并动态加载目标代码) - 你可以很容易地用Python(和一连串的其他语言)来做到这一点,因为编译器是运行时的组成部分.从技术上讲,没有什么可以阻止用C编写的程序调用编译器并在运行时加载结果(使用dlopen),这不常见,因为C运行时不需要编译器,因此大多数用户没有编译器.

  • 不仅如此,C还是一种已知本身难以编译的语言,因此调用编译器"eval"某些东西可能会迫使用户等待5分钟或更糟.Python有点欺骗,因为它不会编译到机器代码而是编译到虚拟机,所以你可以让虚拟机支持复杂的东西,使语言更容易编译.Lisp很容易编译,因为源代码基本上已经是一个抽象语法树.另一种易于编译的语言是Forth - 原始编辑器在键入时编译每行代码. (3认同)
  • @slebetman:实际上有些系统调用C编译器,它们非常快(一些pypy模式就是一个例子) - 现代C编译器非常快(不是C++),实际上是最耗时的组件C中的构建周期通常是链接器(取决于平台),如果你可以缩短/消除它,你通常要评估的代码片段的大小通常不会导致显着的延迟(作为一个点作为参考,`icl`编译C行到机器码的速度比python编译器将python行转换为VM操作码更快. (3认同)