PaddlePaddle / PaddleSOT

A Bytecode level Implementation of Symbolic OpCode Translator For PaddlePaddle
Apache License 2.0
15 stars 26 forks source link

๐Ÿ—“๏ธ Python ๅ„็‰ˆๆœฌๅญ—่Š‚็ ๅทฎๅผ‚่กจๆ ผ #118

Open SigureMo opened 1 year ago

SigureMo commented 1 year ago

Note

โœ… ๆ˜ฏๅฏไปฅ็‚น็š„๏ผŒๅฏไปฅ็›ด่พพๆ–‡ๆกฃ๏ฝž

Python 3.8 Python 3.9 Python 3.10 Python 3.11 Python 3.12
NOP โœ… โœ… โœ… โœ… โœ…
POP_TOP โœ… โœ… โœ… โœ… โœ…
ROT_TWO โœ… โœ… โœ… โŒ โŒ
ROT_THREE โœ… โœ… โœ… โŒ โŒ
ROT_FOUR โœ…๐Ÿ†• โœ… โœ… โŒ โŒ
DUP_TOP โœ… โœ… โœ… โŒ โŒ
DUP_TOP_TWO โœ… โœ… โœ… โŒ โŒ
UNARY_POSITIVE โœ… โœ… โœ… โœ… โŒ
UNARY_NEGATIVE โœ… โœ… โœ… โœ… โœ…
UNARY_NOT โœ… โœ… โœ… โœ… โœ…
UNARY_INVERT โœ… โœ… โœ… โœ… โœ…
GET_ITER โœ… โœ… โœ… โœ… โœ…
GET_YIELD_FROM_ITER โœ… โœ… โœ… โœ… โœ…
BINARY_POWER โœ… โœ… โœ… โŒ โŒ
BINARY_MULTIPLY โœ… โœ… โœ… โŒ โŒ
BINARY_MATRIX_MULTIPLY โœ… โœ… โœ… โŒ โŒ
BINARY_FLOOR_DIVIDE โœ… โœ… โœ… โŒ โŒ
BINARY_TRUE_DIVIDE โœ… โœ… โœ… โŒ โŒ
BINARY_MODULO โœ… โœ… โœ… โŒ โŒ
BINARY_ADD โœ… โœ… โœ… โŒ โŒ
BINARY_SUBTRACT โœ… โœ… โœ… โŒ โŒ
BINARY_SUBSCR โœ… โœ… โœ… โœ… โœ…
BINARY_LSHIFT โœ… โœ… โœ… โŒ โŒ
BINARY_RSHIFT โœ… โœ… โœ… โŒ โŒ
BINARY_AND โœ… โœ… โœ… โŒ โŒ
BINARY_XOR โœ… โœ… โœ… โŒ โŒ
BINARY_OR โœ… โœ… โœ… โŒ โŒ
INPLACE_POWER โœ… โœ… โœ… โŒ โŒ
INPLACE_MULTIPLY โœ… โœ… โœ… โŒ โŒ
INPLACE_MATRIX_MULTIPLY โœ… โœ… โœ… โŒ โŒ
INPLACE_FLOOR_DIVIDE โœ… โœ… โœ… โŒ โŒ
INPLACE_TRUE_DIVIDE โœ… โœ… โœ… โŒ โŒ
INPLACE_MODULO โœ… โœ… โœ… โŒ โŒ
INPLACE_ADD โœ… โœ… โœ… โŒ โŒ
INPLACE_SUBTRACT โœ… โœ… โœ… โŒ โŒ
INPLACE_LSHIFT โœ… โœ… โœ… โŒ โŒ
INPLACE_RSHIFT โœ… โœ… โœ… โŒ โŒ
INPLACE_AND โœ… โœ… โœ… โŒ โŒ
INPLACE_XOR โœ… โœ… โœ… โŒ โŒ
INPLACE_OR โœ… โœ… โœ… โŒ โŒ
STORE_SUBSCR โœ… โœ… โœ… โœ… โœ…
DELETE_SUBSCR โœ… โœ… โœ… โœ… โœ…
GET_AWAITABLE โœ… โœ… โœ… โœ…
Changed in version 3.11: Previously, this instruction did not have an oparg.
โœ…
GET_AITER โœ… โœ… โœ… โœ… โœ…
GET_ANEXT โœ… โœ… โœ… โœ… โœ…
END_ASYNC_FOR โœ…๐Ÿ†• โœ… โœ… โœ…
Changed in version 3.11: Exception representation on the stack now consist of one, not three, items.
โœ…
BEFORE_ASYNC_WITH โœ… โœ… โœ… โœ… โœ…
SETUP_ASYNC_WITH โœ… โœ… โœ… โŒ โŒ
PRINT_EXPR โœ… โœ… โœ… โœ… โŒ
SET_ADD โœ… โœ… โœ… โœ… โœ…
LIST_APPEND โœ… โœ… โœ… โœ… โœ…
MAP_ADD โœ…
Changed in version 3.8: Map value is TOS and map key is TOS1. Before, those were reversed.
โœ… โœ… โœ… โœ…
RETURN_VALUE โœ… โœ… โœ… โœ… โœ…
YIELD_VALUE โœ… โœ… โœ… โœ… โœ…
Changed in version 3.12: oparg set to be the exception block depth, for efficient closing of generators.
YIELD_FROM โœ… โœ… โœ… โŒ โŒ
SETUP_ANNOTATIONS โœ… โœ… โœ… โœ… โœ…
IMPORT_STAR โœ… โœ… โœ… โœ… โŒ
POP_BLOCK โœ… โœ… โœ… โŒ โœ…
POP_EXCEPT โœ… โœ… โœ… โœ…
Changed in version 3.11: Exception representation on the stack now consist of one, not three, items.
โœ…
POP_FINALLY โœ…๐Ÿ†• โŒ โŒ โŒ โŒ
BEGIN_FINALLY โœ…๐Ÿ†• โŒ โŒ โŒ โŒ
END_FINALLY โœ… โŒ โŒ โŒ โŒ
LOAD_BUILD_CLASS โœ… โœ… โœ… โœ… โœ…
SETUP_WITH โœ… โœ… โœ… โŒ โœ…
WITH_CLEANUP_START โœ… โŒ โŒ โŒ โŒ
WITH_CLEANUP_FINISH โœ… โŒ โŒ โŒ โŒ
STORE_NAME โœ… โœ… โœ… โœ… โœ…
DELETE_NAME โœ… โœ… โœ… โœ… โœ…
UNPACK_SEQUENCE โœ… โœ… โœ… โœ… โœ…
UNPACK_EX โœ… โœ… โœ… โœ… โœ…
STORE_ATTR โœ… โœ… โœ… โœ… โœ…
DELETE_ATTR โœ… โœ… โœ… โœ… โœ…
STORE_GLOBAL โœ… โœ… โœ… โœ… โœ…
DELETE_GLOBAL โœ… โœ… โœ… โœ… โœ…
LOAD_CONST โœ… โœ… โœ… โœ… โœ…
LOAD_NAME โœ… โœ… โœ… โœ… โœ…
BUILD_TUPLE โœ… โœ… โœ… โœ… โœ…
BUILD_LIST โœ… โœ… โœ… โœ… โœ…
BUILD_SET โœ… โœ… โœ… โœ… โœ…
BUILD_MAP โœ… โœ… โœ… โœ… โœ…
BUILD_CONST_KEY_MAP โœ… โœ… โœ… โœ… โœ…
BUILD_STRING โœ… โœ… โœ… โœ… โœ…
BUILD_TUPLE_UNPACK โœ… โŒ โŒ โŒ โŒ
BUILD_TUPLE_UNPACK_WITH_CALL โœ… โŒ โŒ โŒ โŒ
BUILD_LIST_UNPACK โœ… โŒ โŒ โŒ โŒ
BUILD_SET_UNPACK โœ… โŒ โŒ โŒ โŒ
BUILD_MAP_UNPACK โœ… โŒ โŒ โŒ โŒ
BUILD_MAP_UNPACK_WITH_CALL โœ… โŒ โŒ โŒ โŒ
LOAD_ATTR โœ… โœ… โœ… โœ… โœ…
Changed in version 3.12: If the low bit of namei is set, then a NULL or self is pushed to the stack before the attribute or unbound method respectively.
COMPARE_OP โœ… โœ… โœ… โœ… โœ…
IMPORT_NAME โœ… โœ… โœ… โœ… โœ…
IMPORT_FROM โœ… โœ… โœ… โœ… โœ…
JUMP_FORWARD โœ… โœ… โœ… โœ… โœ…
POP_JUMP_IF_TRUE โœ… โœ… โœ… โŒ โœ…
Changed in version 3.12: This is no longer a pseudo-instruction.
POP_JUMP_IF_FALSE โœ… โœ… โœ… โŒ โœ…
Changed in version 3.12: This is no longer a pseudo-instruction.
JUMP_IF_TRUE_OR_POP โœ… โœ… โœ… โœ…
Changed in version 3.11: The oparg is now a relative delta rather than an absolute target.
โŒ
JUMP_IF_FALSE_OR_POP โœ… โœ… โœ… โœ…
Changed in version 3.11: The oparg is now a relative delta rather than an absolute target.
โŒ
JUMP_ABSOLUTE โœ… โœ… โœ… โŒ โŒ
FOR_ITER โœ… โœ… โœ… โœ… โœ…
Changed in version 3.12: Up until 3.11 the iterator was popped when it was exhausted.
LOAD_GLOBAL โœ… โœ… โœ… โœ…
Changed in version 3.11: If the low bit of namei is set, then a NULL is pushed to the stack before the global variable.
โœ…
SETUP_FINALLY โœ… โœ… โœ… โŒ โœ…
CALL_FINALLY โœ…๐Ÿ†• โŒ โŒ โŒ โŒ
LOAD_FAST โœ… โœ… โœ… โœ… โœ…
Changed in version 3.12: This opcode is now only used in situations where the local variable is guaranteed to be initialized. It cannot raise UnboundLocalError.
STORE_FAST โœ… โœ… โœ… โœ… โœ…
DELETE_FAST โœ… โœ… โœ… โœ… โœ…
LOAD_CLOSURE โœ… โœ… โœ… โœ…
Changed in version 3.11: i is no longer offset by the length of co_varnames.
โœ…
LOAD_DEREF โœ… โœ… โœ… โœ…
Changed in version 3.11: i is no longer offset by the length of co_varnames.
โœ…
LOAD_CLASSDEREF โœ… โœ… โœ… โœ…
Changed in version 3.11: i is no longer offset by the length of co_varnames.
โŒ
STORE_DEREF โœ… โœ… โœ… โœ…
Changed in version 3.11: i is no longer offset by the length of co_varnames.
โœ…
DELETE_DEREF โœ… โœ… โœ… โœ…
Changed in version 3.11: i is no longer offset by the length of co_varnames.
โœ…
RAISE_VARARGS โœ… โœ… โœ… โœ… โœ…
CALL_FUNCTION โœ… โœ… โœ… โŒ โŒ
CALL_FUNCTION_KW โœ… โœ… โœ… โŒ โŒ
CALL_FUNCTION_EX โœ… โœ… โœ… โœ… โœ…
LOAD_METHOD โœ… โœ… โœ… โœ… โœ…
CALL_METHOD โœ… โœ… โœ… โŒ โŒ
MAKE_FUNCTION โœ… โœ… โœ…
Changed in version 3.10: Flag value 0x04 is a tuple of strings instead of dictionary
โœ…
Changed in version 3.11: Qualified name at TOS was removed.
โœ…
BUILD_SLICE โœ… โœ… โœ… โœ… โœ…
EXTENDED_ARG โœ… โœ… โœ… โœ… โœ…
FORMAT_VALUE โœ… โœ… โœ… โœ… โœ…
HAVE_ARGUMENT โœ… โœ… โœ… โœ… โœ…
Changed in version 3.12: Pseudo instructions were added to the dis module, and for them it is not true that comparison with HAVE_ARGUMENT indicates whether they use their arg.
RERAISE โŒ โœ…๐Ÿ†• โœ… โœ…
Changed in version 3.11: Exception representation on the stack now consist of one, not three, items.
โœ…
WITH_EXCEPT_START โŒ โœ…๐Ÿ†• โœ… โœ…
Changed in version 3.11: The __exit__ function is in position 4 of the stack rather than 7. Exception representation on the stack now consist of one, not three, items.
โœ…
LOAD_ASSERTION_ERROR โŒ โœ…๐Ÿ†• โœ… โœ… โœ…
LIST_TO_TUPLE โŒ โœ…๐Ÿ†• โœ… โœ… โŒ
LIST_EXTEND โŒ โœ…๐Ÿ†• โœ… โœ… โœ…
SET_UPDATE โŒ โœ…๐Ÿ†• โœ… โœ… โœ…
DICT_UPDATE โŒ โœ…๐Ÿ†• โœ… โœ… โœ…
DICT_MERGE โŒ โœ…๐Ÿ†• โœ… โœ… โœ…
IS_OP โŒ โœ…๐Ÿ†• โœ… โœ… โœ…
CONTAINS_OP โŒ โœ…๐Ÿ†• โœ… โœ… โœ…
JUMP_IF_NOT_EXC_MATCH โŒ โœ…๐Ÿ†• โœ… โŒ โŒ
COPY_DICT_WITHOUT_KEYS โŒ โŒ โœ…๐Ÿ†• โŒ โŒ
GET_LEN โŒ โŒ โœ…๐Ÿ†• โœ… โœ…
MATCH_MAPPING โŒ โŒ โœ…๐Ÿ†• โœ… โœ…
MATCH_SEQUENCE โŒ โŒ โœ…๐Ÿ†• โœ… โœ…
MATCH_KEYS โŒ โŒ โœ…๐Ÿ†• โœ…
Changed in version 3.11: Previously, this instruction also pushed a boolean value indicating success (True) or failure (False).
โœ…
MATCH_CLASS โŒ โŒ โœ…๐Ÿ†• โœ…
Changed in version 3.11: Previously, this instruction also pushed a boolean value indicating success (True) or failure (False).
โœ…
GEN_START โŒ โŒ โœ…๐Ÿ†• โŒ โŒ
ROT_N โŒ โŒ โœ…๐Ÿ†• โŒ โŒ
COPY โŒ โŒ โŒ โœ…๐Ÿ†• โœ…
SWAP โŒ โŒ โŒ โœ…๐Ÿ†• โœ…
CACHE โŒ โŒ โŒ โœ…๐Ÿ†• โœ…
BINARY_OP โŒ โŒ โŒ โœ…๐Ÿ†• โœ…
PUSH_EXC_INFO โŒ โŒ โŒ โœ…๐Ÿ†• โœ…
CHECK_EXC_MATCH โŒ โŒ โŒ โœ…๐Ÿ†• โœ…
CHECK_EG_MATCH โŒ โŒ โŒ โœ…๐Ÿ†• โœ…
PREP_RERAISE_STAR โŒ โŒ โŒ โœ…๐Ÿ†• โŒ
BEFORE_WITH โŒ โŒ โŒ โœ…๐Ÿ†• โœ…
JUMP_BACKWARD โŒ โŒ โŒ โœ…๐Ÿ†• โœ…
JUMP_BACKWARD_NO_INTERRUPT โŒ โŒ โŒ โœ…๐Ÿ†• โœ…
POP_JUMP_FORWARD_IF_TRUE โŒ โŒ โŒ โœ…๐Ÿ†• โŒ
POP_JUMP_BACKWARD_IF_TRUE โŒ โŒ โŒ โœ…๐Ÿ†• โŒ
POP_JUMP_FORWARD_IF_FALSE โŒ โŒ โŒ โœ…๐Ÿ†• โŒ
POP_JUMP_BACKWARD_IF_FALSE โŒ โŒ โŒ โœ…๐Ÿ†• โŒ
POP_JUMP_FORWARD_IF_NOT_NONE โŒ โŒ โŒ โœ…๐Ÿ†• โŒ
POP_JUMP_BACKWARD_IF_NOT_NONE โŒ โŒ โŒ โœ…๐Ÿ†• โŒ
POP_JUMP_FORWARD_IF_NONE โŒ โŒ โŒ โœ…๐Ÿ†• โŒ
POP_JUMP_BACKWARD_IF_NONE โŒ โŒ โŒ โœ…๐Ÿ†• โŒ
MAKE_CELL โŒ โŒ โŒ โœ…๐Ÿ†• โœ…
COPY_FREE_VARS โŒ โŒ โŒ โœ…๐Ÿ†• โœ…
CALL โŒ โŒ โŒ โœ…๐Ÿ†• โœ…
PRECALL โŒ โŒ โŒ โœ…๐Ÿ†• โŒ
PUSH_NULL โŒ โŒ โŒ โœ…๐Ÿ†• โœ…
KW_NAMES โŒ โŒ โŒ โœ…๐Ÿ†• โœ…
RESUME โŒ โŒ โŒ โœ…๐Ÿ†• โœ…
RETURN_GENERATOR โŒ โŒ โŒ โœ…๐Ÿ†• โœ…
SEND โŒ โŒ โŒ โœ…๐Ÿ†• โœ…
ASYNC_GEN_WRAP โŒ โŒ โŒ โœ…๐Ÿ†• โŒ
END_FOR โŒ โŒ โŒ โŒ โœ…๐Ÿ†•
BINARY_SLICE โŒ โŒ โŒ โŒ โœ…๐Ÿ†•
STORE_SLICE โŒ โŒ โŒ โŒ โœ…๐Ÿ†•
CLEANUP_THROW โŒ โŒ โŒ โŒ โœ…๐Ÿ†•
RETURN_CONST โŒ โŒ โŒ โŒ โœ…๐Ÿ†•
LOAD_LOCALS โŒ โŒ โŒ โŒ โœ…๐Ÿ†•
LOAD_FROM_DICT_OR_GLOBALS โŒ โŒ โŒ โŒ โœ…๐Ÿ†•
LOAD_SUPER_ATTR โŒ โŒ โŒ โŒ โœ…๐Ÿ†•
POP_JUMP_IF_NOT_NONE โŒ โŒ โŒ โŒ โœ…
Changed in version 3.12: This is no longer a pseudo-instruction.
POP_JUMP_IF_NONE โŒ โŒ โŒ โŒ โœ…
Changed in version 3.12: This is no longer a pseudo-instruction.
LOAD_FAST_CHECK โŒ โŒ โŒ โŒ โœ…๐Ÿ†•
LOAD_FAST_AND_CLEAR โŒ โŒ โŒ โŒ โœ…๐Ÿ†•
LOAD_FROM_DICT_OR_DEREF โŒ โŒ โŒ โŒ โœ…๐Ÿ†•
CALL_INTRINSIC_1 โŒ โŒ โŒ โŒ โœ…๐Ÿ†•
CALL_INTRINSIC_2 โŒ โŒ โŒ โŒ โœ…๐Ÿ†•
SETUP_CLEANUP โŒ โŒ โŒ โŒ โœ…
JUMP โŒ โŒ โŒ โŒ โœ…
JUMP_NO_INTERRUPT โŒ โŒ โŒ โŒ โœ…
SigureMo commented 1 year ago

