Разширено
Вътрешното устройство. Ако вграждате 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>/и изпълнителят ще го открие.
Вижте също
- Съвместимост — как се измерват изходните резултати на оракула.
- Справка за CLI —
bin/phasis,bin/test262,bin/wpt.