Názory k článku
SpiderMonkey: rychlá kompilace JavaScriptu do nativního kódu
Trochu offtopic
celé vláknoNení to zbytečné?
celé vláknoRe: Není to zbytečné?
celé vláknoCo se tyce "poradneho" jazyka na psani webu - myslim ze jednodusi bude nejaka uprava v budoucnu (at uz treba ke kvalitni podpore OO, zahozeni problematickych casti nebo i jinak) nez jeho kompletni zahozeni...
Re: Není to zbytečné?
celé vláknoMám několik poznámek:
- Toho času a lidí "spotřebovaných" na optimalizaci interpretace JavaScriptu není zas tolik. Jedná se v zásadě o 5 týmů (Mozilla, Apple, Opera, Google, Microsoft) po méně než 10 lidech. Optimalizací interpretů/kompilátorů jiných jazyků, včetně těch navržených pro efektivní běh (C, C++, Java, C# aj.), se strávilo o několik řádů více člověkohodin.
- Přijde mi správné jazyka navrhovat primárně tak, aby šetřil čas programátorovi, ne stroji. Reálně je totiž aplikací, pro které bude výkon jazyka omezující, menšina. V případě JavaScriptu pak vůbec nikdo nečekal, že jazyk navržený na psaní malých skriptíků začnou lidi používat na mnohem složitější věci.
- JavaScript tu zůstane. Z praktického pohledu nemá smysl mudrovat na nějakým novým jazykem, protože není síla, která by ho prosadila. Stačí se podívat, jak dopadl ECMAScript 4, což byl "jen" pokus vylepšit stávající ECMAScript směrem, který ve svém komentáři naznačujete.
- Můžu vědět, které konkrétní "rysy ECMAScriptu, které dělají jeho interpretaci/kompilaci obtížnou" a které "žádný programátor hodný toho jména v životě nepoužije" máte na mysli? Mě osobně napadá asi jen možnost předefinovat metody u objektů, což může být potenciálně docela nebezpečné.
Re: Není to zbytečné?
celé vláknoRe: Není to zbytečné?
celé vláknoZ toho mi přijde opravdu relevantní pouze inspekce zásobníku spojená s prací s argumenty volajících funkcí. To jsem totiž opravdu nikdy neměl potřebu použít a nedovedu si v tuto chvíli představit, jaké rozumné využití by to mohlo mít kromě debuggingu. (Ale má fantazie je omezená :-)
Ostatní problematické oblasti zmiňované v článku (eval a with) mají své využití (byť omezené). Výkonnostní problémy způsobené příkazem with (zbrždění lookupu) jsou dány jeho podstatou. U eval lze diskutovat o tom, nakolik je nutné, aby uměl ovlivňovat své okolí, a zda by nebylo vhodnější, aby měl svůj vlastní scope. Myslím ale, že use-casy, kde je ovlivnění okolního scope nutné, by se našly.
zbytecnost
celé vláknoabsence typování a rychlost
celé vláknoVím že už to tu bylo v komentářích, ale pořád to nevidím - pokud vím (ať už ze statického typování, nebo z hintů pro kompilátor ala Lisp), že sčítám malá celá čísla a výsledek je rovněž malé celé číslo, můžu generovat jednu sčítací instrukci. Pokud to nevím, musím kontrolovat přetečení do bigintů, nebo riskovat že dostanu špatný výsledek. Pokud je toto v hlavní smyčce (nebo to nekontroluje HW jako údajně v Lisp Machine), rychlosti Cčka se nedosáhne. Jak tohle úskalí chtějí překonat?
Diky za clanek
celé vláknoRe: absence typování a rychlost
celé vláknoRe: absence typování a rychlost
celé vláknoNejdřív trochu šířeji: Při opakování tvrzení, že dynamické jazyky mohou být skoro stejně rychlé jako statické, mi jde především o to, abych vyvrátil poměrně zaběhnuté mýty, že musí být řádově pomalejší. Tyto mýty jsou založené na tom, že dynamický jazyk "musí" být interpretovaný, "musí" hledat metody a vlastnosti v hash tabulkách a že neznalost typů předem je "drahá".
Mýty jsou způsobeny tím, že když člověk dostane do ruky popis dynamického jazyka, přečte si ho a začne přemýšlet, jak by ho implementoval, napadnou ho jen naivní řešení všech možných problémů a z toho usoudí, že to celé musí být hrozně pomalé. Sám jsem tak kdysi uvažoval, takže si to dovedu představit. Tyto úvahy se pak šíří dál a jsou podpořeny i tím, že interprety běžných dynamických jazyků různé naivní techniky často používají a opravdu jsou typicky řádově pomalejší než jazyky statické.
Celým seriálem se jako červená nit vine myšlenka, že spoustu zdánlivých nedostatků dynamických jazyků z pohledu výkonu lze v mnoha běžných případech chytrou optimalizací téměř eliminovat, což se může zdát překvapivé. Když mluvím o "srovnatelné rychlosti s C", tak tím nemyslím, že zpracování jazyka bude rychlejší (to až na vyjímky nebude z principielních důvodů), ale že se bude lišit "o malé konstanty", ne "o řády".
Teď konkrétně: Ano, u sčítání se stále musí kontrolovat typ, tj. především zda jde o celé číslo. To je konkrétně ve SpiderMonkey záležitost testu jednoho bitu = 1 nebo 2 instrukce procesoru (nepamatuji si už příliš x86 assembler a nechce se mi hledat). V terminologii TraceMonkey se těmto instrukcím říká guard instructions. Stejně tak se musí kontrolovat přetečení – opět záležitost jedné nebo několika málo guard instructions. Skoky související s těmito testy jsou procesorem dobře predikovatelné, testy tedy nebudou obvykle způsobovat vyprázdnění pileline procesoru.
V ideálním případě (testy typu a přetečení se vejdou do 1 instrukce) se tedy u cyklu sčítajícího dokola dvě proměnné s čísly dostáváme na něco jako 4 instrukce na cyklus, vs. 1 instrukce na cyklus u céčka. Při složitějších operacích bude overhead menší. Bez statické analýzy bude nějaký overhead existovat stále, podstatné ale je, že to jsou jednotky instrukcí, nikoliv stovky či tisíce, jak je tomu u běžných interpretů.
Nevím, jestli se mi povedlo dostatečně vyjádřit, jak to se "srovnatelnou rychlostí" myslím, ale snad ano.
Re: absence typování a rychlost
celé vláknoZatím spolehlivě nefunguje
celé vláknoJá jsem to schválně zkusil na svém zvýrazňovači syntaxe, do kterého jsem shodou okolností zrovna dnes dodělával nějaké optimalizace, a bohužel to zatím nefunguje. Ve skriptu je ošetřen stav, ke kterému by teoreticky nikdy nemělo dojít a přesně k němu v Firefoxu 3.1 Beta 2 se zapnutým javascript.options.jit.content dojde (s vypnutým ne).
Nahlásil jsem to jako bug 473777.
Re: Zatím spolehlivě nefunguje
celé vláknoV 1.9.1b2 to skutečně nefungovalo, v 1.9.2a1-pre to už zdá se funguje. Ke zrychlení mého testu ale bohužel nedojde - naopak došlo ke zpomalení (měřeno Firebugem).
| Firefox/3.0.5 | 1879 ms |
| Minefield/3.2a1pre s vypnutým JIT | 1371 ms |
| Minefield/3.2a1pre se zapnutým JIT | 1765 ms |
Re: Zatím spolehlivě nefunguje
celé vláknoZpomalení bych klidně reportoval jako bug (možná s nějakým omezenějším testcasem).
Re: Zatím spolehlivě nefunguje
celé vláknoRe: Zatím spolehlivě nefunguje
celé vláknoMám tehle prohlížeč: Mozilla/5.0 (X11; U; Linux i686; cs; rv:1.9.1b2) Gecko/20081201 Firefox/3.1b2 a zkoušel jsem to v online demu co je přímo na těch odkazovaných stránkách.