모듈 dis를 불러온 다음 get_instructions() 함수를 통해 바이트 코드를 제공하는 발생자를 만듭니다(#1). 바이트 코드 이름(#2)과 인자 값(#3)을 출력해 보면 어셈블리어와는 다른 파이썬의 바이트 코드 인스트럭션을 확인할 수 있습니다.

    바이트 코드는 파이썬의 가상 머신 위에서 실행됩니다. 가상 머신이라고 하니 뭔가 난해할 것 같지만 그렇지 않습니다. 파이썬의 가상 머신인 PVM은 그저 굉장히 큰 무한 루프일 뿐입니다. 다음 코드는 CPython 소스 코드 중 ceval.c 파일에 있는 PVM 코드를 알아보기 쉽게 재구성한 것입니다.

    PyObject *

    _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag)

    {

              int opcode;     /* Current opcode */

              int oparg;      /* Current opcode argument, if any */

              int word;


              opcode = _Py_OPCODE(word); \

              oparg = _Py_OPARG(word); \


              for (;;) {

                    switch (opcode) {

                    case NOP:

                            // Things

                            break;

                    case LOAD_FAST:

                            // Things

                            break;

                    case STORE_FAST:

                            // Things

                            break;

                    /*

                    The rest of bytecode cases

                    */

                    }

             }

    }

    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.