더북(TheBook)

모듈 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

                */

                }

         }

}

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