Komentáře k článku
Do hlubin implementací JavaScriptu: 2. díl – dynamičnost a výkon

Ve druhém dílu seriálu o implementacích JavaScriptu se podíváme na to, proč není snadné JavaScript rychle interpretovat, a které vlastnosti tohoto jazyka mají největší negativní vliv na jeho výkon. Zaměříme se přitom na problémy způsobené jeho dynamičností.
properties objektu v dynamických jazykoch
"u metod ale hledání vadí obecně více, protože je často nutné prohledávat tabulek víc"
Naozaj? Vrámci objektu je možné pristupovať aj k vlastnostiam, ktoré sú súčasťou objektov prototype – a to s použitím kľúčového slova this. Situácia sa mení keď sa použije priradenie cez this a táto nová hodnota sa uloží do daného objektu a nie do niektorého nadradeného prototypu.
Re: properties objektu v dynamických jazykoch
Asi to není z textu úplně jasné, ale slůvkem obecně jsem chtěl naznačit, že popisuju situaci obvyklou v „běžných“ dynamických jazycích, tj. založených na třídách. Máte pravdu, že v JavaScriptu je to díky prototypům jinak – píšu o tom o odstavec níže.
Re: properties objektu v dynamických jazykoch
Ale ani tak to přece neplatí. V Pythonu například (je to "bežný" dynamický jazyk?) napíšu-li `a.i', může jít o atribut instance a, nebo o atribut její třídy, nebo o atribut nadtřídy, …
Re: properties objektu v dynamických jazykoch
To by mě nenapadlo, že Python míchá syntaxi pro atributy instancí a tříd.
Vycházel jsem ze svých znalostí Ruby a PHP, kde opravdu existuje jen jedna tabulka instančních atribůtů, která se prohledává.
C#?
U statických jazyků jako je třeba C++, Java nebo C# je seznam metod třídy pevně určen před samotným spuštěním programu (při kompilaci)
v tom pripade c# neni staticky jazyk, neb pomoci reflection.emit a extensions umi pridavat/menit uz stavajici zkompilovane metody, klidne i za behu.
Re: C#?
v tom pripade c# neni staticky jazyk, neb pomoci reflection.emit a extensions umi pridavat/menit uz stavajici zkompilovane metody, klidne i za behu.
Pokud vím, tak extension methods by na statičnosti nic měnit neměly – budou pravděpodobně vevnitř fungovat podobně jako nevirtuální metody.
O
Reflection.Emitprakticky nic nevím, takže je možné, že nějakým způsobem statičnost jazyka narušuje.C# znám jen zběžně, takže pokud mě zde někdo opraví/doplní, budu rád.
Re: C#?
> O Reflection.Emit prakticky nic nevím, takže je možné, že nějakým způsobem statičnost jazyka narušuje.
Narušuje, nenarušuje, v .NETu (a v Javě taky) prostě lze generovat kód za běhu aplikace, taky ho hned zavádět a vykonávat (na tomhle principu např. funguje obvyklý způsob integrace skriptů v Groovy do programů v Javě). Jak moc to mění nebo nemění "statičnost" jazyka je otázka interpretace, každopádně to má docela zajímavý vliv na optimalizace prováděné virtuálním strojem :-)
Re: C#?
Ref.Emit neumi manipulovat s existujicimi typy, takze na staticnosti nic nemeni. Stale plati, ze ve chvili, kdy se JITtuje metoda, je k dispozici plna typova informace. Podobne jako na staticnosti C nic nemeni to, ze si muzu do kusu pameti nagenerovat instrukce a pres function pointer je zavolat.
Ani feature nazyvana "Edit & Continue", ktera umoznuje delat jiste zmeny behem debuggovani bez nutnosti restartovat program, nepovoli nic nebezpecneho jako napr. pridani fieldu do typu.
Re: C#?
Říkal jsem si, že tak nějak to musí být, nemá-li se zbořit svět :-)
Re: C#?
> Stale plati, ze ve chvili, kdy se JITtuje metoda, je k dispozici plna typova informace.
Záleží na tom, co myslíte "plnou typovou informací" :-) JIT například z principu nemůže znát úplnou hierarchii tříd. Se "statičností" jazyka jako takového to nemá nic moc společného, ale runtime musí být mnohem dynamičtější.
Re: C#?
JIT ma vsechny informace o tride, jejiz metodu JITtuje jakozto i vsech jejich base tridach. Autor v clanku naznacil, ze virtual dispatch je slaby odvarek a rozhodne nedela jazyk dynamickym – jestli to je to, na co narazite. Nicmene, pokud se napriklad pokusite udelat call na neexistujici metodu, dostanete vyjimku pri JITovani, zadny by-name resolution za run-time se konat nebude.