Komentáře k článku
SquirrelFish: reprezentace hodnot JavaScriptu a virtuální stroj

Tímto dílem začínáme část seriálu o implementacích JavaScriptu, která se bude věnovat vnitřnostem konkrétních implementací. Začneme s popisem vybraných částí interpretu SquirrelFish – podíváme se, jak se v něm reprezentují hodnoty javascriptových proměnných a jak je navržen jeho virtuální stroj a bajtkód.
pochvala a dotaz na reprezentaci hodnot
Pochvala: paradni serial, vazne
Dotaz: nevite nekdo, jak reprezenruje hodnoty V8? Koukal jsem do zdrojaku, ale vycist se mi to nepodarilo
Re: pochvala a dotaz na reprezentaci hodnot
pochvala +1
Re: pochvala a dotaz na reprezentaci hodnot
Děkuji za pochvalu.
K reprezentace hodnot ve V8 se dostaneme při popisu tohoto interpretu, na který dojde prevděpodobně někdy v lednu.
RE: SquirrelFish: reprezentace hodnot JavaScriptu a virtuální stroj
Dekuji za hezky clanek. Uvital bych, kdybyste napsal clanek, v kterem byste vysvetlil, jak funguje uvnit interpret pythonu, dekuji.
RE: SquirrelFish: reprezentace hodnot JavaScriptu a virtuální stroj
S autorem seriálu jsme dohodnuti pouze na interpretech JavaScriptu. Čímž nevylučuji, že bychom někdy v budoucnu na Zdrojáku nemohli něco podobného napsat i o Pythonu.
RE: SquirrelFish: reprezentace hodnot JavaScriptu a virtuální stroj
Pythonu bohužel nerozumím do takové hloubky, abych si o něm troufnul cokoliv psát, natož pak popisovat jeho interpret.
rozdiel
Mna by zaujimal rozdiel v praci s tymito premennymi:
var str1 = new String("smt1");
var str2 = "smt2";
Re: rozdiel
Opdovídám trochu pozdě, ale přece…
Tato konstrukce vytvoří objekt (hodnotu typu
Object), jehož prototyp bude rovenString.prototype. Tento objekt je zapouzdřením řetězce do objektu, samotnou hodnotu řetězce bude mít uložen ve svém interním atributu. Interně bude tento objekt reprezentován odkazem na instanci třídyStringObject, v jejímž atributum_internalValuebude odkaz na instanci třídyJSStringreprezentující hodnotu řetězce. Při následném přiřazení se odkaz naStringObjectumístí do tabulky lokálních proměnných na místo indexovanéstr1.Tato konstrukce vytvoří hodnotu (nikoliv objekt!) typu
String, jejíž obsahem bude"smt2". Interně bude tato hodnota reprezentována odkazem na instanci třídyJSString, v jejímž atributum_valuebude uložen samotný řetězec. Při následném přiřazení se odkaz naJSStringumístí do tabulky lokálních proměnných na místo indexovanéstr2.Pokud bych to měl celé shrnout: Ve druhém případě vytváříme (v javovské terminologii) primitivní hodnotu, zatímco v prvním případě wrapper okolo ní. Interně to zanemná přidání jedné úrovně tříd a ukazatelů navíc.
Re: rozdiel
Takze som dobre pochopil, ze druhy sposob je rychlejsi. Potom vsak nevidim dovod pouzivat prvy sposob okrem pripadov, kedy je potrebne predefinovat/pridat nejake metody na triede String.
Re: rozdiel
Ono to není potřeba používat v podstatě nikdy, protože v situaci, kdy se s řetězcovou hodnotou zachází jako s objektem, dojde k automatické konverzi této hodnoty na objekt (jakoby se obalí voláním
new String(...)).Re: rozdiel
S tym uplne nemozem suhlasit napr. "test".prototype.alert=alert alebo ako ste to inak mysleli?
Re: rozdiel
Volat
prototypepřímo na hodnotě řetězce nemá smysl, protože výsledek budeundefined(vlastnostprototypemají definovanou pouze funkce).Myslel jsem to takto:
zásobník vs. registry
Pěkný článek, gratuluji!
Ten pomalý a stále více znatelný příklon spíše k registrovým VM (začalo to Parrotem, později Lua atd.) je také způsobený tím, že prakticky všechny moderní procesorové platformy jsou založené na registrech, takže se hoodně investovalo do kvalitních překladačů pro registrové mikroprocesory (a mnoho věcí z překladačů se dá použít při JIT kompilaci). Posun v oblasti zásobníkových strojů je poměrně malý, sice pár odborných článků na toto téma vyšlo (EuroForth apod.), ale oproti mainstreamu to je slabší, což je IMHO škoda.
Mimochodem, například Javovský VM (JVM) se sice tváří, že je zásobníkový, ale jen pro vyhodnocování výrazů. Předávání parametrů je přes standardní rámce, což je odklon od klasického "dvouzásobníkového" VM, který například používá Forth.
Datové typy
Pokud vím, tak
nullnení základní datový typ a je reprezentován objektem. Ve výčtu naopak chybí datový typfunction. Možná to má SquirrelFish jinak, ale v článku je to napsáno jako kdyby to platilo pro celý JavaScript.Re: Datové typy
Podle specifikace ECMA-262 (konkrétně podle úvodu kapitoly 8) je to skutečně tak, jak píšu:
Jiná věc je, co vrací operátor
typeof. A zde je pravda, že pro typNullvrací"object"a pro funkce vrací"function", byť jsou to formálně hodnoty typuObject. Toto chování je specifikováno v ECMA-262 v odstavci 11.4.3.Při popisu jazyka obecně vycházím ze specifikace ECMAScriptu, ne z konkrétních implementací a jejich reprezentací. Ve chvíli, kdy v sérii článků píšu o více implementacích, není myslím jiný přístup schůdný.