ݺߣ

ݺߣShare a Scribd company logo
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
Jak działa CPython
Pochodne
Nazwa Platforma
Cython C
Shed Skin C++
Brython, PythonJS JavaScript
empythoned emscripten
Py4A, QPython Android
PyObjC Mac OS X
Numba LLVM
Ad

Recommended

Kickoff to Node.js
Kickoff to Node.js
The Software House
Jakub Mrowiec (Grand Parade Poland) - Monumentum Case Study
Jakub Mrowiec (Grand Parade Poland) - Monumentum Case Study
Business Link Krakow
(prawie) Wszystko o Tinkerze
(prawie) Wszystko o Tinkerze
Laravel Poland MeetUp
Ansible w 5 minut... Playbooki
Ansible w 5 minut... Playbooki
Arkadiusz Siczek ✔
SELinux, czyli zero-zero-day exploits - DWO 2013
SELinux, czyli zero-zero-day exploits - DWO 2013
Adam Przybyła
Infrastructure As Code
Infrastructure As Code
Kamil Grabowski
GlusterFS
GlusterFS
Łukasz Jagiełło
SphinxSearch
SphinxSearch
Przemyslaw Wroblewski
infraxstructure: Robert Mroczkowski "Maszyny się uczą - admińskie rozmówki p...
infraxstructure: Robert Mroczkowski "Maszyny się uczą - admińskie rozmówki p...
PROIDEA
Od Zera do Farmera
Od Zera do Farmera
Filip Dębowski
Znaki mocy dla laików – Programowanie funkcyjne w JavaScript
Znaki mocy dla laików – Programowanie funkcyjne w JavaScript
The Software House
JDD2015: Logowanie zdarzeń w architekturze opartej na mikroserwisach - Paweł ...
JDD2015: Logowanie zdarzeń w architekturze opartej na mikroserwisach - Paweł ...
PROIDEA
Bootloadery i programy bare metal.
Bootloadery i programy bare metal.
Semihalf
Angular Restmod
Angular Restmod
Marcin Gajda
Aplikacje internetowe real-time w oparciu o React/Redux
Aplikacje internetowe real-time w oparciu o React/Redux
Dawid Rusnak
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PROIDEA
Platforma Kontentowa
Platforma Kontentowa
Rafał Filipek
ZamCamp #6 - Najczęstsze błędy w PHP
ZamCamp #6 - Najczęstsze błędy w PHP
zamcamp
Ansible w praktyce
Ansible w praktyce
Kamil Grabowski
Mongodb with Rails
Mongodb with Rails
Sebastian Nowak
Ansible w 5 minut
Ansible w 5 minut
Arkadiusz Siczek ✔
PHP@Docker - w produkcji
PHP@Docker - w produkcji
Marcin Kurzyna
Hugo - make webdev fun again
Hugo - make webdev fun again
Marcin Gajda
Jak przygotować się do rozmowy rekrutacyjnej na Python Developera
Jak przygotować się do rozmowy rekrutacyjnej na Python Developera
Wojciech Lichota
Transakcyjność w django
Transakcyjność w django
Marcin Baran
Grok Prezentacja
Grok Prezentacja
Wojciech Lichota

More Related Content

What's hot (19)