่ดดไธ€ไธ‹่กจๆ ผ็”Ÿๆˆ็š„ไปฃ็ ๏ผŒๆ–นไพฟไปฅๅŽ็ปŸ่ฎก Python 3.13 ็ญ‰ๆ–ฐ็‰ˆๆœฌ็š„ไฟกๆฏ

ๆŠ“ๅ–ๅญ—่Š‚็ ไฟกๆฏ

ๅœจไธๅŒ็‰ˆๆœฌ็š„ dis ๆ–‡ๆกฃๆต่งˆๅ™จๆŽงๅˆถๅฐไธญ่ฟ่กŒๅฆ‚ไธ‹่„šๆœฌ๏ผŒไปฅๆŠ“ๅ–้œ€่ฆ็š„ไฟกๆฏ

JSON.stringify([...document.querySelectorAll(".opcode")].map(dl => [dl.querySelector(".sig-name").innerText, dl.querySelector(".headerlink").href, dl.querySelector(".versionmodified.added")?.innerText.match(/New in version (\d\.\d+)/)[1], [...dl.querySelectorAll(".versionmodified.changed")].map(change => [change.innerText.match(/Changed in version (\d\.\d+):/)[1], change.parentElement.innerText])]))

็ปŸ่ฎกไฟกๆฏ

