İleri Düzey
İç yapıya dair bilgiler. Phasis projenize gömüyorsanız bu bölümü atlayabilirsiniz. Motoru değiştiriyorsanız buradaki her sayfa kritik önemdedir.
Sayfalar
- Mimari — kaynak kodunun yürütmeye dönüşümü: lexer → parser → AST → bayt kodu derlemesi → ağaç yürüyücüsü yedekli bayt kodu VM'si. Modül yükleyicisi, realm'ler ve realm sınırı olarak
Phasis\Engine'ın rolü. - Bayt Kodu VM'si — işlem kodu kümesi, dağıtım döngüsü, satır içi önbellekler, JsToPhp kaynak kodu aktarım hızlı yolu, function-shape canSkipEnvAlloc sezgiseli, çağrıların bayt kodu yolunu mu yoksa ağaç yürüyücüsünü mü kullandığı.
- Kıyaslamalar — güncel
bench/sayıları, bunları yorumlama biçimi, ağaç yürüyücülerinde ~100× V8 değerinin neden kararlı durum üst sınırı olduğu ve aradaki farkı neyin kapatacağı. - Test — oracle modeli. Her değişiklik üç bağımsız oracle'a göre doğrulanır: Node.js (V8 belirtiminde doğru kabul edilen sonuç), test262 ve popüler kütüphanelerle bayt eşitliği sağlayan test paketi.
Katkıda bulunma kuralları
- Güçlü bir gerekçe olmadan çekirdek motora dokunmayın.
src/Runtime/,src/Bytecode/,src/Lexer/,src/Parser/,src/Regex/altındaki her şey test262 kritik yolundadır. İlgili bir test262 doğrulaması olmadan bunlara dokunmak gerilemelere davetiye çıkarır. Yerleşikler (src/BuiltIn/) daha güvenlidir; çünkü her yerleşiğin test262 alt test paketleri bozulmaları kendi içinde yakalar. - Sınıflar yerine düzenleme için trait'leri kullanın. Bir dosya yaklaşık 2K satırı aştığında yeni sınıflar oluşturmak yerine onu kardeş dizindeki trait dosyalarına (
src/BuiltIn/Temporal/,src/Runtime/Parts/vb.) ayırın — böyleceself::aramalarının çalışmasını sürdürür ve özel yöntem API yüzeyinin bozulmasını önlersiniz. - Göndermeden önce
bin/verify-allkomutunu yerel olarak çalıştırın. Bu komut PHPStan, PHPCS, tüm PHPUnit paketlerini (birim, oracle, popüler, wpt) ve oracle gerileme testini çalıştırır. CI,src/değişikliklerinde WPT ve popüler test paketlerini çalıştırır; test262 matrisinin tamamı elle başlatılır, bu nedenle etkilenen test262 kategorilerini yerel olarak örnekleyin. - Her Web API eklemesi için bir WPT fikstürü ekleyin.
tests/Wpt/upstream/<area>/konumundaki.any.jsöğesinitests/Wpt/fixtures/<category>/içine bırakın; çalıştırıcı onu bulur.
Ayrıca bkz.
- Uyumluluk — oracle çıktılarının nasıl ölçüldüğü.
- CLI başvurusu —
bin/phasis,bin/test262,bin/wpt.