Дополнительно
Внутреннее устройство. Если вы встраиваете Phasis, этот раздел можно пропустить. Если вы меняете движок, каждая страница здесь важна для работы.
Страницы
- Архитектура — как исходный код превращается в исполняемый: лексер → парсер → AST → компиляция в байткод → виртуальная машина байткода с обходом дерева в качестве резервного варианта. Загрузчик модулей, окружения и роль
Phasis\Engineкак границы окружения. - Виртуальная машина байткода — набор опкодов, цикл диспетчеризации, встроенные кэши, быстрый путь транспилятора исходного кода JsToPhp, эвристика canSkipEnvAlloc для формы функции, а также случаи, когда вызовы обрабатываются через байткод, а когда — обходом дерева.
- Тесты производительности — текущие показатели
bench/, как их интерпретировать, почему ~100× V8 — это предел установившейся производительности обхода дерева и что поможет сократить разрыв. - Тестирование — модель эталонов. Каждое изменение проверяется по трём независимым эталонам: Node.js (V8 — достоверный источник сведений о спецификации), test262 и набору проверок побайтного равенства для популярных библиотек.
Правила участия в разработке
- Не меняйте ядро движка без веской причины. Всё в
src/Runtime/,src/Bytecode/,src/Lexer/,src/Parser/иsrc/Regex/находится на критическом пути test262. Изменения без соответствующей проверки test262 чреваты регрессиями. Встроенные функции (src/BuiltIn/) безопаснее, поскольку отдельные тестовые наборы test262 для каждой из них локально выявляют ошибки. - Используйте трейты для организации кода, а не классы. Когда файл превышает примерно 2K строк, разделите его на файлы трейтов в соседнем каталоге (
src/BuiltIn/Temporal/,src/Runtime/Parts/и т. д.), вместо создания новых классов. Так сохраняются работающие запросыself::и не нарушается поверхность API приватных методов. - Перед отправкой изменений локально запускайте
bin/verify-all. Он запускает PHPStan, PHPCS, все наборы PHPUnit (unit, oracle, popular, wpt) и регрессионную проверку оракула. CI запускает наборы WPT и popular при изменениях вsrc/; полная матрица test262 запускается вручную, поэтому локально проверяйте затронутые категории test262. - Для каждого добавления Web API добавляйте тестовый пример WPT. Поместите
.any.jsизtests/Wpt/upstream/<area>/вtests/Wpt/fixtures/<category>/— и исполнитель тестов подхватит его.
См. также
- Совместимость — как измеряются результаты оракула.
- CLI reference —
bin/phasis,bin/test262,bin/wpt.