2013-02-13 13 views
6

Przeglądając drzewo v8, pod katalogiem , niektóre pliki js tam były, dostarczając podstawowych obiektów JS takich jak Math, Array itd. Przeglądając te pliki, widziałem identyfikatory zawierające znak procentu (%) w ich nazwach, tj. %Foo. Najpierw naiwnie pomyślałem, że to jakaś inna dozwolona postać w identyfikatorach JS, ale kiedy wypróbowałem ją w powłoce, krzyknęła na mnie, mówiąc, że łamie zasady składni. Ale jeśli jest to błąd składniowy, dlaczego działa d8? Oto przykład z rzeczywistego kodu źródłowego:W jaki sposób używać znaków% w identyfikatorach

linie src/apinatives.js 44 do 47, git clone z GitHub linii/V8/v8

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

src/apinatives.js 41 do 43 clone git z github/V8/v8

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

Jak to się stało identyfikatory nie dają błędy składniowe. Wszystkie pliki js, w tym math.js i string.js i wszystkie inne?: Wq

+1

'%' jest [operator modulus] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Arithmetic_Operators); to * testowanie czegoś *, chociaż nie jestem pewien co. –

+1

@DavidThomas Jak to się stało '!% IsTemplate (dane)' –

+0

To, co robi, zależy od tego, co jest zwracane z 'IsTemplate (dane)'. –

Odpowiedz

15

To nie jest technicznie poprawny JavaScript. Są to połączenia z V8 runtime functions. Od tej strony:

Wiele z biblioteki JavaScript jest realizowany w kodzie JavaScript sama, stosując minimalny zestaw funkcji C++ runtime, płatnych na żądanie od JavaScript. Niektóre z nich są nazywane za pomocą nazw zaczynających się od%, i za pomocą flagi "--allow-native-syntax". Inne są wywoływane tylko przez kod wygenerowany przez generatory kodów i nie są widoczne w JS, nawet przy użyciu składni%.

Jeśli spojrzeć w parser.cc widać jakiś kod odnoszący się do allow_natives_syntax która określa, czy parser zaakceptuje to rozszerzenie do języka JavaScript, który V8 używa do interakcji z jej wykonywania. Te pliki muszą zostać przeanalizowane przy włączonej tej opcji.

Spekulowałbym, że V8 nie zezwala na wykonywanie tych połączeń domyślnie, ponieważ byłoby to sprzeczne ze standardem JavaScript i ponieważ prawdopodobnie pozwoliłoby ci na robienie rzeczy w środowisku wykonawczym, czego nie powinno się robić.

+0

Wielkie dzięki za jasną odpowiedź! –

-1

Możesz mieć pewność, że używanie "%" w javascript nie może być używane jako operator jednoargumentowy, ani też nie może być używane jako znak nazwa zmiennej lub nazwa funkcji. "%" może być użyty TYLKO jako operator modulusa w javascriptu, chyba że jest ujęty w cudzysłów.

Wygląda na to, że silnik javascript google v8 wstępnie przetwarza pliki javascript, prawdopodobnie składnia% functionName() jest makrem, którego używa się do wstępnego przetwarzania plików javascript, zanim zostanie wykonany przez silnik javascript, chociaż ja ' nie bardzo wiem, dlaczego Google ma pliki javascript w bazie kodu silnika javascript, która używa C++ do kompilacji binarnej.

+1

Znalazłem "js2c.py' pod katalogiem narzędzi w drzewie źródłowym. Program ma wykonać następujące czynności (w komentarzu do kodu w odpowiednim pliku):> Jest to narzędzie do konwersji kodu źródłowego JavaScript na tablice znaków w stylu C. Jest używany do osadzonego kodu JavaSCript w bibliotece V8. –

+1

'%' jest operatorem [pozostałym] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Remainder), a nie [operator modulo] (http://wiki.ecmascript.org/doku.php?id=strawman:modulo_operator). Małe, ale ważne rozróżnienie. –

Powiązane problemy