Dlaczego Python ich nie ma?
Nie jestem pewien, dlaczego uważasz, że nie ma implementacji Python, które dbają o wydajność. PyPy , IronPython i Jython są przemysłowymi, gotowymi do wdrożenia implementacjami Python, które dbają o wydajność. Pyston to implementacja w fazie rozwoju, która została stworzona specjalnie z myślą o wydajności. Unladen Swallow i Psyco to także projekty mające na celu poprawę wydajności Pythona.
Jednak fakt, że użytkownicy CPython znacznie przewyższają całkowitą łączną bazę użytkowników wszystkich innych wdrożeń, że społeczność Unladen Swallow została odrzucona przez społeczność, że większość z tych projektów jest martwa lub stara się przyciągnąć programistów, powinna powiedzieć coś o tym, jak Python społeczność ceni wydajność.
Ta odpowiedź jest dobrym przykładem typowej mentalności społeczności Python: zamiast naprawiać problemy z wydajnością, woleliby po prostu pisać swój kod poza Pythonem.
Patrzyłem na PyPy i IronPython, które oba twierdzą, że zyskują prędkość. PyPy Nie rozumiem, w jaki sposób implementacja Pythona napisana w Pythonie, języku interpretowanym, będzie szybsza niż implementacja referencyjna w C.
Po pierwsze: nie ma znaczenia, w jakim języku jest napisany kompilator. W końcu kompilator jest uruchamiany tylko raz , więc nawet jeśli był powolny, to nie ma znaczenia: wydajność kompilatora nie ma znaczenia, co jest istotne to wydajność danych wyjściowych kompilatora.
Po drugie, ponieważ ma znaczenie tylko to, jak szybkie jest wyjście kompilatora, a kompilator jest napisany w Pythonie, tj. Języku, który kompiluje, może się sam szybko skompilować.
Po trzecie, nie ma czegoś takiego jak „język interpretowany”. Język to zbiór zasad i ograniczeń matematycznych. To specyfikacja. Kartka papieru. Język nie jest kompilowany ani interpretowany. Po prostu jest język . Kompilacja i interpretacja są cechami implementacji języka , a dokładniej kompilatora lub tłumacza (duh!), A nie języka. Każdy język może być implementowany przez kompilator. Tłumacz może zaimplementować każdy język. Możesz mechanicznie wygenerować kompilator z interpretera i interpretera z kompilatora.
Ale to wszystko tak naprawdę nie ma znaczenia, ponieważ PyPy nie jest napisane w Pythonie. Jest napisany w RPython . RPython składa się z dwóch części: języka programowania RPython i frameworku RPython.
Językiem programowania RPython nie jest Python. To inny język programowania. RPython jest statycznym typem języka programowania, mniej więcej na tym samym poziomie abstrakcji co Java, z mniej więcej taką samą wydajnością jak C. RPython jest składniowym i semantycznym podzbiorem Pythona, co oznacza, że każdy program RPython jest prawidłowym programem w Pythonie i może być uruchamiany przez implementację Pythona (choć zwykle kilka rzędów wielkości wolniej, ale nadal jest to przydatne do debugowania, ponieważ masz dostęp do wszystkich narzędzi Pythona, a tłumaczenie rozpoczyna się od razu, podczas gdy kompilacja implementacji języka zwykle zajmuje około 5-10 minut ), ale odwrotność nie jest prawdą.
Framework RPython jest strukturą do pisania wysokowydajnych implementacji dynamicznego języka w języku programowania RPython. Obejmuje moduł wyrzucania elementów bezużytecznych, przestrzeń obiektową, protokół metaobiektu, predefiniowane obiekty, typy i operacje itd. Klejnotem koronnym jest jego zdolność do automatycznego generowania kompilatora JIT z interpretera: jeśli zaimplementujesz język w frameworku RPython, wystarczy napisać interpreter, frameworkiem RPython zajmie się JIT.
Istnieje wiele implementacji językowych na platformie RPython , nie tylko PyPy.
IronPython, ten sam pomysł, ale nie widzę, jak .NET Framework zwiększy prędkość.
Większość implementacji interfejsu wiersza polecenia ISO, takich jak różne warianty .NET firmy Microsoft lub Mono, zawierają zaawansowane moduły zbierające śmieci, optymalizatory i kompilatory. To samo dotyczy implementacji Jython i Java.
IronPython jest kompilatorem, kompiluje kod źródłowy Pythona do drzew DLR (DLR to Dynamic Language Runtime), które są następnie kompilowane do kodu bajtowego CIL, który następnie jest zwykle dalej kompilowany do natywnego kodu maszynowego.