Здесь необходимо заметить,что недавно вPythonпоявился пакет compiler,который 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Здесь необходимо заметить,что недавно вPythonпоявился пакет compiler,который

Поиск

Здесь необходимо заметить,что недавно вPythonпоявился пакет compiler,который

 

объединяет модули для работы анализа исходного кода наPythonи генерации кода.В данной лекции он не рассматривается,но те,кто хочет глубже изучить эти процессы,может обратиться к документации поPython.


 


Изучение байт-кода

 

Для изучения байт-кодаPython-программы можно использовать модуль dis(сокращение от

 

"дизассемблер"), который содержит функции, позволяющие увидеть байт-код в мнемоническом виде.Следующий пример иллюстрирует эту возможность:

 

>>> def f():

... print 2*2

...

>>> dis.dis(f)

LOAD_CONST

(2)

 

 

LOAD_CONST

(2)

 

 

BINARY_MULTIPLY

 

 

 

 

PRINT_ITEM

 

 

 

 

PRINT_NEWLINE

(None)

 

 

LOAD_CONST

 

 

RETURN_VALUE

 

 

 

 

Определяется функция f(),которая должна вычислить и напечатать значение выражения 2*2.Функция dis() модуля dis выводит код функции f() в виде некого"ассемблера",в котором байт-кодPythonпредставлен мнемоническими именами.Следует заметить,что при интерпретации используется стек,поэтому LOAD_CONST кладет значение на вершину стека,

 

а BINARY_MULTIPLY берет со стека два значения и помещает на стек результат их перемножения.Функция без оператора return возвращает значение None.Как и в случае с кодами для микропроцессора,некоторые байт-коды принимают параметры.

 

Мнемонические имена можно увидеть в списке dis.opname(ниже печатаются только задействованные имена):

 

>>> import dis

>>> [n for n in dis.opname if n[0] != "<"]

 

['STOP_CODE', 'POP_TOP', 'ROT_TWO', 'ROT_THREE', 'DUP_TOP',

 

'ROT_FOUR',

'NOP', 'UNARY_POSITIVE', 'UNARY_NEGATIVE', 'UNARY_NOT', 'UNARY_CONVERT',

 

'UNARY_INVERT', 'LIST_APPEND', 'BINARY_POWER', 'BINARY_MULTIPLY', 'BINARY_DIVIDE', 'BINARY_MODULO', 'BINARY_ADD', 'BINARY_SUBTRACT', 'BINARY_SUBSCR', 'BINARY_FLOOR_DIVIDE', 'BINARY_TRUE_DIVIDE', 'INPLACE_FLOOR_DIVIDE', 'INPLACE_TRUE_DIVIDE', 'SLICE+0',

 

'SLICE+1',

'SLICE+2', 'SLICE+3', 'STORE_SLICE+0', 'STORE_SLICE+1', 'STORE_SLICE+2',

 

'STORE_SLICE+3', 'DELETE_SLICE+0', 'DELETE_SLICE+1', 'DELETE_SLICE+2',

 

'DELETE_SLICE+3', 'INPLACE_ADD', 'INPLACE_SUBTRACT', 'INPLACE_MULTIPLY',

 

'INPLACE_DIVIDE', 'INPLACE_MODULO', 'STORE_SUBSCR', 'DELETE_SUBSCR',

 

'BINARY_LSHIFT', 'BINARY_RSHIFT', 'BINARY_AND', 'BINARY_XOR', 'BINARY_OR',

 

'INPLACE_POWER', 'GET_ITER', 'PRINT_EXPR', 'PRINT_ITEM', 'PRINT_NEWLINE',

 

'PRINT_ITEM_TO', 'PRINT_NEWLINE_TO', 'INPLACE_LSHIFT', 'INPLACE_RSHIFT',

 

'INPLACE_AND', 'INPLACE_XOR', 'INPLACE_OR', 'BREAK_LOOP', 'LOAD_LOCALS',

 

'RETURN_VALUE', 'IMPORT_STAR', 'EXEC_STMT', 'YIELD_VALUE', 'POP_BLOCK',

'END_FINALLY', 'BUILD_CLASS', 'STORE_NAME', 'DELETE_NAME',

'UNPACK_SEQUENCE', 'FOR_ITER', 'STORE_ATTR', 'DELETE_ATTR', 'STORE_GLOBAL',


 


'DELETE_GLOBAL', 'DUP_TOPX', 'LOAD_CONST', 'LOAD_NAME', 'BUILD_TUPLE',

 

'BUILD_LIST', 'BUILD_MAP', 'LOAD_ATTR', 'COMPARE_OP', 'IMPORT_NAME',

 

'IMPORT_FROM', 'JUMP_FORWARD', 'JUMP_IF_FALSE', 'JUMP_IF_TRUE', 'JUMP_ABSOLUTE', 'LOAD_GLOBAL', 'CONTINUE_LOOP', 'SETUP_LOOP', 'SETUP_EXCEPT', 'SETUP_FINALLY', 'LOAD_FAST', 'STORE_FAST',

'DELETE_FAST',

 

'RAISE_VARARGS', 'CALL_FUNCTION', 'MAKE_FUNCTION', 'BUILD_SLICE', 'MAKE_CLOSURE', 'LOAD_CLOSURE', 'LOAD_DEREF', 'STORE_DEREF', 'CALL_FUNCTION_VAR', 'CALL_FUNCTION_KW', 'CALL_FUNCTION_VAR_KW', 'EXTENDED_ARG']

 

Легко догадаться,чтоLOADозначает загрузку значения в стек, STORE -выгрузку, PRINT -печать, BINARY -бинарную операцию и т.п.

 



Поделиться:


Последнее изменение этой страницы: 2024-06-27; просмотров: 60; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.217.128 (0.009 с.)