2024-04-19 13:49:24 发布
网友
在this spot in this article上,作者注意到自动串接是解析器/编译器的一个特性,而不是解释器,这就是为什么必须在运行时使用+来连接字符串。在
+
我对此一无所知。我知道你可以用+连接,我知道两个并排的字符串是自动连接的,我知道你当然不能用包含字符串的变量那样做,但是我不知道解析器/编译器和解释器(对于python,或者一般来说)之间的区别,我不知道它是如何与整个字符串联系起来的连接的事情。在
解释???在
Python是一种解释语言(与C++语言相反,这些语言在编译前编译成机器代码)。在
现在有一个中间步骤:将源(文本)文件编译为字节码,然后由Python解释器运行该字节码。在
字节码编译器已经完成逐字串接(如"a" "b"变成{})了。"a" + "b"也是如此,因为编译器已经可以计算出文本值:
"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
但是对于不能在编译时简单地推断出的值,解释器的工作是进行连接:
编译语言(例如: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的情况下运行脚本,就会出现连接结果。即使没有预编译文件,连接结果也会被放在字节码中,所以每次运行此代码(例如函数)时,也不需要计算串联的结果。在
pyc
另一方面,如果使用+,则字节码将包含这两个字符串,并且每次运行此代码时都将计算表达式。编辑:并非总是如Tim Pietzcker在his answer中所指出的那样-但是在这种情况下,这是编译器的优化问题,而不是语言语义保证总是发生的行为。在
注意,因为语法是语言定义的一部分,所以编译器和解释器之间的区别在这里无关紧要。在
参考号:lexical analysis in Python
Python是一种解释语言(与C++语言相反,这些语言在编译前编译成机器代码)。在
现在有一个中间步骤:将源(文本)文件编译为字节码,然后由Python解释器运行该字节码。在
字节码编译器已经完成逐字串接(如})了。
"a" "b"
变成{"a" + "b"
也是如此,因为编译器已经可以计算出文本值:但是对于不能在编译时简单地推断出的值,解释器的工作是进行连接:
^{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
相关问题 更多 >
编程相关推荐