Python解析器/编译器vs.解释器,以及字符串连接compiletime vs.runtime?

2024-04-19 13:49:24 发布

您现在位置:Python中文网/ 问答频道 /正文

this spot in this article上,作者注意到自动串接是解析器/编译器的一个特性,而不是解释器,这就是为什么必须在运行时使用+来连接字符串。在

我对此一无所知。我知道你可以用+连接,我知道两个并排的字符串是自动连接的,我知道你当然不能用包含字符串的变量那样做,但是我不知道解析器/编译器和解释器(对于python,或者一般来说)之间的区别,我不知道它是如何与整个字符串联系起来的连接的事情。在

解释???在


Tags: 字符串in解析器编译器article作者特性this
3条回答

Python是一种解释语言(与C++语言相反,这些语言在编译前编译成机器代码)。在

现在有一个中间步骤:将源(文本)文件编译为字节码,然后由Python解释器运行该字节码。在

字节码编译器已经完成逐字串接(如"a" "b"变成{})了。"a" + "b"也是如此,因为编译器已经可以计算出文本值:

>>> import dis
>>> def s(): print "a" "b"
...
>>> dis.dis(s)
  1           0 LOAD_CONST               1 ('ab')
              3 PRINT_ITEM
              4 PRINT_NEWLINE
              5 LOAD_CONST               0 (None)
              8 RETURN_VALUE
>>> def s(): print "ab"
...
>>> dis.dis(s)
  1           0 LOAD_CONST               1 ('ab')
              3 PRINT_ITEM
              4 PRINT_NEWLINE
              5 LOAD_CONST               0 (None)
              8 RETURN_VALUE
>>> def s(): print "a"+"b"
...
>>> dis.dis(s)
  1           0 LOAD_CONST               3 ('ab')
              3 PRINT_ITEM
              4 PRINT_NEWLINE
              5 LOAD_CONST               0 (None)
              8 RETURN_VALUE

但是对于不能在编译时简单地推断出的值,解释器的工作是进行连接:

^{pr2}$

编译语言(例如:C,C++)将人类可读源代码翻译成机器可读的机器代码。在

每次执行一个步骤时,一种解释语言(例如:6502上的旧microsoft BASIC)都会重新计算该步骤需要执行的操作。在

中间立场是存在的。像Python和Java这样的语言可以编译,但是它们不能编译成机器代码;相反,它们编译成理想化的、仅限于软件的机器字节码。这就提供了很好的可移植性和不错的速度,尤其是与JIT(Java、Pypy、cpython2.[56]和psyco-all-JIT编译字节码)结合使用时更是如此。在

令人困惑的是,Java人经常说他们的语言是编译的,Python不是编译的,而且有人曾经讨论过在硬件中实现Java运行时环境,尽管我不确定它是否实现过。在

此外,gcj将Java源代码编译为机器可读的可执行文件,Cython也是如此。但是Java和Python都是字节码解释的。在

当Python代码被转换成字节码时,并行字符串被合并。这只执行一次-每次在不删除预编译的pyc的情况下运行脚本,就会出现连接结果。即使没有预编译文件,连接结果也会被放在字节码中,所以每次运行此代码(例如函数)时,也不需要计算串联的结果。在

另一方面,如果使用+,则字节码将包含这两个字符串,并且每次运行此代码时都将计算表达式。编辑:并非总是如Tim Pietzcker在his answer中所指出的那样-但是在这种情况下,这是编译器的优化问题,而不是语言语义保证总是发生的行为。在

注意,因为语法是语言定义的一部分,所以编译器和解释器之间的区别在这里无关紧要。在

参考号:lexical analysis in Python

相关问题 更多 >