
# Avanzado

Los detalles internos. Si va a integrar Phasis, puede saltarse esta sección. Si va a modificar el motor, todas las páginas de aquí son fundamentales.

## Páginas

- **[Arquitectura](https://phasis.inline0.dev/es/docs/advanced/architecture)** — cómo el código fuente se convierte en ejecución: lexer → analizador sintáctico → AST → compilación de bytecode → VM de bytecode con recorrido del árbol como alternativa. Cargador de módulos, realms y el papel de `Phasis\Engine` como límite del realm.
- **[VM de bytecode](https://phasis.inline0.dev/es/docs/advanced/bytecode-vm)** — conjunto de opcodes, bucle de despacho, cachés en línea, ruta rápida de transpilación de código fuente JsToPhp, heurística canSkipEnvAlloc de forma de función y cuándo las llamadas siguen la ruta de bytecode o el recorrido del árbol.
- **[Pruebas de rendimiento](https://phasis.inline0.dev/es/docs/advanced/benchmarks)** — resultados actuales de `bench/`, cómo interpretarlos, por qué ~100× V8 es el límite estable para los recorridos del árbol y qué permitiría reducir la diferencia.
- **[Pruebas](https://phasis.inline0.dev/es/docs/advanced/testing)** — el modelo de oráculo. Cada cambio se verifica con tres oráculos independientes: Node.js (referencia normativa de V8), test262 y la suite de igualdad de bytes de bibliotecas populares.

## Convenciones para contribuir

- **No modifique el motor central sin un motivo de peso.** Todo lo que está bajo `src/Runtime/`, `src/Bytecode/`, `src/Lexer/`, `src/Parser/`, `src/Regex/` forma parte de la ruta crítica de test262. Modificarlo sin la verificación correspondiente de test262 es una receta para introducir regresiones. Las funciones integradas (`src/BuiltIn/`) son más seguras porque las subsuites de test262 para cada función integrada detectan localmente los fallos.
- **Use traits para organizar el código, no clases.** Cuando un archivo supere unas 2K líneas, divídalo en archivos trait dentro de un directorio hermano (`src/BuiltIn/Temporal/`, `src/Runtime/Parts/`, etc.) en lugar de crear nuevas clases; así se mantienen las búsquedas de `self::` y se evita romper la superficie de API de métodos privados.
- **Ejecute `bin/verify-all` localmente antes de enviar cambios.** Ejecuta PHPStan, PHPCS, todas las suites de PHPUnit (unitarias, oracle, popular y wpt) y la regresión del oráculo. CI ejecuta las suites WPT y popular cuando hay cambios en `src/`; la matriz completa de test262 se inicia manualmente, así que pruebe localmente las categorías de test262 afectadas.
- **Añada una fixture WPT por cada incorporación a Web API.** Coloque la `.any.js` de `tests/Wpt/upstream/<area>/` en `tests/Wpt/fixtures/<category>/` y el ejecutor la detectará.

## Véase también

- [Compatibilidad](https://phasis.inline0.dev/es/docs/compatibility) — cómo se miden los resultados del oráculo.
- [Referencia de CLI](https://phasis.inline0.dev/es/docs/cli) — `bin/phasis`, `bin/test262`, `bin/wpt`.