SphinxSearch
SphinxSearch
Przemyslaw Wroblewski
infraxstructure: Robert Mroczkowski "Maszyny się uczą - admińskie rozmówki p...
infraxstructure: Robert Mroczkowski "Maszyny się uczą - admińskie rozmówki p...
PROIDEA
Od Zera do Farmera
Od Zera do Farmera
Filip Dębowski
Znaki mocy dla laików – Programowanie funkcyjne w JavaScript
Znaki mocy dla laików – Programowanie funkcyjne w JavaScript
The Software House
JDD2015: Logowanie zdarzeń w architekturze opartej na mikroserwisach - Paweł ...
JDD2015: Logowanie zdarzeń w architekturze opartej na mikroserwisach - Paweł ...
PROIDEA
Bootloadery i programy bare metal.
Bootloadery i programy bare metal.
Semihalf
Angular Restmod
Angular Restmod
Marcin Gajda
Aplikacje internetowe real-time w oparciu o React/Redux
Aplikacje internetowe real-time w oparciu o React/Redux
Dawid Rusnak
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PROIDEA
Platforma Kontentowa
Platforma Kontentowa
Rafał Filipek
ZamCamp #6 - Najczęstsze błędy w PHP
ZamCamp #6 - Najczęstsze błędy w PHP
zamcamp
Ansible w praktyce
Ansible w praktyce
Kamil Grabowski
Mongodb with Rails
Mongodb with Rails
Sebastian Nowak
Ansible w 5 minut
Ansible w 5 minut
Arkadiusz Siczek ✔
PHP@Docker - w produkcji
PHP@Docker - w produkcji
Marcin Kurzyna
Hugo - make webdev fun again
Hugo - make webdev fun again
Marcin Gajda
infraxstructure: Robert Mroczkowski "Maszyny się uczą - admińskie rozmówki p...
infraxstructure: Robert Mroczkowski "Maszyny się uczą - admińskie rozmówki p...
PROIDEA
Znaki mocy dla laików – Programowanie funkcyjne w JavaScript
Znaki mocy dla laików – Programowanie funkcyjne w JavaScript
The Software House
JDD2015: Logowanie zdarzeń w architekturze opartej na mikroserwisach - Paweł ...
JDD2015: Logowanie zdarzeń w architekturze opartej na mikroserwisach - Paweł ...
PROIDEA
Bootloadery i programy bare metal.
Bootloadery i programy bare metal.
Semihalf
Aplikacje internetowe real-time w oparciu o React/Redux
Aplikacje internetowe real-time w oparciu o React/Redux
Dawid Rusnak
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PROIDEA
ZamCamp #6 - Najczęstsze błędy w PHP
ZamCamp #6 - Najczęstsze błędy w PHP
zamcamp
Hugo - make webdev fun again
Hugo - make webdev fun again
Marcin Gajda

Viewers also liked (13)

Jak przygotować się do rozmowy rekrutacyjnej na Python Developera
Jak przygotować się do rozmowy rekrutacyjnej na Python Developera
Wojciech Lichota
Transakcyjność w django
Transakcyjność w django
Marcin Baran
Grok Prezentacja
Grok Prezentacja
Wojciech Lichota
Compiled Websites with Plone, Django, Xapian and SSI
Compiled Websites with Plone, Django, Xapian and SSI
Wojciech Lichota
Sandman - makes things REST
Sandman - makes things REST
Wojciech Lichota
Apache http server - proste i zaawansowane przypadki użycia
Apache http server - proste i zaawansowane przypadki użycia
Wojciech Lichota
Grok Artykul
Grok Artykul
Wojciech Lichota
Zwinność procesu rekrutacyjnego w branży IT
Zwinność procesu rekrutacyjnego w branży IT
STX Next
Raspberry pi - tiny hardware, huge idea
Raspberry pi - tiny hardware, huge idea
Wojciech Lichota
Salary Formula. Bumpy Road to Transparency.
Salary Formula. Bumpy Road to Transparency.
Agata Landzwójczak
Anty-wzorce w różnorodności w branży it
Anty-wzorce w różnorodności w branży it
Agata Landzwójczak
Continuous Deployment aplikacji w Django
Continuous Deployment aplikacji w Django
Wojciech Lichota
Jak przygotować się do rozmowy rekrutacyjnej na Python Developera
Jak przygotować się do rozmowy rekrutacyjnej na Python Developera
Wojciech Lichota
Transakcyjność w django
Transakcyjność w django
Marcin Baran
Compiled Websites with Plone, Django, Xapian and SSI
Compiled Websites with Plone, Django, Xapian and SSI
Wojciech Lichota
Apache http server - proste i zaawansowane przypadki użycia
Apache http server - proste i zaawansowane przypadki użycia
Wojciech Lichota
Zwinność procesu rekrutacyjnego w branży IT
Zwinność procesu rekrutacyjnego w branży IT
STX Next
Raspberry pi - tiny hardware, huge idea
Raspberry pi - tiny hardware, huge idea
Wojciech Lichota
Salary Formula. Bumpy Road to Transparency.
Salary Formula. Bumpy Road to Transparency.
Agata Landzwójczak
Anty-wzorce w różnorodności w branży it
Anty-wzorce w różnorodności w branży it
Agata Landzwójczak
Continuous Deployment aplikacji w Django
Continuous Deployment aplikacji w Django
Wojciech Lichota
Ad

