Názory k článku
SquirrelFish: reprezentace hodnot JavaScriptu a virtuální stroj
pochvala a dotaz na reprezentaci hodnot
celé vláknoDotaz: nevite nekdo, jak reprezenruje hodnoty V8? Koukal jsem do zdrojaku, ale vycist se mi to nepodarilo
Re: pochvala a dotaz na reprezentaci hodnot
celé vláknoRe: pochvala a dotaz na reprezentaci hodnot
celé vláknoK 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
celé vláknoRE: SquirrelFish: reprezentace hodnot JavaScriptu a virtuální stroj
celé vláknoRE: SquirrelFish: reprezentace hodnot JavaScriptu a virtuální stroj
celé vláknorozdiel
celé vlákno
var str1 = new String("smt1");
var str2 = "smt2";
Re: rozdiel
celé vláknoOpdovídám trochu pozdě, ale přece...
var str1 = new String("smt1");
Tato konstrukce vytvoří objekt (hodnotu typu Object), jehož prototyp bude roven String.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řídy StringObject, v jejímž atributu m_internalValue bude odkaz na instanci třídy JSString reprezentující hodnotu řetězce. Při následném přiřazení se odkaz na StringObject umístí do tabulky lokálních proměnných na místo indexované str1.
var str2 = "smt2";
Tato konstrukce vytvoří hodnotu (nikoliv objekt!) typu String, jejíž obsahem bude "smt2". Interně bude tato hodnota reprezentována odkazem na instanci třídy JSString, v jejímž atributu m_value bude uložen samotný řetězec. Při následném přiřazení se odkaz na JSString umí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
celé vláknoRe: rozdiel
celé vláknoOno 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
celé vláknoRe: rozdiel
celé vláknoVolat prototype přímo na hodnotě řetězce nemá smysl, protože výsledek bude undefined (vlastnost prototype mají definovanou pouze funkce).
Myslel jsem to takto:
alert("abcd".toUpperCase() == new String("abcd").toUpperCase()); // vypíše "true"
zásobník vs. registry
celé vláknoTen 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
celé vláknonull není základní datový typ a je reprezentován objektem. Ve výčtu naopak chybí datový typ function. Možná to má SquirrelFish jinak, ale v článku je to napsáno jako kdyby to platilo pro celý JavaScript.
Re: Datové typy
celé vláknoPodle specifikace ECMA-262 (konkrétně podle úvodu kapitoly 8) je to skutečně tak, jak píšu:
A value is an entity that takes on one of nine types. There are nine types (Undefined, Null, Boolean, String, Number, Object, Reference, List, and Completion). Values of type Reference, List, and Completion are used only as intermediate results of expression evaluation and cannot be stored as properties of objects.
Jiná věc je, co vrací operátor typeof. A zde je pravda, že pro typ Null vrací "object" a pro funkce vrací "function", byť jsou to formálně hodnoty typu Object. 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ý.