Come possono essere usati i segni% negli identificatori

Navigando nell’albero v8 , sotto la directory src , c’erano alcuni file js, che fornivano alcuni oggetti JS di base come Math, Array ecc. Navigando in questi file, ho visto gli identificatori incluso un segno di percentuale (%) nel loro nome, cioè %Foo . Per prima cosa ho pensato ingenuamente che fosse un altro personaggio consentito negli identificatori di JS, ma quando l’ho provato in shell, mi ha urlato, dicendo che sto violando le regole di syntax. Ma se si tratta di un errore di syntax, come mai d8 funziona? Ecco un esempio dal codice sorgente attuale:

src / apinatives.js righe da 44 a 47, git clone da github / v8 / v8

 function Instantiate(data, name) { if (!%IsTemplate(data)) return data; var tag = %GetTemplateField(data, kApiTagOffset); switch (tag) { 

src / apinatives.js righe da 41 a 43, git clone da github / v8 / v8

 function SetConstructor() { if (%_IsConstructCall()) { %SetInitialize(this); 

Come mai questi identificatori non producono errori di syntax. Tutti i file js, inclusi math.js e string.js e tutti gli altri?: Wq

Non è un JavaScript tecnicamente valido. Queste sono chiamate alle funzioni di runtime V8. Da quella pagina:

Gran parte della libreria JavaScript è implementata nel codice JavaScript stesso, utilizzando un set minimo di funzioni di runtime C ++ richiamabili da JavaScript. Alcuni di questi sono chiamati usando nomi che iniziano con%, e usando il flag “–allow-natives-syntax”. Altri vengono chiamati solo dal codice generato dai generatori di codice e non sono visibili in JS, nemmeno usando la syntax%.

Se guardi in parser.cc puoi vedere del codice relativo a allow_natives_syntax che determina se il parser accetterà questa estensione al linguaggio JavaScript che V8 sta usando per interagire con il suo runtime. Questi file devono essere analizzati con quell’opzione abilitata.

Vorrei ipotizzare che V8 non ti permetta di effettuare queste chiamate di default sia perché sarebbe in contraddizione con lo standard JavaScript e perché probabilmente ti permetterebbe di fare cose al runtime che non dovresti essere in grado di fare.