İçeriğe geç

İ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öylece self:: 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-all komutunu 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 öğesini tests/Wpt/fixtures/<category>/ içine bırakın; çalıştırıcı onu bulur.

Ayrıca bkz.