Про интерпретаторы
Программа на Питоне
import time
import dis
def foo():
n = 100_000
i = 2
c = 0
while i <= n:
d = 2
while i % d != 0:
d += 1
if d == i:
c += 1
i += 1
print('\n', c)
#foo()
dis.dis(foo)
Ее ассемблерный код, полученный стандартным интерпретатором:
4 0 LOAD_CONST 1 (100000)
2 STORE_FAST 0 (n)
5 4 LOAD_CONST 2 (2)
6 STORE_FAST 1 (i)
6 8 LOAD_CONST 3 (0)
10 STORE_FAST 2 (c)
8 12 SETUP_LOOP 66 (to 80)
>> 14 LOAD_FAST 1 (i)
16 LOAD_FAST 0 (n)
18 COMPARE_OP 1 (<=)
20 POP_JUMP_IF_FALSE 78
9 22 LOAD_CONST 2 (2)
24 STORE_FAST 3 (d)
10 26 SETUP_LOOP 24 (to 52)
>> 28 LOAD_FAST 1 (i)
30 LOAD_FAST 3 (d)
32 BINARY_MODULO
34 LOAD_CONST 3 (0)
36 COMPARE_OP 3 (!=)
38 POP_JUMP_IF_FALSE 50
11 40 LOAD_FAST 3 (d)
42 LOAD_CONST 4 (1)
44 INPLACE_ADD
46 STORE_FAST 3 (d)
48 JUMP_ABSOLUTE 28
>> 50 POP_BLOCK
12 >> 52 LOAD_FAST 3 (d)
54 LOAD_FAST 1 (i)
56 COMPARE_OP 2 (==)
58 POP_JUMP_IF_FALSE 68
13 60 LOAD_FAST 2 (c)
62 LOAD_CONST 4 (1)
64 INPLACE_ADD
66 STORE_FAST 2 (c)
15 >> 68 LOAD_FAST 1 (i)
70 LOAD_CONST 4 (1)
72 INPLACE_ADD
74 STORE_FAST 1 (i)
76 JUMP_ABSOLUTE 14
>> 78 POP_BLOCK
17 >> 80 LOAD_GLOBAL 0 (print)
82 LOAD_CONST 5 ('\n')
84 LOAD_FAST 2 (c)
86 CALL_FUNCTION 2
88 POP_TOP
90 LOAD_CONST 0 (None)
92 RETURN_VALUE
Код такой же программы, полученный интерпретатором игрушечного языка:
0) 100000 1)SAVE 2 2) 2 3)SAVE 1 4) 0 5)SAVE 4 6)LOAD 1 7)LOAD 2 8)IfGT 23 9) 2 10)SAVE 3 11)LOAD 1 12)LOAD 3 13)MOD 14)IfEQ0 17 15)INC 3 16)GOTO 11 17)LOAD 3 18)LOAD 1 19)IfNE 21 20)INC 4 21)INC 1 22)GOTO 6 23)LOAD 4 24)PRN 25)PRNLN 26)STOP 0
Работает в 8 раз быстрей.