Про интерпретаторы

Про интерпретаторы


Программа на Питоне

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 раз быстрей.



Report Page