모듈 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
*/
}
}
}