Similar to Jak działa CPython (18)

Automatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHP
Laravel Poland MeetUp
Python io
Python io
robert_zaremba
Ganymede - nowoczesne technologie w grach przeglądarkowych i mobilnych
Ganymede - nowoczesne technologie w grach przeglądarkowych i mobilnych
SKN Shader
Secure Coding w praktyce.
Secure Coding w praktyce.
Semihalf
Python szybki start
Python szybki start
Sages
DSL - DYI
DSL - DYI
Maciek Próchniak
PLNOG 18 - Maciej Flak - Network as a Sensor czyli wykorzystanie NetFlow do m...
PLNOG 18 - Maciej Flak - Network as a Sensor czyli wykorzystanie NetFlow do m...
PROIDEA
Python IO
Python IO
Robert Zaremba
University day 2
University day 2
Sławomir Borowiec
ITAD PolSl 2014 - Nowości w .NET 2015
ITAD PolSl 2014 - Nowości w .NET 2015
Michał Dudak
Phyton
Phyton
tomrogowski2
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
Polcode
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
Luke Adamczewski
Python. Rozmówki
Python. Rozmówki
Wydawnictwo Helion
Let your existing devices enter the witchcraft of IoT and the smart-home world
Let your existing devices enter the witchcraft of IoT and the smart-home world
The Software House
4Developers 2015: .NET 2015 - co nowego? - Michał Dudak, Future Processing
4Developers 2015: .NET 2015 - co nowego? - Michał Dudak, Future Processing
PROIDEA
Jak działa rekurencyjne CTE?
Jak działa rekurencyjne CTE?
Bartosz Ratajczyk
Automatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHP
Laravel Poland MeetUp
Ganymede - nowoczesne technologie w grach przeglądarkowych i mobilnych
Ganymede - nowoczesne technologie w grach przeglądarkowych i mobilnych
SKN Shader
Secure Coding w praktyce.
Secure Coding w praktyce.
Semihalf
Python szybki start
Python szybki start
Sages
PLNOG 18 - Maciej Flak - Network as a Sensor czyli wykorzystanie NetFlow do m...
PLNOG 18 - Maciej Flak - Network as a Sensor czyli wykorzystanie NetFlow do m...
PROIDEA
ITAD PolSl 2014 - Nowości w .NET 2015
ITAD PolSl 2014 - Nowości w .NET 2015
Michał Dudak
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
Polcode
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
Luke Adamczewski
Let your existing devices enter the witchcraft of IoT and the smart-home world
Let your existing devices enter the witchcraft of IoT and the smart-home world
The Software House
4Developers 2015: .NET 2015 - co nowego? - Michał Dudak, Future Processing
4Developers 2015: .NET 2015 - co nowego? - Michał Dudak, Future Processing
PROIDEA
Ad

Jak działa CPython

  • 1. Jak działa CPython Wojciech Lichota Maj 2014
  • 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 >>> 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
  • 4. 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
  • 5. 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
  • 6. Operacje na bytecode i VM wbudowana funkcja compile moduł dis narzędzie uncompyle2 moduł inspect moduł traceback lista opcode
  • 7. 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
  • 9. Pochodne Nazwa Platforma Cython C Shed Skin C++ Brython, PythonJS JavaScript empythoned emscripten Py4A, QPython Android PyObjC Mac OS X Numba LLVM