Skip to content
This repository has been archived by the owner on Jan 24, 2024. It is now read-only.

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

Open
SigureMo opened this issue Jun 6, 2023 · 2 comments

Comments

@SigureMo
Copy link
Member

SigureMo commented Jun 6, 2023

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
Copy link
Member Author

SigureMo commented Aug 3, 2023

่ดดไธ€ไธ‹่กจๆ ผ็”Ÿๆˆ็š„ไปฃ็ ๏ผŒๆ–นไพฟไปฅๅŽ็ปŸ่ฎก 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
Copy link
Member Author

SigureMo commented Aug 9, 2023

@SigureMo SigureMo changed the title ๅญ—่Š‚็ ็‰ˆๆœฌๅทฎๅผ‚่กจๆ ผ ๐Ÿ—“๏ธ ๅญ—่Š‚็ ็‰ˆๆœฌๅทฎๅผ‚่กจๆ ผ Aug 14, 2023
@SigureMo SigureMo changed the title ๐Ÿ—“๏ธ ๅญ—่Š‚็ ็‰ˆๆœฌๅทฎๅผ‚่กจๆ ผ ๐Ÿ—“๏ธ Python ๅ„็‰ˆๆœฌๅญ—่Š‚็ ๅทฎๅผ‚่กจๆ ผ Aug 14, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant