На досуге решил копнуть в эту сторону. Мы знаем, что на питоне возможно функциональное программирование. Но, хотелось бы попробовать покодить на байткодах PVM. Сами коды с описанием здесь Вот я написал простенький код на чистом питоне Код (Text): import sys import dis AR, XR, ST, SP = 1, 0, [], 0; def _quit(): sys.exit() def pop (): SP = ST.pop(); def push (l): ST.append (l); def st_size(): return len (ST); push ( 45 ) push ( "a" ) push ( "HI@!" ) if st_size() != 0 : print "Стек не пуст\n"; L_SIZE_MSG = "Его размер равен " + str(st_size()) print L_SIZE_MSG for AR in ST: print (AR); else: print "Стек пуст" _quit(); dis.dis (pop) dis.dis (push) _quit() Выводит он следующее: Код (Text): Стек не пуст Его размер равен 3 45 a HI@! 12 0 LOAD_GLOBAL 0 (ST) 3 LOAD_ATTR 1 (pop) 6 CALL_FUNCTION 0 9 STORE_FAST 0 (SP) 12 LOAD_CONST 0 (None) 15 RETURN_VALUE 16 0 LOAD_GLOBAL 0 (ST) 3 LOAD_ATTR 1 (append) 6 LOAD_FAST 0 (l) 9 CALL_FUNCTION 1 12 POP_TOP 13 LOAD_CONST 0 (None) 16 RETURN_VALUE Собственно, разобраться в этом самому - не долго, но времени щас ни на что не хватает... Если кто копал питоновские опкоды - отпишитесь!
device Я в свое время (когда изучал Еву) смотрел модули opcode.h, opcode.py, pycodegen.py и программу decompiler.py. Эти модули (кроме последнего, который можно тоже найти в Инете) есть в сырцах Питона. Еще можно посмотреть доки Питона (файлы с расширением tex).
q_q Досуг только что закончился На чтение документации по питоновским кодам ухлопал час. Больше нельзя. Я сейчас решаю задачу типа "Как построить дом в 16 соток на участке в 6?" Сменил деятельность. Больше не прикладной, но программист. Я чуть не повесился когда первую задачу поставили на новой работе. Теперь для меня ресурсы компа - критичны. Коды типа mov eax, 0 забракуют на корню. Я начинаю забывать про тип String, char и прочее кодоблудие короче попал. crypto Обязательно посмотрю сорцы. Спасибо... Всем пока, ухожу в астрал.
Скачал пакет ПИАСТРА - дизассемблер питона. Думал, что он вроде Jad или Jasmin для Java... угу - фиг! Вот че он мне выдал из простого HelloWorld (ну... Выводит A на экран) Код (Text): processor 16c432 #include p16c432.inc _lshift_left equ 0x20 ;bank 0 _lshift_right equ 0x21 ;bank 0 _rshift_left equ 0x22 ;bank 0 _rshift_right equ 0x23 ;bank 0 _mul_left equ 0x24 ;bank 0 _mul_right equ 0x25 ;bank 0 mul_res equ 0x26 ;bank 0 mul_cntr equ 0x27 ;bank 0 _div_left equ 0x28 ;bank 0 _div_right equ 0x29 ;bank 0 div_buf equ 0x2a ;bank 0 div_cntr equ 0x2b ;bank 0 div_res equ 0x2c ;bank 0 _mod_left equ 0x2d ;bank 0 _mod_right equ 0x2e ;bank 0 mod_buf equ 0x2f ;bank 0 mod_cntr equ 0x30 ;bank 0 _pow_left equ 0x31 ;bank 0 _pow_right equ 0x32 ;bank 0 pow_res equ 0x33 ;bank 0 pow_buf equ 0x34 ;bank 0 pow_cntr equ 0x35 ;bank 0 var_test equ 0x36 ;bank 0 _A equ 0x37 ;bank 0 errorlevel -302 errorlevel -306 org 0x0 goto main org 0x5 main movlw 'A' bcf STATUS, RP0 bcf STATUS, RP1 movwf _A movf _A, w goto $ end Сейчас качаю ассемблер (нашел!) для процессора 16c432 Начал копать формат pyc - дальше второй строки не уехал: insw ; тут repne or ax,0x820a ;и тут все ясно и без документации add al,0x4e; Не знаю dec ax; Это уже сам код пошел, но что он делает вплоть до 0xA8 - не понятно, пиастра пролила свет, но пока тусклый.
device Тернистым путем идешь. Посмотри еще здесь: libdis.tex и ceval.c. ЗЫ Кстати, декомпилятор практически восстанавливает исходный текст.
crypto Нашел пакет bytecodehacks. Кто-то, я помню, спрашивал про самый длинный hello, world Получите его на Питоне Код (Text): from bytecodehacks import code_editor,ops; # И так, по порядку. # Пусть, выполнение проги у на начнеццо с метода main() который что-то возвращает. def main(): return 0; #Теперь, определим сцылко на майн. main_t = code_editor.Function(main) # НАШЕ СООБЩЕНИЕ A_MESSAGE = "hello, wasm" #СТЕК КАК ОН ЕСТЬ:) SP = [] SX = [] #Ф-ЦИИ для работы со стеком def POP(): return SP.pop() def PUSH( _VAL_ ): SP.append(_VAL_) #AREXCHG - команда чисто для констант в SP def AREXCHG (_a_): main_t.func_code.co_consts.append(_a_) #Зачистко def undef (): SP=[] def crtp(__CODE_T): main_t.func_code.co_code[:]=__CODE_T; PUSH ( ops.LOAD_CONST (len(main_t.func_code.co_consts))); PUSH ( ops.RETURN_VALUE ()); crtp (SP) undef () AREXCHG ( A_MESSAGE ); print main_t(); Полчаса писал