之前写过一篇博文,叫做《python_metaclass浅析》。里面对python的源码分析直接用的CPython的源码,现在看觉得当时还是太天真了。所以,借着这个机会(机会都是你给自己的吧= =)把Python和Python的各个实现的关系理清,也顺道给自己和别人普及了一下编译原理。
首先引入一下:
1、自然语言和编程语言
什么是自然语言:自然语言通常是指一种自然地随文化演化的语言,英语、汉语、日语为自然语言的例子。(自然语言)
定义一门自然语言可以有3个方面:(《Formal Syntax and Semantics of Programming Languages》)
- 语法
- 语义
- 语用
这些术语也适用于编程语言
也就是说,定义一门编程语言同样可以从这三方面入手
2、编程语言是什么?
——@Belleve from Zhihu
要设计一门编程语言需要做什么?如何自己创建一种编程语言?
- 语义设计——semantics describes the behavior that a computer follows when executing a program in the language
- 语法设计——Syntax defines the formal relations between the constituents of a language, thereby providing a structural description of the various expressions that make up legal strings in the language
- 语用设计——Pragmatics alludes to those aspects of language that involve the users of the language, namely psychological and sociological phenomena such as utility, scope of application, and effects on the users
- 设计一个解释器/编译器
一门“编程语言”,就是说这门语言的语义设计、语法设计和语用设计。而不包括编译器的设计。
可见,前三方面其实适合一门编程语言对应的,那么第四方面是什么呢?它就是一门编程语言的实现。
3、编程语言的实现是什么?
这个解释器/编译器,你可以用各种语言来写,例如广泛使用的C、RPython(Restricted Python)、机器码等等,非常广泛。例如C就有clang和gcc。
一个有趣的比喻:编程语言和编程语言的实现 & 自然语言和自然语言的实现
编程语言和编程语言的实现,就好像粤语和广州话的关系,也好像是普通话和北京话的关系。粤语包含广州话,也包含香港话。普通话包含北京话,也包含很多其他省份的语种。
=====================分割线=============================
具体到Python:
1、Python是什么?
Python 是一门编程语言,它包含了它的语法设计、语义设计和语用设计。
- 语法设计、语义设计 (from wiki)
2、Python的实现是什么?
目前比较流行的解释器有:CPython(C)、IronPython(C#)、Python for .NET(C#)、pypy(RPython)、Jython(Java)等等
以这些解释器对内置字典的实现为例子:
- CPython:dictobject.c
- Jython:PyDictionary.java
- IronPython:PythonDictionary.cs
- Python for .NET:pydict.cs
- PyPy:dictmultiobject.py
一看就知道了吧,五个文件,对应着五个解释器,五种实现。那么,一个解释器具体的实现又是怎么样的呢?
3、编译原理的实质?
编译原理:关注的是编译器方面的产生原理和技术问题。编译原理及技术从本质上来讲就是一个算法问题,我们学的数据结构与算法分析也是讲算法的,不过讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比较专注解决一种的算法了。(编译原理学习)
编译原理包含哪几方面的内容,研究哪些算法:
- 词法分析(tokenizer、lexer):正则表达式、BNF、自动机原理(DFA、NFA等)等
- 语法分析(parser一部分)(上下文无关文法、非上下文无关文法、LL算法,递归下降算法,LR算法)
- 语义分析(parser一部分)
- 运行时环境(runtime environment)
- 中间代码(intermediate code)(其中CIL、bytecode等->JVM、PVM、LLVM)
- 代码生成
- 代码优化
解析:
- 词法分析、语法分析:生成AST(abstract syntax tree,抽象语法树)
- 语义分析:完善这棵AST
- 运行时环境:关于程序是怎么存储,怎么装载,怎么执行的问题
- 中间代码、代码生成、代码优化:比较难。对于解释性语言来说,可能没有最后两个步骤
4、具体解释器的构造
还是以Python(PyPy)为例子说明这些部分在解释器中扮演什么样的角色:
- 词法分析、语法分析、语义分析(pytokenizer.py、pylexer.py、parser.py、pygram.py、astbuilder.py、optimize.py等等等等)
- 运行时环境:包含太多(objspace、memory等等等等)
- 中间代码、代码生成、代码优化:中间代码当然是bytecode了;而由于PyPy使用了JIT(just-in-time compiler,它有最后的两个步骤,会在运行时将字节码先转化成机器码)
由于本科期间编译原理学的实在有点菜,所以要理清楚PyPy里面解释器和JIT的构造恐怕不是一朝一夕的时间(”可惜没如果 只剩下结果”….),以后可能会补充一篇文章理清楚!!!!!!!
Reference: