Για προχωρημένους
Τα εσωτερικά της μηχανής. Αν ενσωματώνετε το Phasis, μπορείτε να παραλείψετε αυτή την ενότητα. Αν τροποποιείτε τη μηχανή, κάθε σελίδα εδώ είναι θεμελιώδης.
Σελίδες
- Αρχιτεκτονική — πώς ο πηγαίος κώδικας γίνεται εκτέλεση: lexer → parser → AST → μεταγλώττιση bytecode → VM bytecode με εφεδρικό περιπατητή δέντρου. Φορτωτής μονάδων, realms και ο ρόλος του
Phasis\Engineως ορίου realm. - VM bytecode — σύνολο opcode, βρόχος αποστολής, inline caches, η γρήγορη διαδρομή transpiler πηγαίου κώδικα JsToPhp, το heuristic canSkipEnvAlloc για σχήματα συναρτήσεων και πότε οι κλήσεις ακολουθούν τη διαδρομή bytecode ή τον περιπατητή δέντρου.
- Συγκριτικές μετρήσεις — οι τρέχουσες μετρήσεις
bench/, πώς να τις ερμηνεύετε, γιατί περίπου 100× V8 είναι το όριο σταθερής κατάστασης για περιπατητές δέντρου και τι θα μείωνε τη διαφορά. - Δοκιμές — το μοντέλο oracle. Κάθε αλλαγή επαληθεύεται με τρία ανεξάρτητα oracle: Node.js (το βασικό κείμενο της προδιαγραφής V8), test262 και τη σουίτα ισότητας byte δημοφιλών βιβλιοθηκών.
Συμβάσεις συνεισφοράς
- Μην αγγίζετε τον βασικό πυρήνα της μηχανής χωρίς σοβαρό λόγο. Ό,τι βρίσκεται στα
src/Runtime/,src/Bytecode/,src/Lexer/,src/Parser/,src/Regex/είναι στην κρίσιμη διαδρομή του test262. Η αλλαγή τους χωρίς αντίστοιχη επαλήθευση test262 μπορεί να προκαλέσει παλινδρομήσεις. Τα ενσωματωμένα στοιχεία (src/BuiltIn/) είναι ασφαλέστερα, καθώς οι επιμέρους σουίτες test262 για κάθε ενσωματωμένο στοιχείο εντοπίζουν τοπικά τα προβλήματα. - Χρησιμοποιείτε traits για οργάνωση, όχι κλάσεις. Όταν ένα αρχείο ξεπερνά περίπου τις 2K γραμμές, χωρίστε το σε αρχεία trait σε έναν γειτονικό κατάλογο (
src/BuiltIn/Temporal/,src/Runtime/Parts/κ.λπ.) αντί να δημιουργείτε νέες κλάσεις — έτσι συνεχίζουν να λειτουργούν οι αναζητήσειςself::και αποφεύγεται η διατάραξη της επιφάνειας API ιδιωτικών μεθόδων. - Εκτελείτε το
bin/verify-allτοπικά πριν από την προώθηση αλλαγών. Εκτελεί τα PHPStan, PHPCS, όλες τις σουίτες PHPUnit (unit, oracle, popular, wpt) και τη δοκιμή παλινδρόμησης oracle. Το CI εκτελεί τις σουίτες WPT και popular σε αλλαγές τουsrc/· ο πλήρης πίνακας test262 εκκινείται χειροκίνητα, οπότε εκτελείτε τοπικά δείγμα από τις επηρεαζόμενες κατηγορίες test262. - Για κάθε προσθήκη Web API, προσθέτετε ένα fixture WPT. Βάλτε το
.any.jsαπό τοtests/Wpt/upstream/<area>/στοtests/Wpt/fixtures/<category>/και ο runner θα το εντοπίσει.
Δείτε επίσης
- Συμβατότητα — πώς μετρώνται τα αποτελέσματα oracle.
- Αναφορά CLI —
bin/phasis,bin/test262,bin/wpt.