Porad mi neni uplne jasne jak ten JIT pracuje. V pripade ze tracne smycku ve ktere neni nic jineho nez 3 podminky, tak trace (vysledny kod) te smycky vypada jak?
Znamena to ze budu mit 3 tracy te smycky pro 3 varianty podle toho jake v ni plati podminky? Jak JIT pak poznava ktery trace ma pouzit?
Uvital bych mensi pocet prikladu, ktere ale pujdou vic do hloubky a napriklad ukazou jak vypada trace prelozeny do assembleru ciloveho CPU. A jak treba vypada predcasne opusteni tracu kdyz selze guard a co se potom zacne dit.
Nedovolit v JITovanych funkcich skoky sice vypada divne, ale zjednodusi se tim alokace registru procesoru -- je mozne ji provest optimalne v linearnim case protoze graf kolizi je intervalovy (a ten jde snadno obarvit), zatimco v obecnem pripade se skoky muze byt graf libovolny a je to tedy NP-uplne. Takze to asi neni uplne spatny napad, ale rad bych kdybyste podrobneji popsal co se deje kdyz to selze a jestli treba nekdo zmeril kolik % casu se travi v interpretacnim modu tim, ze vsechny skoky je treba vykonavat interpretacne (jestli tomu dobre rozumim). Pak take nejaky overhead bude mit ulozeni a obnoveni registru CPU, ktere pouziva interpret pri kazdem zavolani nejakeho tracu.
Diky.
Zdravim a diky za zajimave otazky. Vypada to zhruba takto - mejme tu smycku se tremi podminkami, z toho vylezou celkem 4 stopy - cela smycka + ty 3 vetve (+dalsi veci, viz dale). Takze doufejme, ze se to moc nerozhazi:
---- TRACE 1 0009 KSHORT 8 100 0010 ISGE 8 7 0011 JMP 8 => 0013 0013 KSHORT 8 200 0014 ISGE 8 7 0015 JMP 8 => 0017 0017 KSHORT 8 300 0018 ISGE 8 7 0019 JMP 8 => 0021 0021 FORL 4 => 0009
to je klasika, toto se prelozi +- do nativniho kodu pres IR, nejsou tam tedy vetve
---- TRACE 2 0012 ADDVN 1 1 0 ; 1 0013 KSHORT 8 200 0014 ISGE 8 7 0015 JMP 8 => 0017 0017 KSHORT 8 300 0018 ISGE 8 7 0019 JMP 8 => 0021 0021 JFORL 4 1
zajimavejsi cast, je tady videt navaznost na zbytek smycky
---- TRACE 3 0016 ADDVN 2 2 0 ; 1 0017 KSHORT 8 300 0018 ISGE 8 7 0019 JMP 8 => 0021 0021 JFORL 4 1
^dalsi navaznost na zbytek smycky
---- TRACE 4 0020 ADDVN 3 3 0 ; 1 0021 JFORL 4 1
tak, posledni vetev uz toho moc neobsahuje, jen zvyseni promenne a dalsi iterace
Uvazuju, ze v pristi casti bych to nejak (jak?) zkusil nakreslit, jeste popremyslim (protoze nez udelam obrazek, tak napisu tech slavnych tisic slov :).
Uznavam ze jsem asi pomalejsi nebo jsem nedaval pozor, ale porad mi to neni jasne.
Uz v te prvni trace jsou skoky a to podle me uplne zbytecne protoze skacou na nasledujici instrukci. To me trochu mate. Nebo to jsou ty zminene guardy a kdyz by doslo k tomu ze podminka nebude splnena tak se prerusi provadeni? To znamena ze po prekladu do nativniho kodu tam bude neco jako instrukce ret, pokud se tedy tracy provadi pomoci call.
Muze byt jedna stopa obsazena v nejake delsi? Rekl bych ze ano, treba kdyz mam podminku z jejihoz vnitrku se stane stopa a pak v dalsich iteracich cyklu bude podminka uz stale splnena takze z cyklu s touto vetvi se stane stopa. Jak se JIT rozhoduje kterou stopu zavola? Vytvari si ke kazdemu radku v programu seznam stop a podminek ktere se predpokladaji ze v nich jsou splneny a pak na zaklade nejake statistiky a toho co uz vi o datech na niz program pracuje se rozhodne pro nejakou ze stop?
Asi to neni potreba nejak kreslit, spis by mi pomohlo okomentovat po krocich (radcich byte-codu) co ten jit vlastne dela a jak se napr. predavaji data mezi interpretovanym JITem a nativnim kodem.