我是否理解Python的编写/实现方式是否正确?

时间:2018-01-17 03:57:51

标签: python compiler-construction

我想了解Python如何在基础层面工作,这有助于我更多地了解其他编译/解释语言的内部工作原理。不幸的是,编译器类现在有点远了。从我在本网站和其他地方读到的内容来看,回答"What base language is Python written in"的人似乎表达了在谈论语言的“规则”与使用语言规则的方式之间存在差异。那么,说Python(和其他高级语言)所有本质上只是用任何自然语言“编写”的规则集是否正确?然后,它们实际使用的方式(使用的意思是编译/解释实际创建的东西)可能会有所不同,各种语言被用来实现编译器?所以在这种情况下,CPython,IronPython和Jython在语法上是相同的语言,它们都遵循相同的规则集,只是这些规则是用它们各自的语言实现的。

请告诉我,如果我对此的理解是正确的,如果你有任何补充,可能会进一步巩固我的理解,或者如果我公然错了。

3 个答案:

答案 0 :(得分:7)

用Python编写的代码应该能够在任何Python解释器上运行。 Python本质上是一种带有参考实现(CPython)的编程语言的规范。每当Python规范和PEP不明确时,其他解释器通常会选择实现相同的行为,除非他们有理由不这样做。

话虽这么说,用Python编写的程序完全有可能在不同的实现上表现不同。这是因为许多程序员冒险进入“未定义的行为”。例如,CPython有一个“全局解释器锁”,这意味着一次只有一个线程实际执行(以某些条件为模),但其他解释器没有这种行为。因此,例如,有关原子性的不同行为(例如,每个字节码指令在CPython中是原子的)与其他解释器一样。

您可以将其视为C. C语言规范,但有许多编译器实现它:GCC,LLVM,Borland,MSVC ++,ICC等。有编程语言和这些编程语言的实现。

答案 1 :(得分:4)

当你区分意味着什么 意味着什么时,你就是对的。

的含义

编译语言的第一步是解析其代码以生成抽象语法树。这是一棵树,它定义了你所编写的代码的含义,它应该做什么。例如,如果您有以下代码

a = 1
if a:
    print('not zero')

它会生成一个看起来或多或少的树。

             code
   ___________|______
   |                 |
declaration          if
 __|__             ___|____
 |    |            |       |
 a    1            a     print
                           |
                       'not zero'

这代表了代码的含义,但没有告诉我们它是如何执行代码的。

编辑:当然上面的内容远不是Python的解析器实际生成的内容,为了便于阅读,我做了大量的过度简化。幸运的是,如果您对实际生成的内容感到好奇,可以import ast提供Python解析器。

import ast
code = """
a = 1
if a:
    print('not zero')
"""
my_ast = ast.parse(code)

享受检查my_ast

做什么

一旦有 AST ,您就可以将其转换回您想要的任何内容。它可以是C,它可以是机器代码,如果你愿意,你甚至可以将它转换回Python。最常用的Python是CPython,用C语言编写。

幕后发生的事情非常接近你的理解。首先,语言是一组定义行为的规则,只有这样的语言才能定义它是如何实现的。当然,是的,您可以使用相同语言的不同实现,但行为略有不同。

答案 2 :(得分:-2)

基本上它是一堆实现函数,模块等的字典数据结构。全局变量及其值存在于每个模块的字典中。类中的变量是另一个字典。对象中的那些是另一个字典,函数中的字典也是如此。即使函数调用也有自己的字典,因此不同的调用具有不同的局部变量副本。

与大多数其他语言不同,它没有词汇范围,在我看来,它被设计为使用字典的编码器尽可能简单地实现。