Към съдържанието

Разширено

Вътрешното устройство. Ако вграждате Phasis, можете да пропуснете този раздел. Ако променяте енджина, всяка страница тук е съществена.

Страници

  • Архитектура — как изходният код се превръща в изпълнение: лексер → парсер → AST → компилация до байткод → байткод VM с резервен обхождащ дървото интерпретатор. Зареждач на модули, realms и ролята на Phasis\Engine като граница на realm.
  • Байткод VM — набор от опкодове, цикъл на диспечиране, вградени кешове, бърз път за транспилиране на изходен код 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 реда, разделете го на trait файлове в съседна директория (src/BuiltIn/Temporal/, src/Runtime/Parts/ и т.н.), вместо да създавате нови класове — така справките self:: продължават да работят и се избягва нарушаването на повърхността API за частни методи.
  • Изпълнявайте bin/verify-all локално преди изпращане. Той изпълнява PHPStan, PHPCS, всички набори PHPUnit (unit, oracle, popular, wpt) и регресионните тестове на оракула. CI изпълнява WPT и популярните набори при промени в src/; пълната матрица test262 се стартира ръчно, затова локално изпълнявайте засегнатите категории test262.
  • Добавяйте WPT fixture за всяко допълнение към Web API. Поставете .any.js от tests/Wpt/upstream/<area>/ в tests/Wpt/fixtures/<category>/ и изпълнителят ще го открие.

Вижте също