ๅฐ†ๆŠ“ๅ–ๅพ—ๅˆฐ็š„ๅญ—่Š‚็ ็ฒ˜่ดดๅˆฐไธ‹้ข็š„่„šๆœฌไธญไปฅ็ปŸ่ฎกไฟกๆฏ๏ผŒๅนถ็”Ÿๆˆ Markdown ่กจๆ ผ

from __future__ import annotations

import json
from typing import Dict, TypedDict

py37_code_info = ${py37_code_info ...} # ๅœจ่ฟ™้‡Œ็ฒ˜่ดดๆŠ“ๅ–ๅˆฐ็š„ไฟกๆฏ
py38_code_info = ${py38_code_info ...}
py39_code_info = ${py39_code_info ...}
py310_code_info = ${py310_code_info ...}
py311_code_info = ${py311_code_info ...}

code_info_map = {
    "3.7": json.loads(py37_code_info),
    "3.8": json.loads(py38_code_info),
    "3.9": json.loads(py39_code_info),
    "3.10": json.loads(py310_code_info),
    "3.11": json.loads(py311_code_info),
}
py_versions = list(code_info_map.keys())

class InfoItem(TypedDict):
    link: str
    is_new: bool
    change: str | None

InfoTable = Dict[str, Dict[str, InfoItem]]

