Про интерпретаторы
Программа на Питоне
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 раз быстрей.