Переписали виртуальную машину на новый DSL
И теперь ее гораздо проще менять, оптимизировать и проводить эксперименты.
В качестве примера, можно посмотреть на попытку добавления register-based интерпретатора. Другой пример, что часто два опкода идут вместе и выполняются последовательно большую часть времени. Например, LOAD_CONST
и RETURN_VALUE
. Для оптимизации, можно добавить новый опкод этой операции. Вместо двух действий он будет выполнять одно. На частых задачах получится неплохая прибавка к производительности.
Еще один пример: опкод CALL_FUNCTION.
Сам по себе довольно медленный. У него есть целая семья оптимизаций, например специализация CALL_FUNCTION_ISINSTANCE
, когда мы выкидываем промежуточный слой и сразу вызываем C-реализацию isinstance
. Минус в том, что Python богатый и динамически типизированный язык. В runtime может что-то поменяться и мы получим замедление — придется сваливаться обратно на общий путь опкода CALL_FUNCTION
.