Как реализация языка на одном языке может быть быстрее, чем язык? - PullRequest
5 голосов
/ 21 февраля 2012

Если я, например, создаю JVM в Java , возможно ли сделать реализацию, которую я сделал, на самом деле быстрее , чем исходная реализация , которую я использовал для построить эту реализацию, даже если моя реализация построена поверх исходной реализации и может даже зависеть от этой реализации?

(Смущает ...)

Посмотрите на PyPy . Это JIT-компилятор для Python, сделанный на Python. Это нормально, но как он может претендовать на быстрее , чем оригинальная реализация Python, от которой он зависит и зависит?

Ответы [ 5 ]

10 голосов
/ 21 февраля 2012

Вы путаетесь между языком и исполнительным аппаратом для этого языка.

Одна из причин, по которой PyPy может работать быстрее, чем CPython, заключается в том, что PyPy скомпилирован в совершенно отдельный собственный исполняемый файл и не зависит от CPython и не выполняется в нем.

Тем не менее, неэффективная реализация одного языка может быть превзойдена интерпретатором, написанным на том же языке, и размещена в неэффективном интерпретаторе, если интерпретатор более высокого уровня использует более эффективные стратегии выполнения.

7 голосов
/ 21 февраля 2012

Абсолютно, это возможно. Ваша реализация JVM может компилировать байт-коды Java для оптимизированного машинного кода. Если ваш оптимизатор был более изощренным, чем в реализации JVM, на которой вы запускаете свой компилятор Java, то конечный результат мог бы быть быстрее.

В этом случае вы можете запустить свой компилятор Java с его собственным исходным кодом , и с этого момента получить более высокую скорость компиляции.

Вы сказали, что PyPy - это JIT-компилятор для Python (я сам с ним не знаком). Если это так, то он преобразует программу Python в машинный код, а затем запускает машинный код. Другой автор сказал, что компилятор PyPy работает как отдельный исполняемый файл, отдельный от CPython. Но даже если бы он запускался на CPython, когда ваша программа JIT-разобрана с машинным кодом и скомпилированный машинный код запущен, производительность компилятора больше не имеет значения. Скорость компилятора влияет только на время запуска.

2 голосов
/ 16 апреля 2012

PyPy - это не интерпретатор Python, реализованный в Python, это интерпретатор и компилятор Python, реализованный в RPython , который является ограниченным статически типизированным подмножеством Python:

RPython являетсяограниченное подмножество Python, которое поддается статическому анализу.Хотя есть некоторые дополнения к языку и некоторые вещи могут удивительно работать, это грубый список ограничений, которые следует учитывать.Обратите внимание, что существует множество особых ограничений в регистре, с которыми вы столкнетесь по ходу работы.

Реальная разница в скорости обусловлена ​​тем, что в отличие от CPython, который интерпретирует всю программу как байт-код, PyPy использует JIT-компиляция (в машинный код) для частей RPython.

1 голос
/ 23 февраля 2012

Я не думаю, что возможно реализовать интерпретатор для языка на этом языке (назовите это A), затем запустить его поверх другого существующего переводчика (назовите это B) для этого языка и выполнить программу (назовите этоP), и P, работающий на (A, работающий на B), будет быстрее, чем P, работающий на B.

Каждая операция A должна быть реализована по крайней мере с одной операцией B. Так что даже еслиB ужасно плох, а A оптимально хорош, тот факт, что A запускается на B, означает, что вредность B замедлится A.

Можно было бы реализовать интерпретатор + JIT-компилятор для языка всам язык, где JIT-компилятор создает некоторый другой более быстрый код во время выполнения, и P, работающий на (A, работающий на B), будет быстрее, чем P, работающий на B. Часть времени выполнения P, которая не скомпилирована JIT, будет медленнее ( намного медленнее, обычно), но если JIT-компилятор успешно идентифицирует "горячие" части P и выполняет их быстрее, чем Bru В целом вся система может работать быстрее.

Но это не очень интересно.Также возможно реализовать компилятор для языка на этом языке (C), скомпилировать его с помощью существующего компилятора (D) и заставить новый язык компилятора создавать код, который работает быстрее, чем исходный компилятор.Я надеюсь, что это не пугает вас;должно быть ясно, что скорость кода, испускаемого D, будет влиять только на время выполнения C, а не на время выполнения других программ, скомпилированных с C.

Написание компиляторов на языках, которые они компилируютэто было сделано в течение десятилетий (например, GCC написан на C) и не имеет никакого отношения к реальному вопросу, который, я думаю, вы задаете;JIT-компиляция также не использует язык сам по себе.В обоих случаях основное исполнение - это нечто иное, чем язык, который вы рассматриваете;обычно это машинный код.

Однако источником вашего вопроса является заблуждение.Python интерпретатор Python на самом деле не реализован в Python.Проект PyPy имеет интерпретатор для Python, написанный на RPython .RPython является подмножеством Python, выбранным так, чтобы его можно было эффективно компилировать в машинный код;как язык RPython намного больше похож на Java с выводом типа и отступом блоков вместо фигурных скобок.Проект PyPy также имеет компилятор для RPython, который написан на Python, и способен (в основном) автоматически добавлять JIT-компилятор в любой интерпретатор , который он компилирует.

Когда вы на самом делеиспользуя в работе интерпретатор PyPy, вы используете интерпретатор машинного кода, скомпилированный из исходных текстов RPython, так же, как при использовании интерпретатора CPython вы используете интерпретатор машинного кода, скомпилированный из исходного кода C.Если вы выполняете интерпретатор PyPy поверх другого интерпретатора Python (что можно сделать, потому что действительный код RPython также является допустимым кодом Python; но не наоборот), он будет работать намного медленнее, чем интерпретатор CPython.

0 голосов
/ 25 февраля 2012

Процесс перевода pypy выполняется на CPython, но на выходе получается список файлов .c (19 файлов в прошлый раз, когда я проверял), которые затем компилируются в двоичный файл: pypy-c. Во время выполнения pypy-c не имеет никакого отношения к CPython, поэтому он может быть быстрее.

...