고급
내부 동작을 설명합니다. Phasis을 임베딩한다면 이 섹션은 건너뛰어도 됩니다. 엔진을 수정한다면 여기의 각 페이지를 반드시 확인하세요.
페이지
- 아키텍처 — 소스가 실행으로 바뀌는 과정: 렉서 → 파서 → AST → 바이트코드 컴파일 → 트리 워커 대체 경로를 갖춘 바이트코드 VM. 모듈 로더, realm, realm 경계로서의
Phasis\Engine의 역할을 다룹니다. - 바이트코드 VM — opcode 집합, 디스패치 루프, 인라인 캐시, 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는src/변경 시 WPT 및 인기 테스트 모음을 실행합니다. 전체 test262 매트릭스는 수동으로 시작하므로 영향을 받는 test262 카테고리를 로컬에서 표본 검사하세요. - Web API 항목을 추가할 때마다 WPT 픽스처를 추가하세요.
tests/Wpt/upstream/<area>/의.any.js를tests/Wpt/fixtures/<category>/에 넣으면 러너가 이를 자동으로 가져옵니다.