Jak działa CPython
Wojciech Lichota
Maj 2014
Parsowanie kodu źródłowego
1. Parse source code into a parse tree
(Parser/pgen.c)
2. Transform parse tree into an Abstract Syntax Tree
(Python/ast.c)
3. Transform AST into a Control Flow Graph
(Python/compile.c)
4. Emit bytecode based on the CFG
(Python/compile.c)
Źródło: https://docs.python.org/devguide/compiler.html#abstract
Bytecode
$ python2.7
>>> def hello_world():
... print 'Hello World!'
>>> dis.dis(hello_world)
2 0 LOAD_CONST 1 ('Hello World!')
3 PRINT_ITEM
4 PRINT_NEWLINE
5 LOAD_CONST 0 (None)
8 RETURN_VALUE
Bytecode
$ python3.4
>>> def hello_world():
... print('Hello World!')
>>> dis.dis(hello_world)
2 0 LOAD_GLOBAL 0 (print)
3 LOAD_CONST 1 ('Hello World!')
6 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
Interpretacja bytecode
Python/ceval.c linie 1099-2810
● 1500 linii kodu (bez komentarzy i pustych linii)
● 132 instrukcje case
● 118 instrukcji break
● 80 instrukcji continue
● 63 komentarze
● 36 instrukcje goto
Operacje na bytecode i VM
wbudowana funkcja compile
moduł dis
narzędzie uncompyle2
moduł inspect
moduł traceback
lista opcode
Implementacje
Interpreter VM lub technika Język
CPython CPython VM C
Jython JVM Java
IronPython CLR C#
Skulpt JS engine JavaScript
RubyPython Ruby VM Ruby
PyPy JIT RPython / C
Stackless Python microthreads C
Pochodne
Nazwa Platforma
Cython C
Shed Skin C++
Brython, PythonJS JavaScript
empythoned emscripten
Py4A, QPython Android
PyObjC Mac OS X
Numba LLVM

Jak działa CPython

  • 1.
  • 2.
    Parsowanie kodu źródłowego 1.Parse source code into a parse tree (Parser/pgen.c) 2. Transform parse tree into an Abstract Syntax Tree (Python/ast.c) 3. Transform AST into a Control Flow Graph (Python/compile.c) 4. Emit bytecode based on the CFG (Python/compile.c) Źródło: https://docs.python.org/devguide/compiler.html#abstract
  • 3.
    Bytecode $ python2.7 >>> defhello_world(): ... print 'Hello World!' >>> dis.dis(hello_world) 2 0 LOAD_CONST 1 ('Hello World!') 3 PRINT_ITEM 4 PRINT_NEWLINE 5 LOAD_CONST 0 (None) 8 RETURN_VALUE
  • 4.
    Bytecode $ python3.4 >>> defhello_world(): ... print('Hello World!') >>> dis.dis(hello_world) 2 0 LOAD_GLOBAL 0 (print) 3 LOAD_CONST 1 ('Hello World!') 6 CALL_FUNCTION 1 (1 positional, 0 keyword pair) 9 POP_TOP 10 LOAD_CONST 0 (None) 13 RETURN_VALUE
  • 5.
    Interpretacja bytecode Python/ceval.c linie1099-2810 ● 1500 linii kodu (bez komentarzy i pustych linii) ● 132 instrukcje case ● 118 instrukcji break ● 80 instrukcji continue ● 63 komentarze ● 36 instrukcje goto
  • 6.
    Operacje na bytecodei VM wbudowana funkcja compile moduł dis narzędzie uncompyle2 moduł inspect moduł traceback lista opcode
  • 7.
    Implementacje Interpreter VM lubtechnika Język CPython CPython VM C Jython JVM Java IronPython CLR C# Skulpt JS engine JavaScript RubyPython Ruby VM Ruby PyPy JIT RPython / C Stackless Python microthreads C
  • 9.
    Pochodne Nazwa Platforma Cython C ShedSkin C++ Brython, PythonJS JavaScript empythoned emscripten Py4A, QPython Android PyObjC Mac OS X Numba LLVM