Байткод питона - есть ли расширенная документация?

Тема в разделе "WASM.RESEARCH", создана пользователем device, 10 июн 2008.

  1. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    На досуге решил копнуть в эту сторону.
    Мы знаем, что на питоне возможно функциональное программирование.
    Но, хотелось бы попробовать покодить на байткодах PVM.
    Сами коды с описанием здесь

    Вот я написал простенький код на чистом питоне
    Код (Text):
    1. import sys
    2. import dis
    3.  
    4. AR, XR, ST, SP = 1, 0, [], 0;
    5.  
    6. def    _quit():
    7.    
    8.     sys.exit()
    9.  
    10. def pop ():
    11.    
    12.     SP = ST.pop();
    13.    
    14. def push (l):
    15.    
    16.     ST.append (l);
    17.  
    18. def st_size():
    19.    
    20.     return len (ST);
    21.  
    22. push ( 45  )
    23.  
    24. push ( "a" )
    25.  
    26. push ( "HI@!" )
    27.  
    28. if  st_size() != 0 :
    29.    
    30.     print "Стек не пуст\n";
    31.    
    32.     L_SIZE_MSG = "Его размер равен " + str(st_size())
    33.    
    34.     print L_SIZE_MSG
    35.    
    36.     for AR in ST:
    37.         print (AR);
    38.    
    39.    
    40. else:
    41.         print "Стек пуст"
    42.        
    43.         _quit();
    44.  
    45. dis.dis (pop)
    46. dis.dis (push)
    47.  
    48. _quit()
    Выводит он следующее:
    Код (Text):
    1. Стек не пуст
    2. Его размер равен 3
    3. 45
    4. a
    5. HI@!
    6.  12           0 LOAD_GLOBAL              0 (ST)
    7.               3 LOAD_ATTR                1 (pop)
    8.               6 CALL_FUNCTION            0
    9.               9 STORE_FAST               0 (SP)
    10.              12 LOAD_CONST               0 (None)
    11.              15 RETURN_VALUE
    12.  16           0 LOAD_GLOBAL              0 (ST)
    13.               3 LOAD_ATTR                1 (append)
    14.               6 LOAD_FAST                0 (l)
    15.               9 CALL_FUNCTION            1
    16.              12 POP_TOP
    17.              13 LOAD_CONST               0 (None)
    18.              16 RETURN_VALUE
    Собственно, разобраться в этом самому - не долго, но времени щас ни на что не хватает... Если кто копал питоновские опкоды - отпишитесь!
     
  2. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    device
    Я в свое время (когда изучал Еву) смотрел модули opcode.h, opcode.py, pycodegen.py и программу decompiler.py. Эти модули (кроме последнего, который можно тоже найти в Инете) есть в сырцах Питона. Еще можно посмотреть доки Питона (файлы с расширением tex).
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    device
    На досуге ... но времени щас ни на что не хватает
    ???
     
  4. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    q_q
    Досуг только что закончился:)
    На чтение документации по питоновским кодам ухлопал час. Больше нельзя.

    Я сейчас решаю задачу типа "Как построить дом в 16 соток на участке в 6?"
    Сменил деятельность. Больше не прикладной, но программист. Я чуть не повесился когда первую задачу поставили на новой работе.
    Теперь для меня ресурсы компа - критичны.
    Коды типа mov eax, 0 забракуют на корню. Я начинаю забывать про тип String, char и прочее кодоблудие:) короче попал.
    crypto
    Обязательно посмотрю сорцы. Спасибо... Всем пока, ухожу в астрал.
     
  5. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    device
    Дык, ясно как - строй небоскреб :)
     
  6. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Скачал пакет ПИАСТРА - дизассемблер питона.
    Думал, что он вроде Jad или Jasmin для Java... угу - фиг!
    Вот че он мне выдал из простого HelloWorld (ну... Выводит A на экран)
    Код (Text):
    1.     processor   16c432
    2.     #include    p16c432.inc
    3.  
    4. _lshift_left    equ 0x20    ;bank 0
    5. _lshift_right   equ 0x21    ;bank 0
    6. _rshift_left    equ 0x22    ;bank 0
    7. _rshift_right   equ 0x23    ;bank 0
    8. _mul_left   equ 0x24    ;bank 0
    9. _mul_right  equ 0x25    ;bank 0
    10. mul_res equ 0x26    ;bank 0
    11. mul_cntr    equ 0x27    ;bank 0
    12. _div_left   equ 0x28    ;bank 0
    13. _div_right  equ 0x29    ;bank 0
    14. div_buf equ 0x2a    ;bank 0
    15. div_cntr    equ 0x2b    ;bank 0
    16. div_res equ 0x2c    ;bank 0
    17. _mod_left   equ 0x2d    ;bank 0
    18. _mod_right  equ 0x2e    ;bank 0
    19. mod_buf equ 0x2f    ;bank 0
    20. mod_cntr    equ 0x30    ;bank 0
    21. _pow_left   equ 0x31    ;bank 0
    22. _pow_right  equ 0x32    ;bank 0
    23. pow_res equ 0x33    ;bank 0
    24. pow_buf equ 0x34    ;bank 0
    25. pow_cntr    equ 0x35    ;bank 0
    26. var_test    equ 0x36    ;bank 0
    27. _A  equ 0x37    ;bank 0
    28.  
    29.     errorlevel  -302
    30.     errorlevel  -306
    31.  
    32.     org 0x0
    33.  
    34.     goto    main
    35.  
    36.     org 0x5
    37. main
    38.     movlw   'A'
    39.     bcf STATUS, RP0
    40.     bcf STATUS, RP1
    41.     movwf   _A
    42.     movf    _A, w
    43.  
    44.     goto    $
    45.  
    46.     end
    Сейчас качаю ассемблер (нашел!) для процессора 16c432 :)
    Начал копать формат pyc - дальше второй строки не уехал:

    insw ; тут
    repne or ax,0x820a ;и тут все ясно и без документации
    add al,0x4e; Не знаю
    dec ax; Это уже сам код пошел, но что он делает вплоть до 0xA8 - не понятно, пиастра пролила свет, но пока тусклый.
     
  7. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    device
    Тернистым путем идешь. Посмотри еще здесь: libdis.tex и ceval.c.
    ЗЫ
    Кстати, декомпилятор практически восстанавливает исходный текст.
     
  8. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    crypto
    Нашел пакет bytecodehacks.

    Кто-то, я помню, спрашивал про самый длинный hello, world
    Получите его на Питоне
    Код (Text):
    1. from bytecodehacks import code_editor,ops;
    2.  
    3. # И так, по порядку.
    4. # Пусть, выполнение проги у на начнеццо с метода main() который что-то возвращает.
    5.  
    6. def main():
    7.     return 0;
    8.  
    9. #Теперь, определим сцылко на майн.
    10.  
    11. main_t  = code_editor.Function(main)
    12.  
    13. # НАШЕ СООБЩЕНИЕ
    14.  
    15. A_MESSAGE = "hello, wasm"
    16.  
    17. #СТЕК КАК ОН ЕСТЬ:)
    18.  
    19. SP = []
    20. SX = []
    21.  
    22. #Ф-ЦИИ для работы со стеком
    23.  
    24. def POP():
    25.     return SP.pop()
    26.  
    27. def PUSH( _VAL_ ):
    28.     SP.append(_VAL_)
    29.    
    30. #AREXCHG - команда чисто для констант в SP
    31.  
    32. def AREXCHG (_a_):
    33.     main_t.func_code.co_consts.append(_a_)
    34.    
    35. #Зачистко
    36. def undef ():
    37.     SP=[]
    38.  
    39. def crtp(__CODE_T):
    40.     main_t.func_code.co_code[:]=__CODE_T;
    41.    
    42.  
    43. PUSH    ( ops.LOAD_CONST    (len(main_t.func_code.co_consts)));
    44. PUSH    ( ops.RETURN_VALUE  ());
    45.  
    46.  
    47.  
    48. crtp    (SP)
    49. undef   ()
    50. AREXCHG ( A_MESSAGE );
    51. print   main_t();
    Полчаса писал:)