Excel 名称框概述-英雄云拓展知识分享
184
2023-11-07
【摘要】 本书摘自《自己动手写 Python 虚拟机》一书中第2章,第1节,海纳编著。
2.1 Python字节码
在开始研究编译流程之前,先大概了解一下 Python 字节码的设计。与 Java 字 节码非常相似,Python 字节码的执行也是基于栈的。对于第一章 Java 的例子,此处 可以验证一下 Python 是什么样的。
在命令行运行 Python, 然后就可以交互式地执行 Python 代码了。执行以下代 码,可以看到如下结果:
对比1.2节的Java 虚拟机的例子,可以看到 Python 的字节码与 Java 的字节码 非常相似。执行的过程也如图1.1所示的那样,使用一个变量表和一个操作数栈来 完成所有字节码的执行。第1章中已详细介绍过这个执行过程,这里不再重复。
dis 模块的功能是反编译 Python 字节码。在上面的例子中,通过 dis 反编译了 foo 这个函数。Python 字节码有两种类型, 一种带参数, 一种不带参数。在真实的内 存中,每个字节码都有一个编号,这个编号叫做操作码(Operation Code),只占1个 字节。不带参数的字节码只有操作码,所以它的大小就是1个字节;带参数的字节 码,最多也只能带一个参数,而每个参数占2个字节,所以带参数的字节码就占3个 字节。例子中的LOAD_CONST 和 STORE_FAST 就是带参数的字节码,而BINA- RY_ADD则是不带参数的字节码。
粗略地了解了Python 字节码以后,再来讨论 py 文件是如何被翻译成这些字节 码的。
2.2 词法分析
如何把文本文件翻译成字节码文件呢?第一个步骤就是从文本文件中逐个字符 地去读取内容,然后把字符识别成变量、数字、字符串、操作符和关键字等。这些变 量、字符串和数字是组成程序的基本元素,它有一个专用的名字,叫 token。
把文本文件中的一串字符识别成一串 token, 就是我们要解决的第一个问题。 先看一个例子,创建一个文本文件,例如叫 test_token.txt,其中只包含一行表达式:
12 *48 +59
这个表达式是由5个 token 组成的,分别是数字12、乘号(*)、数字48、加号 (十)和数字59。针对这个文本文件,可以写一个程序,不断地读入字符,并把其中的 token 识别出来。代码如下:
#include
#define INIT 0
#define NUM 1
int main(){
FILE*fp
char ch;
int state,num =0;
while((ch =getc(fp))!=EOF)(
if(ch==!'||ch ==(\n¹)(
if(state ==NUM){
printf("token NUM:&d\n",num);
state =INIT;
num=0;
)
else if(ch>='0'ssch<='9')(
state =NUM;
num=num*10 +ch -'0';
else if(ch==¹+'||ch=='-¹)ch=='*!llch =='/)(
if(state ==NUM){
printf("token NUM:%d\n",num);
state =INIT;
num =0;
printf("token operator:%c\n",ch);
state =INIT;
)
fclose(fp);
return 0;
在上面的程序中,遇到加、减、乘、除操作符时,就可以直接输出这个操作符。唯
一需要注意的是,当遇到数字的时候要进行转换,并且在数字字符结束的时候将其输 出。使用 state 变量来标识数字字符是否结束。
编译并执行的结果如下:
1 token NUM:12
2 token operator:*
3 token NUM:48
4 token operator :+
5 token NUM:59
可见,此处正确地将表达式中的各个 token 分析出来了。
词法分析的思路大体上是这样的,除了数字和字符串,token 的类型还包括关键 字、各种操作符和变量等。要写一个完整的词法分析程序,是一件虽然没有太高技术 含量,但却十分繁琐的事情。我们不想在这种体力活上浪费太多精力,我直接偷了个 懒,使用 Python 中的词法分析模块来完成词法分析的任务。
Python 的词法分析器
Python 语言提供了一个非常好用的词法分析工具,叫 tokenize 。 代码如下:
import tokenize
2
f =open("test_token.txt")
tk =tokenize.generate_tokens(f.readline)
5
for toknum,tokvalue, , , in tk:
print toknum,tokvalue
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~