{"id":1129,"date":"2021-05-01T21:04:00","date_gmt":"2021-05-01T19:04:00","guid":{"rendered":"https:\/\/trzykody.pl\/?page_id=1129"},"modified":"2026-02-20T19:31:47","modified_gmt":"2026-02-20T18:31:47","slug":"pierwsze-kroki","status":"publish","type":"page","link":"https:\/\/trzykody.pl\/index.php\/python\/pierwsze-kroki\/","title":{"rendered":"Pierwsze kroki"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>Program w j\u0119zyku Python przechodzi kilka etap\u00f3w zanim zostanie wykonany przez maszyn\u0119. Cz\u0119sto m\u00f3wi si\u0119, \u017ce Python jest j\u0119zykiem interpretowanym, jednak technicznie rzecz bior\u0105c wykorzystuje mechanizm kompilacji do kodu po\u015bredniego (bytecode), kt\u00f3ry nast\u0119pnie wykonywany jest przez maszyn\u0119 wirtualn\u0105. Zrozumienie jak dzia\u0142a kompilator Python pozwala lepiej analizowa\u0107 b\u0142\u0119dy, wydajno\u015b\u0107 oraz spos\u00f3b organizacji \u015brodowiska pracy.<\/strong><\/p>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>Spis tre\u015bci<\/h2><nav><ol><li class=\"\"><a href=\"#kompilator-python-czym-jest-w-praktyce-i-jak-przebiega-proces-translacji-kodu-zrodlowego-do-postaci-wykonywalnej\">Kompilator Python &#8211; czym jest w praktyce i jak przebiega proces translacji kodu \u017ar\u00f3d\u0142owego do postaci wykonywalnej<\/a><ol><li class=\"\"><a href=\"#analiza-leksykalna\">Analiza leksykalna<\/a><\/li><li class=\"\"><a href=\"#analiza-skladniowa-i-ast\">Analiza sk\u0142adniowa i AST<\/a><\/li><li class=\"\"><a href=\"#kompilacja-do-bytecode\">Kompilacja do bytecode<\/a><\/li><li class=\"\"><a href=\"#wykonanie-przez-pvm\">Wykonanie przez PVM<\/a><\/li><\/ol><\/li><li class=\"\"><a href=\"#kompilator-python-srodowiska-programistyczne-takie-jak-py-charm-atom-online-gdb-i-ich-rola-w-procesie-tworzenia-i-uruchamiania-kodu\">Kompilator Python &#8211; \u015brodowiska programistyczne takie jak PyCharm, Atom, OnlineGDB i ich rola w procesie tworzenia i uruchamiania kodu<\/a><ol><li class=\"\"><a href=\"#py-charm\">PyCharm<\/a><\/li><li class=\"\"><a href=\"#atom\">Atom<\/a><\/li><li class=\"\"><a href=\"#online-gdb\">OnlineGDB<\/a><\/li><li class=\"\"><a href=\"#inne-srodowiska\">Inne \u015brodowiska<\/a><\/li><\/ol><\/li><li class=\"\"><a href=\"#kompilator-python-roznice-miedzy-c-python-py-py-i-cython-oraz-wplyw-implementacji-na-wydajnosc-i-sposob-wykonywania-programu\">Kompilator Python &#8211; r\u00f3\u017cnice mi\u0119dzy CPython, PyPy i Cython oraz wp\u0142yw implementacji na wydajno\u015b\u0107 i spos\u00f3b wykonywania programu<\/a><ol><li class=\"\"><a href=\"#c-python\">CPython<\/a><\/li><li class=\"\"><a href=\"#py-py\">PyPy<\/a><\/li><li class=\"\"><a href=\"#cython\">Cython<\/a><\/li><\/ol><\/li><li class=\"\"><a href=\"#przykladowe-porownanie-kompilacji-w-pythonie-i-jezykach-c-c\">Przyk\u0142adowe por\u00f3wnanie kompilacji w Pythonie i j\u0119zykach C\/C++<\/a><ol><li class=\"\"><a href=\"#c-kompilacja-do-kodu-maszynowego\">C &#8211; kompilacja do kodu maszynowego<\/a><\/li><li class=\"\"><a href=\"#c-analogiczny-model\">C++ &#8211; analogiczny model<\/a><\/li><li class=\"\"><a href=\"#python-model-hybrydowy\">Python &#8211; model hybrydowy<\/a><\/li><\/ol><\/li><li class=\"\"><a href=\"#czeste-nieporozumienia-zwiazane-z-pojeciem-kompilatora-w-pythonie\">Cz\u0119ste nieporozumienia zwi\u0105zane z poj\u0119ciem kompilatora w Pythonie<\/a><\/li><li class=\"\"><a href=\"#uwagi-praktyczne-i-typowe-bledy\">Uwagi praktyczne i typowe b\u0142\u0119dy<\/a><\/li><li class=\"\"><a href=\"#zakonczenie\">Zako\u0144czenie<\/a><\/li><\/ol><\/nav><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"kompilator-python-czym-jest-w-praktyce-i-jak-przebiega-proces-translacji-kodu-zrodlowego-do-postaci-wykonywalnej\">Kompilator Python &#8211; czym jest w praktyce i jak przebiega proces translacji kodu \u017ar\u00f3d\u0142owego do postaci wykonywalnej<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">W klasycznym uj\u0119ciu kompilator t\u0142umaczy kod \u017ar\u00f3d\u0142owy na kod maszynowy. W przypadku CPython (referencyjnej implementacji j\u0119zyka) proces wygl\u0105da inaczej.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Etapy wykonania programu:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Analiza leksykalna (tokenizacja)<\/li>\n\n\n\n<li>Analiza sk\u0142adniowa (budowa drzewa AST)<\/li>\n\n\n\n<li>Kompilacja AST do bytecode<\/li>\n\n\n\n<li>Wykonanie bytecode przez Python Virtual Machine (PVM)<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"analiza-leksykalna\">Analiza leksykalna<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Kod \u017ar\u00f3d\u0142owy jest dzielony na tokeny: identyfikatory, s\u0142owa kluczowe, operatory, litera\u0142y.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">x = 5 + 3<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Tokeny:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>IDENTIFIER(x)<\/li>\n\n\n\n<li>OPERATOR(=)<\/li>\n\n\n\n<li>NUMBER(5)<\/li>\n\n\n\n<li>OPERATOR(+)<\/li>\n\n\n\n<li>NUMBER(3)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">To czysto formalny etap, bez rozumienia znaczenia programu.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"analiza-skladniowa-i-ast\">Analiza sk\u0142adniowa i AST<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Z token\u00f3w budowane jest drzewo sk\u0142adni abstrakcyjnej (Abstract Syntax Tree). To struktura opisuj\u0105ca relacje mi\u0119dzy elementami programu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dla przyk\u0142adu:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Assign<br> \u251c\u2500\u2500 Name(x)<br> \u2514\u2500\u2500 BinOp<br>     \u251c\u2500\u2500 Num(5)<br>     \u2514\u2500\u2500 Num(3)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">AST nie zawiera ju\u017c szczeg\u00f3\u0142\u00f3w tekstowych (np. nawias\u00f3w), tylko struktur\u0119 logiczn\u0105.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"kompilacja-do-bytecode\">Kompilacja do bytecode<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Drzewo AST przekszta\u0142cane jest w kod po\u015bredni &#8211; bytecode. Jest to zestaw instrukcji dla maszyny wirtualnej Pythona.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mo\u017cna to zobaczy\u0107 u\u017cywaj\u0105c modu\u0142u <code>dis<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">import disdef f():<br>    x = 5 + 3<br>    return xdis.dis(f)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Otrzymamy instrukcje typu:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">LOAD_CONST<br>LOAD_CONST<br>BINARY_ADD<br>STORE_FAST<br>RETURN_VALUE<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ten kod zapisywany jest w plikach <code>.pyc<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"wykonanie-przez-pvm\">Wykonanie przez PVM<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Python Virtual Machine interpretuje bytecode instrukcja po instrukcji. To t\u0142umaczy, dlaczego Python jest wolniejszy ni\u017c j\u0119zyki kompilowane bezpo\u015brednio do kodu maszynowego (np. C).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wa\u017cne: kompilacja w Pythonie odbywa si\u0119 automatycznie i u\u017cytkownik zazwyczaj jej nie widzi.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"kompilator-python-srodowiska-programistyczne-takie-jak-py-charm-atom-online-gdb-i-ich-rola-w-procesie-tworzenia-i-uruchamiania-kodu\">Kompilator Python &#8211; \u015brodowiska programistyczne takie jak PyCharm, Atom, OnlineGDB i ich rola w procesie tworzenia i uruchamiania kodu<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">W praktyce u\u017cytkownik nie pracuje bezpo\u015brednio z kompilatorem. Korzysta z IDE lub edytora, kt\u00f3ry integruje interpreter i narz\u0119dzia pomocnicze.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"py-charm\">PyCharm<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">PyCharm to rozbudowane \u015brodowisko IDE dla Pythona.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cechy istotne technicznie:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>zintegrowany interpreter (lokalny lub wirtualne \u015brodowisko venv),<\/li>\n\n\n\n<li>analiza statyczna kodu,<\/li>\n\n\n\n<li>podpowiedzi typ\u00f3w,<\/li>\n\n\n\n<li>debugger,<\/li>\n\n\n\n<li>profiler,<\/li>\n\n\n\n<li>zarz\u0105dzanie pakietami pip.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">PyCharm nie jest kompilatorem. On wywo\u0142uje interpreter Pythona i zarz\u0105dza \u015brodowiskiem uruchomieniowym.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Schemat dzia\u0142ania:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Edytujesz plik <code>.py<\/code>.<\/li>\n\n\n\n<li>PyCharm zapisuje plik.<\/li>\n\n\n\n<li>Uruchamia interpreter wskazany w konfiguracji.<\/li>\n\n\n\n<li>Interpreter kompiluje kod do bytecode.<\/li>\n\n\n\n<li>Bytecode wykonywany jest w PVM.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Z punktu widzenia u\u017cytkownika to jedno klikni\u0119cie \u201eRun\u201d.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"atom\">Atom<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Atom by\u0142 lekkim edytorem tekstu (projekt zako\u0144czony w 2022 roku).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Atom sam nie zawiera\u0142 kompilatora ani interpretera. Wymaga\u0142:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>zainstalowanego Pythona w systemie,<\/li>\n\n\n\n<li>wtyczek (np. do uruchamiania kodu),<\/li>\n\n\n\n<li>konfiguracji \u015bcie\u017cki do interpretera.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Edytor pe\u0142ni\u0142 rol\u0119 interfejsu do pliku tekstowego. Ca\u0142y proces kompilacji odbywa\u0142 si\u0119 w zewn\u0119trznym interpreterze.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"online-gdb\">OnlineGDB<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">OnlineGDB to \u015brodowisko przegl\u0105darkowe umo\u017cliwiaj\u0105ce uruchamianie wielu j\u0119zyk\u00f3w.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W kontek\u015bcie Pythona:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>kod wysy\u0142any jest na serwer,<\/li>\n\n\n\n<li>interpreter dzia\u0142a po stronie serwera,<\/li>\n\n\n\n<li>bytecode generowany jest w \u015brodowisku zdalnym,<\/li>\n\n\n\n<li>wynik zwracany jest do przegl\u0105darki.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">R\u00f3\u017cnica wzgl\u0119dem lokalnego \u015brodowiska:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>brak bezpo\u015bredniego dost\u0119pu do systemu plik\u00f3w,<\/li>\n\n\n\n<li>ograniczenia zasob\u00f3w,<\/li>\n\n\n\n<li>izolacja proces\u00f3w.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"inne-srodowiska\">Inne \u015brodowiska<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Visual Studio Code &#8211; edytor z rozszerzeniem Python.<\/li>\n\n\n\n<li>IDLE &#8211; proste \u015brodowisko dostarczane z Pythonem.<\/li>\n\n\n\n<li>Jupyter Notebook &#8211; \u015brodowisko interaktywne, popularne w analizie danych.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Ka\u017cde z nich:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>zarz\u0105dza plikami,<\/li>\n\n\n\n<li>uruchamia interpreter,<\/li>\n\n\n\n<li>nie zast\u0119puje kompilatora CPython.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"kompilator-python-roznice-miedzy-c-python-py-py-i-cython-oraz-wplyw-implementacji-na-wydajnosc-i-sposob-wykonywania-programu\">Kompilator Python &#8211; r\u00f3\u017cnice mi\u0119dzy CPython, PyPy i Cython oraz wp\u0142yw implementacji na wydajno\u015b\u0107 i spos\u00f3b wykonywania programu<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Python to j\u0119zyk, nie jedna implementacja.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"c-python\">CPython<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Referencyjna implementacja napisana w C.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Charakterystyka:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>kompilacja do bytecode,<\/li>\n\n\n\n<li>interpretacja w PVM,<\/li>\n\n\n\n<li>GIL (Global Interpreter Lock),<\/li>\n\n\n\n<li>stabilno\u015b\u0107 i zgodno\u015b\u0107.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"py-py\">PyPy<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">PyPy to alternatywna implementacja.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cechy:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>JIT (Just-In-Time compilation),<\/li>\n\n\n\n<li>dynamiczna kompilacja fragment\u00f3w kodu do maszynowego,<\/li>\n\n\n\n<li>cz\u0119sto wy\u017csza wydajno\u015b\u0107 w kodzie obliczeniowym.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Mechanizm:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Kod kompilowany do bytecode.<\/li>\n\n\n\n<li>Analiza wykonywania.<\/li>\n\n\n\n<li>Najcz\u0119\u015bciej wykonywane fragmenty kompilowane do kodu maszynowego.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"cython\">Cython<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Cython to narz\u0119dzie kompiluj\u0105ce kod (zbli\u017cony do Pythona) do C.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Proces:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Kod <code>.pyx<\/code>.<\/li>\n\n\n\n<li>Generacja kodu C.<\/li>\n\n\n\n<li>Kompilacja do biblioteki wsp\u00f3\u0142dzielonej.<\/li>\n\n\n\n<li>Import w Pythonie.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">cdef int add(int a, int b):<br>    return a + b<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Kod kompilowany do C, a nast\u0119pnie do natywnej biblioteki.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zastosowanie:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>obliczenia numeryczne,<\/li>\n\n\n\n<li>redukcja narzutu dynamicznego typowania.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"przykladowe-porownanie-kompilacji-w-pythonie-i-jezykach-c-c\">Przyk\u0142adowe por\u00f3wnanie kompilacji w Pythonie i j\u0119zykach C\/C++<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"c-kompilacja-do-kodu-maszynowego\">C &#8211; kompilacja do kodu maszynowego<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">#include &lt;stdio.h&gt;int main() {<br>    int x = 5 + 3;<br>    printf(\"%d\\n\", x);<br>    return 0;<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Proces:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Preprocesor.<\/li>\n\n\n\n<li>Kompilacja do kodu po\u015bredniego.<\/li>\n\n\n\n<li>Assembler.<\/li>\n\n\n\n<li>Linker.<\/li>\n\n\n\n<li>Plik wykonywalny.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Brak maszyny wirtualnej.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"c-analogiczny-model\">C++ &#8211; analogiczny model<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">#include &lt;iostream&gt;<br>using namespace std;int main() {<br>    int x = 5 + 3;<br>    cout &lt;&lt; x &lt;&lt; endl;<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Kompilator generuje kod maszynowy specyficzny dla architektury.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"python-model-hybrydowy\">Python &#8211; model hybrydowy<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">x = 5 + 3<br>print(x)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Brak jawnej kompilacji do pliku binarnego. Kod wykonywany przez interpreter.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">R\u00f3\u017cnice:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Python dynamicznie sprawdza typy.<\/li>\n\n\n\n<li>C\/C++ sprawdzaj\u0105 typy w czasie kompilacji.<\/li>\n\n\n\n<li>Python ma wi\u0119kszy narzut wykonania.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"czeste-nieporozumienia-zwiazane-z-pojeciem-kompilatora-w-pythonie\">Cz\u0119ste nieporozumienia zwi\u0105zane z poj\u0119ciem kompilatora w Pythonie<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u201ePython nie ma kompilatora\u201d &#8211; nieprawda. Ma kompilator do bytecode.<\/li>\n\n\n\n<li>IDE jest kompilatorem &#8211; nie jest. IDE to \u015brodowisko uruchamiaj\u0105ce interpreter.<\/li>\n\n\n\n<li>Plik <code>.pyc<\/code> to plik wykonywalny &#8211; nie, wymaga maszyny wirtualnej.<\/li>\n\n\n\n<li>Szybko\u015b\u0107 zale\u017cy od IDE &#8211; nie, zale\u017cy od implementacji interpretera i algorytmu.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"uwagi-praktyczne-i-typowe-bledy\">Uwagi praktyczne i typowe b\u0142\u0119dy<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>R\u00f3\u017cne wersje interpretera w systemie mog\u0105 powodowa\u0107 konflikt pakiet\u00f3w.<\/li>\n\n\n\n<li>Brak wirtualnego \u015brodowiska prowadzi do mieszania zale\u017cno\u015bci.<\/li>\n\n\n\n<li>Kod dzia\u0142aj\u0105cy w OnlineGDB mo\u017ce nie dzia\u0142a\u0107 lokalnie (r\u00f3\u017cnice wersji).<\/li>\n\n\n\n<li>PyPy przyspiesza kod obliczeniowy, ale nie zawsze kod IO.<\/li>\n\n\n\n<li>Cython wymaga kompilatora C w systemie.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">W praktyce najcz\u0119stszy problem to brak \u015bwiadomo\u015bci, \u017ce Python kompiluje kod przy ka\u017cdym uruchomieniu modu\u0142u.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"zakonczenie\">Zako\u0144czenie<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mechanizm dzia\u0142ania Pythona opiera si\u0119 na kompilacji do kodu po\u015bredniego i jego interpretacji w maszynie wirtualnej. \u015arodowiska takie jak PyCharm, Atom czy OnlineGDB nie zast\u0119puj\u0105 kompilatora, a jedynie organizuj\u0105 proces tworzenia i uruchamiania programu. Zrozumienie r\u00f3\u017cnicy mi\u0119dzy implementacj\u0105 j\u0119zyka a edytorem znacz\u0105co u\u0142atwia prac\u0119 z wi\u0119kszymi projektami oraz analiz\u0119 wydajno\u015bci.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Program w j\u0119zyku Python przechodzi kilka etap\u00f3w zanim zostanie wykonany przez maszyn\u0119. Cz\u0119sto m\u00f3wi si\u0119, \u017ce Python jest j\u0119zykiem interpretowanym, jednak technicznie rzecz bior\u0105c wykorzystuje mechanizm kompilacji do kodu po\u015bredniego (bytecode), kt\u00f3ry nast\u0119pnie wykonywany jest przez maszyn\u0119 wirtualn\u0105. Zrozumienie jak dzia\u0142a kompilator Python pozwala lepiej analizowa\u0107 b\u0142\u0119dy, wydajno\u015b\u0107 oraz spos\u00f3b organizacji \u015brodowiska pracy. Kompilator Python &#8211; czym jest w praktyce i jak przebiega proces translacji kodu \u017ar\u00f3d\u0142owego do postaci wykonywalnej W klasycznym uj\u0119ciu kompilator t\u0142umaczy kod \u017ar\u00f3d\u0142owy na kod maszynowy. W przypadku CPython (referencyjnej implementacji j\u0119zyka) proces wygl\u0105da inaczej. Etapy wykonania programu: Analiza leksykalna Kod \u017ar\u00f3d\u0142owy jest dzielony na tokeny: identyfikatory, s\u0142owa kluczowe, operatory, litera\u0142y. Przyk\u0142ad: x = 5 + 3 Tokeny: To czysto formalny etap, bez rozumienia znaczenia programu. Analiza sk\u0142adniowa i AST Z token\u00f3w budowane jest drzewo sk\u0142adni abstrakcyjnej (Abstract Syntax Tree). To struktura opisuj\u0105ca relacje mi\u0119dzy elementami programu. Dla przyk\u0142adu: Assign \u251c\u2500\u2500 Name(x) \u2514\u2500\u2500 BinOp \u251c\u2500\u2500 Num(5) \u2514\u2500\u2500 Num(3) AST nie zawiera ju\u017c szczeg\u00f3\u0142\u00f3w tekstowych (np. nawias\u00f3w), tylko struktur\u0119 logiczn\u0105. Kompilacja do bytecode Drzewo AST przekszta\u0142cane jest w kod po\u015bredni &#8211; bytecode. Jest to zestaw instrukcji dla maszyny wirtualnej Pythona. Mo\u017cna to zobaczy\u0107 u\u017cywaj\u0105c modu\u0142u dis: import disdef f(): x = 5 + 3 return xdis.dis(f) Otrzymamy instrukcje typu: LOAD_CONSTLOAD_CONSTBINARY_ADDSTORE_FASTRETURN_VALUE Ten kod zapisywany jest w plikach .pyc. Wykonanie przez PVM Python Virtual Machine interpretuje bytecode instrukcja po instrukcji. To t\u0142umaczy, dlaczego Python jest wolniejszy ni\u017c j\u0119zyki kompilowane bezpo\u015brednio do kodu maszynowego (np. C). Wa\u017cne: kompilacja w Pythonie odbywa si\u0119 automatycznie i u\u017cytkownik zazwyczaj jej nie widzi. Kompilator Python &#8211; \u015brodowiska programistyczne takie jak PyCharm, Atom, OnlineGDB i ich rola w procesie tworzenia i uruchamiania kodu W praktyce u\u017cytkownik nie pracuje bezpo\u015brednio z kompilatorem. Korzysta z IDE lub edytora, kt\u00f3ry integruje interpreter i narz\u0119dzia pomocnicze. PyCharm PyCharm to rozbudowane \u015brodowisko IDE dla Pythona. Cechy istotne technicznie: PyCharm nie jest kompilatorem. On wywo\u0142uje interpreter Pythona i zarz\u0105dza \u015brodowiskiem uruchomieniowym. Schemat dzia\u0142ania: Z punktu widzenia u\u017cytkownika to jedno klikni\u0119cie \u201eRun\u201d. Atom Atom by\u0142 lekkim edytorem tekstu (projekt zako\u0144czony w 2022 roku). Atom sam nie zawiera\u0142 kompilatora ani interpretera. Wymaga\u0142: Edytor pe\u0142ni\u0142 rol\u0119 interfejsu do pliku tekstowego. Ca\u0142y proces kompilacji odbywa\u0142 si\u0119 w zewn\u0119trznym interpreterze. OnlineGDB OnlineGDB to \u015brodowisko przegl\u0105darkowe umo\u017cliwiaj\u0105ce uruchamianie wielu j\u0119zyk\u00f3w. W kontek\u015bcie Pythona: R\u00f3\u017cnica wzgl\u0119dem lokalnego \u015brodowiska: Inne \u015brodowiska Ka\u017cde z nich: Kompilator Python &#8211; r\u00f3\u017cnice mi\u0119dzy CPython, PyPy i Cython oraz wp\u0142yw implementacji na wydajno\u015b\u0107 i spos\u00f3b wykonywania programu Python to j\u0119zyk, nie jedna implementacja. CPython Referencyjna implementacja napisana w C. Charakterystyka: PyPy PyPy to alternatywna implementacja. Cechy: Mechanizm: Cython Cython to narz\u0119dzie kompiluj\u0105ce kod (zbli\u017cony do Pythona) do C. Proces: Przyk\u0142ad: cdef int add(int a, int b): return a + b Kod kompilowany do C, a nast\u0119pnie do natywnej biblioteki. Zastosowanie: Przyk\u0142adowe por\u00f3wnanie kompilacji w Pythonie i j\u0119zykach C\/C++ C &#8211; kompilacja do kodu maszynowego #include &lt;stdio.h&gt;int main() { int x = 5 + 3; printf(&#8222;%d\\n&#8221;, x); return 0;} Proces: Brak maszyny wirtualnej. C++ &#8211; analogiczny model #include &lt;iostream&gt;using namespace std;int main() { int x = 5 + 3; cout &lt;&lt; x &lt;&lt; endl;} Kompilator generuje kod maszynowy specyficzny dla architektury. Python &#8211; model hybrydowy x = 5 + 3print(x) Brak jawnej kompilacji do pliku binarnego. Kod wykonywany przez interpreter. R\u00f3\u017cnice: Cz\u0119ste nieporozumienia zwi\u0105zane z poj\u0119ciem kompilatora w Pythonie Uwagi praktyczne i typowe b\u0142\u0119dy W praktyce najcz\u0119stszy problem to brak \u015bwiadomo\u015bci, \u017ce Python kompiluje kod przy ka\u017cdym uruchomieniu modu\u0142u. Zako\u0144czenie Mechanizm dzia\u0142ania Pythona opiera si\u0119 na kompilacji do kodu po\u015bredniego i jego interpretacji w maszynie wirtualnej. \u015arodowiska takie jak PyCharm, Atom czy OnlineGDB nie zast\u0119puj\u0105 kompilatora, a jedynie organizuj\u0105 proces tworzenia i uruchamiania programu. Zrozumienie r\u00f3\u017cnicy mi\u0119dzy implementacj\u0105 j\u0119zyka a edytorem znacz\u0105co u\u0142atwia prac\u0119 z wi\u0119kszymi projektami oraz analiz\u0119 wydajno\u015bci.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":1031,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1129","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/pages\/1129","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/comments?post=1129"}],"version-history":[{"count":1,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/pages\/1129\/revisions"}],"predecessor-version":[{"id":1130,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/pages\/1129\/revisions\/1130"}],"up":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/pages\/1031"}],"wp:attachment":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1129"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}