Python是什么

之前写过一篇博文,叫做《python_metaclass浅析》。里面对python的源码分析直接用的CPython的源码,现在看觉得当时还是太天真了。所以,借着这个机会(机会都是你给自己的吧= =)把Python和Python的各个实现的关系理清,也顺道给自己和别人普及了一下编译原理。

首先引入一下:

1、自然语言和编程语言

什么是自然语言:自然语言通常是指一种自然地随文化演化的语言,英语、汉语、日语为自然语言的例子。(自然语言)

定义一门自然语言可以有3个方面:(《Formal Syntax and Semantics of Programming Languages》)

  1. 语法
  2. 语义
  3. 语用

这些术语也适用于编程语言

也就是说,定义一门编程语言同样可以从这三方面入手

2、编程语言是什么?

——@Belleve from Zhihu

要设计一门编程语言需要做什么?如何自己创建一种编程语言?

  1. 语义设计——semantics describes the behavior that a computer follows when executing a program in the language
  2. 语法设计——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
  3. 语用设计——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
  4. 设计一个解释器/编译器

一门“编程语言”,就是说这门语言的语义设计、语法设计和语用设计。而不包括编译器的设计。

可见,前三方面其实适合一门编程语言对应的,那么第四方面是什么呢?它就是一门编程语言的实现。

3、编程语言的实现是什么?

这个解释器/编译器,你可以用各种语言来写,例如广泛使用的C、RPython(Restricted Python)、机器码等等,非常广泛。例如C就有clang和gcc。

一个有趣的比喻:编程语言和编程语言的实现 & 自然语言和自然语言的实现

编程语言和编程语言的实现,就好像粤语和广州话的关系,也好像是普通话和北京话的关系。粤语包含广州话,也包含香港话。普通话包含北京话,也包含很多其他省份的语种。

=====================分割线=============================

具体到Python:

1、Python是什么?

Python 是一门编程语言,它包含了它的语法设计、语义设计和语用设计。

  1. 语法设计、语义设计 (from wiki)
2、Python的实现是什么?

目前比较流行的解释器有:CPython(C)、IronPython(C#)、Python for .NET(C#)、pypy(RPython)、Jython(Java)等等

以这些解释器对内置字典的实现为例子:

  1. CPython:dictobject.c
  2. Jython:PyDictionary.java
  3. IronPython:PythonDictionary.cs
  4. Python for .NET:pydict.cs
  5. PyPy:dictmultiobject.py

一看就知道了吧,五个文件,对应着五个解释器,五种实现。那么,一个解释器具体的实现又是怎么样的呢?

3、编译原理的实质?

编译原理:关注的是编译器方面的产生原理和技术问题。编译原理及技术从本质上来讲就是一个算法问题,我们学的数据结构与算法分析也是讲算法的,不过讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比较专注解决一种的算法了。(编译原理学习

编译原理包含哪几方面的内容,研究哪些算法:

  1. 词法分析(tokenizer、lexer):正则表达式、BNF、自动机原理(DFA、NFA等)等
  2. 语法分析(parser一部分)(上下文无关文法、非上下文无关文法、LL算法,递归下降算法,LR算法)
  3. 语义分析(parser一部分)
  4. 运行时环境(runtime environment)
  5. 中间代码(intermediate code)(其中CIL、bytecode等->JVM、PVM、LLVM)
  6. 代码生成
  7. 代码优化

解析:

  1. 词法分析、语法分析:生成AST(abstract syntax tree,抽象语法树)
  2. 语义分析:完善这棵AST
  3. 运行时环境:关于程序是怎么存储,怎么装载,怎么执行的问题
  4. 中间代码、代码生成、代码优化:比较难。对于解释性语言来说,可能没有最后两个步骤
4、具体解释器的构造

还是以Python(PyPy)为例子说明这些部分在解释器中扮演什么样的角色:

  1. 词法分析、语法分析、语义分析(pytokenizer.pypylexer.pyparser.pypygram.pyastbuilder.pyoptimize.py等等等等)
  2. 运行时环境:包含太多(objspacememory等等等等)
  3. 中间代码、代码生成、代码优化:中间代码当然是bytecode了;而由于PyPy使用了JIT(just-in-time compiler,它有最后的两个步骤,会在运行时将字节码先转化成机器码)

由于本科期间编译原理学的实在有点菜,所以要理清楚PyPy里面解释器和JIT的构造恐怕不是一朝一夕的时间(”可惜没如果 只剩下结果”….),以后可能会补充一篇文章理清楚!!!!!!!

Reference:

  1. 编译原理学习
  2. 《可惜没如果》
  3. 《编译原理》
  4. 编译原理学了有什么用
  5. 《如何自己创建一种编译语言》
  6. 编程语言的语法与语义
  7. Python Lexical analysis
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值