„PyPy to reimplementacja Pythona w Pythonie” jest dość mylącym sposobem opisania PyPy, IMHO, chociaż technicznie jest to prawdą.
Istnieją dwie główne części PyPy.
- Ramy tłumaczeń
- Tłumacz
Struktura tłumaczenia jest kompilatorem. Kompiluje kod RPython do C (lub innych celów), automatycznie dodając takie aspekty, jak wyrzucanie elementów bezużytecznych i kompilator JIT. Nie może obsługiwać dowolny kod Python, tylko RPython.
RPython jest podzbiorem normalnego Pythona; cały kod RPython jest kodem Python, ale nie na odwrót. Nie ma formalnej definicji RPython, ponieważ RPython jest w zasadzie tylko „podzbiorem Pythona, który może być przetłumaczony przez środowisko translacji PyPy”. Ale aby zostać przetłumaczonym, kod RPython musi być wpisany statycznie (typy są wywnioskowane, nie deklarujesz ich, ale wciąż jest to ściśle jeden typ na zmienną) i nie możesz robić takich rzeczy jak deklarowanie / modyfikowanie funkcji / klasy w czasie wykonywania.
Tłumacz to normalny interpreter języka Python napisany w RPython.
Ponieważ kod RPython jest normalnym kodem w języku Python, można go uruchomić na dowolnym interpretera języka Python. Ale żadne z twierdzeń dotyczących prędkości PyPy nie pochodzi z takiego działania; jest to tylko szybki cykl testowy, ponieważ tłumaczenie tłumacza zajmuje dużo czasu.
Mając to na uwadze, powinno być od razu oczywiste, że spekulacje na temat PyPyPy lub PyPyPyPy w rzeczywistości nie mają żadnego sensu. Masz tłumacza napisanego w RPython. Tłumaczysz go na kod C, który szybko wykonuje Python. Tam proces się kończy; nie ma już RPython do przyspieszenia poprzez ponowne przetworzenie.
Zatem „Jak to możliwe, że PyPy jest szybszy niż CPython” również staje się dość oczywiste. PyPy ma lepszą implementację, w tym kompilator JIT (uważam, że generalnie nie jest tak szybki bez kompilatora JIT, co oznacza, że PyPy jest szybszy tylko dla programów podatnych na kompilację JIT). CPython nigdy nie został zaprojektowany jako wysoce optymalizująca implementacja języka Python (choć starają się, aby była to wysoce zoptymalizowana implementacja, jeśli podążasz za różnicą).
Naprawdę innowacyjny fragment projektu PyPy polega na tym, że nie piszą ręcznie skomplikowanych schematów GC ani kompilatorów JIT. Piszą interpreter stosunkowo prosto w RPython, a dla wszystkich RPython jest niższy poziom niż Python, to wciąż jest zorientowany obiektowo język zbierania śmieci, znacznie wyższy poziom niż C. Następnie struktura tłumaczenia automatycznie dodaje rzeczy takie jak GC i JIT. Tak więc ramy tłumaczenia są ogromnewysiłek, ale równie dobrze odnosi się do interpretera python PyPy, jednak zmieniają one swoją implementację, pozwalając na większą swobodę eksperymentowania w celu poprawy wydajności (bez martwienia się o wprowadzenie błędów GC lub aktualizację kompilatora JIT, aby poradzić sobie ze zmianami). Oznacza to również, że kiedy zaczną implementować interpreter języka Python3, automatycznie uzyska te same korzyści. I wszyscy inni tłumacze napisani w ramach PyPy (których jest wiele na różnych etapach języka polskiego). Wszyscy tłumacze korzystający ze środowiska PyPy automatycznie obsługują wszystkie platformy obsługiwane przez środowisko.
Tak więc prawdziwą zaletą projektu PyPy jest oddzielenie (w jak największym stopniu) wszystkich elementów wdrażania wydajnego niezależnego od platformy tłumacza dla dynamicznego języka. A potem wymyśl jedno dobre wdrożenie w jednym miejscu, które może być ponownie wykorzystane przez wielu tłumaczy. Nie jest to natychmiastowa wygrana, jak „mój program w Pythonie działa teraz szybciej”, ale jest to świetna perspektywa na przyszłość.
I może szybciej uruchomić Twój program Python (być może).