Skip to content

Commit 3465962

Browse files
committed
update
1 parent e65a8ce commit 3465962

25 files changed

+482
-0
lines changed

ch07.md

+4
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,10 @@ w_object(PyObject *v, WFILE *p)
145145
...
146146
```
147147

148+
## 解析 pyc 文件
149+
150+
我自己写了一个 Python 脚本解析 pyc 文件,放在 [这里](codes/python_scripts/parse_pyc.py)
151+
148152
## dis
149153

150154
Python 标准库中的 dis 模块可以用来获取代码对应的字节码。

ch09.md

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# Python虚拟机中的一般表达式
2+
3+
这一章主要分析了 Python 虚拟机如何执行字节码表达式。想要了解具体信息可以阅读代码(src/Python/ceval.c 的PyEval_EvalFrameEx函数)。
4+
5+
- LOAD_CONST
6+
- STORN_NAME
7+
- LOAD_NAME
8+
- BUILD_LIST
9+
- BUILD_NAME
10+
- 等等
11+

ch10.md

+183
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
# Python虚拟机中的控制流
2+
3+
4+
## if 控制流
5+
6+
用到的代码:
7+
8+
```python
9+
# if_control.py
10+
a = 1
11+
if a > 10:
12+
prin "a > 10"
13+
elif a <= -2:
14+
print "a <= -2"
15+
elif a != 1:
16+
print "a != 1"
17+
elif a == 1:
18+
print "a == 1"
19+
else:
20+
print "Unknown a"
21+
22+
```
23+
24+
if_control.py 对应的字节码:
25+
26+
```python
27+
1 0 LOAD_CONST 0 (1)
28+
3 STORE_NAME 0 (a)
29+
30+
2 6 LOAD_NAME 0 (a)
31+
9 LOAD_CONST 1 (10)
32+
12 COMPARE_OP 4 (>)
33+
15 JUMP_IF_FALSE 9 (to 27)
34+
18 POP_TOP
35+
36+
3 19 LOAD_CONST 2 ('a > 10')
37+
22 PRINT_ITEM
38+
23 PRINT_NEWLINE
39+
24 JUMP_FORWARD 72 (to 99)
40+
>> 27 POP_TOP
41+
42+
4 28 LOAD_NAME 0 (a)
43+
31 LOAD_CONST 3 (-2)
44+
34 COMPARE_OP 1 (<=)
45+
37 JUMP_IF_FALSE 9 (to 49)
46+
40 POP_TOP
47+
48+
5 41 LOAD_CONST 4 ('a <= -2')
49+
44 PRINT_ITEM
50+
45 PRINT_NEWLINE
51+
46 JUMP_FORWARD 50 (to 99)
52+
>> 49 POP_TOP
53+
54+
6 50 LOAD_NAME 0 (a)
55+
53 LOAD_CONST 0 (1)
56+
56 COMPARE_OP 3 (!=)
57+
59 JUMP_IF_FALSE 9 (to 71)
58+
62 POP_TOP
59+
60+
7 63 LOAD_CONST 5 ('a != 1')
61+
66 PRINT_ITEM
62+
67 PRINT_NEWLINE
63+
68 JUMP_FORWARD 28 (to 99)
64+
>> 71 POP_TOP
65+
66+
8 72 LOAD_NAME 0 (a)
67+
75 LOAD_CONST 0 (1)
68+
78 COMPARE_OP 2 (==)
69+
81 JUMP_IF_FALSE 9 (to 93)
70+
84 POP_TOP
71+
72+
9 85 LOAD_CONST 6 ('a == 1')
73+
88 PRINT_ITEM
74+
89 PRINT_NEWLINE
75+
90 JUMP_FORWARD 6 (to 99)
76+
>> 93 POP_TOP
77+
78+
11 94 LOAD_CONST 7 ('Unknown a')
79+
97 PRINT_ITEM
80+
98 PRINT_NEWLINE
81+
>> 99 LOAD_CONST 8 (None)
82+
102 RETURN_VALUE
83+
None
84+
```
85+
86+
## for 控制流
87+
88+
用到的代码:
89+
90+
```C
91+
// for_control.py
92+
lst = [1, 2]
93+
for i in lst:
94+
print i
95+
```
96+
97+
对应的字节码:
98+
99+
```python
100+
1 0 LOAD_CONST 0 (1)
101+
3 LOAD_CONST 1 (2)
102+
6 BUILD_LIST 2
103+
9 STORE_NAME 0 (lst)
104+
105+
2 12 SETUP_LOOP 19 (to 34)
106+
15 LOAD_NAME 0 (lst)
107+
18 GET_ITER
108+
>> 19 FOR_ITER 11 (to 33)
109+
22 STORE_NAME 1 (i)
110+
111+
3 25 LOAD_NAME 1 (i)
112+
28 PRINT_ITEM
113+
29 PRINT_NEWLINE
114+
30 JUMP_ABSOLUTE 19
115+
>> 33 POP_BLOCK
116+
>> 34 LOAD_CONST 2 (None)
117+
37 RETURN_VALUE
118+
None
119+
```
120+
121+
## while 控制流
122+
123+
用到的代码:
124+
125+
```C
126+
// while_control.py
127+
i = 0
128+
while i < 10:
129+
i += 1
130+
if i >= 5:
131+
continue
132+
if i == 20:
133+
break
134+
print i
135+
```
136+
137+
对应的字节码:
138+
139+
```python
140+
1 0 LOAD_CONST 0 (0)
141+
3 STORE_NAME 0 (i)
142+
143+
2 6 SETUP_LOOP 71 (to 80)
144+
>> 9 LOAD_NAME 0 (i)
145+
12 LOAD_CONST 1 (10)
146+
15 COMPARE_OP 0 (<)
147+
18 JUMP_IF_FALSE 57 (to 78)
148+
21 POP_TOP
149+
150+
3 22 LOAD_NAME 0 (i)
151+
25 LOAD_CONST 2 (1)
152+
28 INPLACE_ADD
153+
29 STORE_NAME 0 (i)
154+
155+
4 32 LOAD_NAME 0 (i)
156+
35 LOAD_CONST 3 (5)
157+
38 COMPARE_OP 5 (>=)
158+
41 JUMP_IF_FALSE 7 (to 51)
159+
44 POP_TOP
160+
161+
5 45 JUMP_ABSOLUTE 9
162+
48 JUMP_FORWARD 1 (to 52)
163+
>> 51 POP_TOP
164+
165+
6 >> 52 LOAD_NAME 0 (i)
166+
55 LOAD_CONST 4 (20)
167+
58 COMPARE_OP 2 (==)
168+
61 JUMP_IF_FALSE 5 (to 69)
169+
64 POP_TOP
170+
171+
7 65 BREAK_LOOP
172+
66 JUMP_FORWARD 1 (to 70)
173+
>> 69 POP_TOP
174+
175+
8 >> 70 LOAD_NAME 0 (i)
176+
73 PRINT_ITEM
177+
74 PRINT_NEWLINE
178+
75 JUMP_ABSOLUTE 9
179+
>> 78 POP_TOP
180+
79 POP_BLOCK
181+
>> 80 LOAD_CONST 5 (None)
182+
83 RETURN_VALUE
183+
```

codes/README.md

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# 书中涉及到的一些代码
2+
3+
- small_python
4+
5+
非常简单的 python 解释器。
6+
7+
- pytho_scripts
8+
9+
一些有用的 python 脚本,例如解析 pyc 文件的脚本。
+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
i = 1
2+
s = "Python"
3+
d = {}
4+
l = []
170 Bytes
Binary file not shown.
+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
lst = [1, 2]
2+
for i in lst:
3+
print i
+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
a = 1
2+
if a > 10:
3+
print "a > 10"
4+
elif a <= -2:
5+
print "a <= -2"
6+
elif a != 1:
7+
print "a != 1"
8+
elif a == 1:
9+
print "a == 1"
10+
else:
11+
print "Unknown a"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
i = 0
2+
while i < 10:
3+
i += 1
4+
if i >= 5:
5+
continue
6+
if i == 20:
7+
break
8+
print i
+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# -*- coding: utf-8 -*-
2+
import sys
3+
import os
4+
import dis
5+
6+
pyfile = sys.argv[1]
7+
f_name = os.path.basename(pyfile)
8+
9+
fp = open(pyfile)
10+
src = fp.read()
11+
fp.close()
12+
13+
codeobj = compile(src, f_name, 'exec')
14+
15+
print 'f_consts:', codeobj.co_consts
16+
print 'code:', codeobj.co_code.encode('hex')
17+
print 'lnotab:', codeobj.co_lnotab
18+
19+
print dis.dis(codeobj)

0 commit comments

Comments
 (0)