def gen_info_table(code_info_map) -> InfoTable:
    info_table: InfoTable = {}
    for py_version, code_info in code_info_map.items():
        for code, link, added_version, changes in code_info:
            if code not in info_table:
                info_table[code] = {}
            if py_version not in info_table[code]:
                info_table[code][py_version] = {}
            current_cell = info_table[code][py_version]
            current_cell["link"] = link
            current_cell["is_new"] = added_version == py_version
            current_cell["change"] = None
            for change in changes:
                changed_version, changed_description = change
                if changed_version == py_version:
                    current_cell["change"] = changed_description
    return info_table

def codegen(info_table):
    markdown_output = ""
    markdown_output += "| |"
    for py_version in py_versions:
        markdown_output += f" Python {py_version} |"
    markdown_output += "\n"
    markdown_output += "| :-: |"
    for _ in py_versions:
        markdown_output += f" :-: |"
    markdown_output += "\n"
    for code, code_info in info_table.items():
        line = f"| `{code}` | "
        for py_version in py_versions:
            if py_version in code_info:
                cell = code_info[py_version]
                line += f"[โœ…]({cell['link']})"
                if cell["is_new"]:
                    line += "๐Ÿ†•"
                if cell["change"] is not None:
                    line += f"<br/>{cell['change']}"
                line += " |"
            else:
                line += " โŒ |"
        markdown_output += line + "\n"
    return markdown_output

if __name__ == "__main__":
    info_table = gen_info_table(code_info_map)
    markdown_output = codegen(info_table)
    with open("bytecode.md", "w") as f:
        f.write(markdown_output)
SigureMo commented 1 year ago

ๆฏไธช็‰ˆๆœฌๅ˜ๅŒ–็š„่ฏดๆ˜Ž๏ผš