Chtel bych videt, jak se teda v C poprali s pointerem, ktery se muze toulat, kde se mu zlibi.
Zavedli pointery, které se nemohou toulat, kde se jim zlíbí. :-)
To je sice všechno moc pěkný, ale víte, jak dlouho trvá běh kvalitního kompilátoru? Na ten bych si tedy po spuštění JITu počkal pěkně dlouho. Tím nechci říct, že výkon JVM nemůže být přijatelný, obzvlášť na serverech. Na klientech to ale bude mírně horší, a co hůř, u většího kusu SW typu OpenOffice, IDE a podobně opravdu nebudu chtít, aby se až po jejím spuštění u mně začal VM rozhlížet, co s tím molochem jako provede. Použití Javy na desktopových aplikacích je ospravedlnitelé možná tam, kde aplikaci používá maximálně pár desítek nebo stovek lidí. Jinak bych ale trpěl výčitkami z toho, že jednu a tutéž věc, kterou bych mohl provést jeden stroj jednou, dělají tisíce strojů...a znovu a znovu při každém spuštění. A nemotejte do toho "specializované instrukce", tím javisté straší před spaním své C++ děti. Takové věci jako flow analysis a profile-based inlining (ale i další) jsou naprosto nezávislé na ISA, a trvají mnohem déle než rozhodnutí, co použiju za instrukce (a to i v případě, že to ovlivní věší část kompilace, protože to rozhodnutí je samo o sobě velmi krátké - mám, použiju, nemám, nepoužiju - když se provede dřív, prostě se bude provádět jiná větev kompilačního řetězce, ale trvat bude s velkou pravděpodobností stejně, ostatně Java stejně nevektorizuje, IIRC). Používat Javu je velmi neekologické. Java causes global warming! Hug a tree, use C++! ;-)vidite to treba uz na tom, ze program v bytecode nemusite kompilovat pro kazdu platformu zvlast - az JIT vi, na jake instrukce ma byte-code prevest napriklad: program v C pro Intel spusteny na PowerPC - cas dokonceni: nikdy, kdezto program pro JIT pobezi v pohode (pokud pro PowerPC je dana VM)
rekl bych ze podobne (samozrejme s mene drastickymi nasledky) je to v ramci jedne architektury ... napriklad program v C byste musel kompilovat do nekolika variant s/bez podbory pro SSE1-4/MMX/x64/AltiVec, nebo tam udelat rozhodovaci logiku, ktera si vybere vetev s instrukcemi podporovanymi procesorem ... nemyslim, ze je to idelani pristup (i kdyz to udela kompilator automaticky) ... navic prichod novych instrukci znamena rekompilaci toho programu v C jeho vyrobcem (pokud nemate tu moznost sam), kdezto u JIT staci nova VM a vsechny programy hned hezky bezi s podporou vseho noveho
1) Preklad do byte-code je kompilace, pri ktere se uz neco dela? Prvni stupen optimalizace je zde. Ale zde toho jeste prilis udelat nejde, protoze jeste vse zustava platformne nezavisle.Překlad do bytecode je v případě Javy naprosto triviální. Tam nejde nic "optimalizovat".
2) Vsechny tridy v java.* package se cachuji zkompilovane, jakmile se jakykoliv program v Jave poprve spusti (novinka v 1.5) a jakykoliv dalsi program uz nekompiluje znovu pokud se nezmeni procesor, neupdatuje java apod.Mohu vědět, kde? Ono to není tak triviální, dynamicky zrekompilované třídy už z principu jsou dost špatně recyklovatelné. Hromada informací při generování takového kódu vyletí komínem. Mně osobně to trošku připomnělo arabská písmena, která závisejí na kontextu - když jedno vytrhnu, napasovat ho můžu v podstatě jen mezi stejná písmenka jinde. Smysl by mělo dumpnout celý kód jednoho procesu, ale ani to by nebylo extra praktické. Zvlášť v případe agresivního inliningu (o jehož užitečnosti bych i vedl spory, stačí se podívat na forthovské procesory) může být docela problematické zrecyklovat rt.jar třídy z jedné aplikace v aplikaci druhé.
3) Ten dynamicky inlining/deinling ve VM apod. co jsem tu zminoval a nekdo se mi smal, ze to existuje davno, prave umoznuje iteracni kompilaci kodu - nejdriv zkompilujete rychle, kdyz se kod casto pouziva udela se to znovu. Aplikace rychle nabehne a kdyz bezi dele vykon se zvedne.Totéž umí profile-based kompilace jazyků typu ML a třeba i to C++. Až na to, že se ta aplikace spustí téměř optimální hned po načtení z disku. Pokud bych mohl z JITu něco vytěžit, tak nejspíš jen u hodně dlouho běžící serverové aplikace za značně se měnících podmínek (oproti prvotní profilaci), a ještě je otázka, jak velký ten marginální nárůst výkonu bude. Abych to řekl jinak: Microsoft .NET nepoužívá JIT - nebo přinejmenším po spuštění aplikace se už kód nemění, tj. nepoužívá rekompilaci. A přesto je výkon víceméně srovnatelný - někde lepší, někde horší... Na Javě se projevuje, že do ní byly napumpované desítky a stovky miliónů dolarů, takže pokud má velice dobrý serverový výkon, tak to bude tím R&D, mnohem spíš, než tím, že R&D vyprodukovalo ausgerechnet HotSpot.
4) Specializovane instrukce opravdu hodne pomahaji pri specifickych ukolech i v Jave. Jejich vykon se diametralne lisi od beznych. neni to strasak ale fakt.Já vím, že to je fakt. Ale ten kód někdo musí napsat, a JVM to nebude. :-) Specializované instrukce bohužel vyžadují ponořit se do assembleru nebo intrinzik, nebo na daný úkol napsat knihovnu (ale ručně). To druhé funguje i v Javě, to první v Javě nejde a součaný JIT kompilátor Javy to prostě neumí. To není strašák, ale fakt. ;-) Specializované instrukce jsou velice dobrý důvod, proč se naučit aspoň trošku assembler. Třeba tu manhattanskou metriku přes PSADBW si budu muset napsat sám, vygeneruje ji za mě JIT z for cyklu? ;-)
5) To, ze se kompiluje na kazdem stroji znovu je dan za cross-platformost ... kdyz uzivatel Java aplikace bude prechazet z Win/Intel na Linux/PPC aspon nebude muset brecet, ze mu tam ta aplikace nejedeEhm...to je spíš problém dodavatele. Znám spoustu těžce nahraditelných javovských aplikací, které jinde než na Windows nepoběží, přestože jsou psány v Javě. Ba co víc - třeba MultiTerm Extract funguje nejen pouze na Windows, ale pouze s jednou konkrétní verzí JVM, a nemůžu mít v systému nic jiného. To já už radši aplikaci v C++, která nebude blokovat ostatní svými požadavky na runtime. Samozřejmě, Java může investice potřebné k zajištění přenositelnosti snížit, ale obávám se, že se tenhle aspekt poněkdu přeceňuje. C++ například úspěšně běhá na mnohem více platformách než HotSpot.
6) Jinak obecne s principem proc delat veci pokazde, kdyz je muzete udelat jednou souhlasim: - proc muset testovat pri kazdem pristupu v C do pameti jestli neni pointer mimo vyhrazenou pamet? (kdyz Java tohle zajistuje uz na urovni jazyka)Jistě, proto se to při každém přístupu netestuje ani v C. ;-) Tohle mě má překvapit?
- proc prepinat mezi uzivatelskym a privilegovanym rezimem? (kdyz budete mit bezpecnost na urovni jazyka)Co to je tady "bezpečnost"? Stahování kódu z webových stránek ponechme stranou, Vy si vážně myslíte, že musím chránit počítač před aplikacemi, které si sám nainstaluji? (Digitálně podepsanými mými kolegy?) SW bariéru jsem schopen zajistit kdekoliv.
- proc pri kazde instrukci delat predikci vetveni v kodu, resit out-of-oreder vykonavani instrukci, resit forwarding, resit jak musite pozastavit pipeline? (kdyz vsechny tyhle informace muze vyrobit JIT jednou pri kompilaci pri nacteni tridy)Nechci Vám brát iluze, ale tohle za nás na většině architektur řeší procesor, a tam, kde to neřeší procesor, tam to vygeneruje kompilátor sám, a je úplně jedno, jestli před spuštěním aplikace nebo po něm.
- proc resit preemtivni multitasking a to jestli proces prepnete v idealni chvili? (kdyz vam JIT bude schopen tahle mista najit pri kompilaci a pridat instrukce na vzdani se procesoroveho casu a preemtivni reseni bude pouzivat jen jako doplnek)Proč tohle nemůže řešit AOT kompilátor?
... no a tyhle otazky si polozili i jini a proto treba existuji prototypy OS, ktere uz nepouzivaji C ... JNode, JX, Singularity apod.Díky, já radši House OS. ;-) Tenhle koncept je fajn, ale přinásí základní problém - restrikci jazyka. Zeptejte se na tohle profesora Tanenbauma, co vám na to řekne. ;-) Pokud mi budete argumentovat abstraktním bezpečným mezikódem, pak Vás musím informovat: Žádný univerzální neexistuje. Alespoň ne takový, který by byl použitelný pro všechny jazyky, a já chci počítač jako univerzální nástroj, ne jako javovský telefon na kterém běhá jen Java. Hardwarová kontrola je neinvazivní a v podstatě bezproblémová.
PS: velka cast spotreby (ekologie) procesoru pripada prave na optimalizaci kodu za behu, protoze non-JIT kompilator neni schopen dodat optimalni kod pro dany procesor ...Non-JIT kompilátor sice nemá všechny informace, které může mít JIT, ale vynášet tak silné tvrzení, že marginální výhoda JITu přebije AOT kompilaci natolik, že má smysl ji podstupovat znovu a znovu, to je opravdu odvážné. Chápu výhody JITu například u Smalltalku, to je systém, u kterého AOT nepřipadá v úvahu, ale Java není Smalltalk, ta je dynamická asi tak, jako pyramida na tekutých píscích.
napriklad Itanium hodne sazelo na JIT a cela architektura je postavena na tom, ze procesor opravdu pocita a neresi optimalizaci ... bohuzel soucasne OS a spousta utilit toho potencialu nedokazi vyuzitNe, Itanium sázelo na VLIW. To je velmi starý koncept, který s JIT opravdu nemá nic společného, bohužel.
"velka roztristenost dat kvuli nahodne alokaci => vysoka spotreba cache, vysoky cache miss" - prosím??? Co tím myslíte přesně? "alokace na heapu zarucuje lokalitu dat => mala spotreba cache, skoro nulovy cache miss" - cože??? "optimalizace na velikost cache" - jaké cache?Mám pocit, že možná mluví o alignmentu dat vůči cache lines, ale to je problematika poněkud složitější, než aby se daly dělat takovéhle paušální soudy. Kromě toho, mám pocit, že statisticky (přístupy) horký je hlavně zásobník a v GC-supported runtimech také nursery/eden/nultá generace (každý tomu říká jinak :-)), ale tam je to kompaktní už z principu. Přijde mi, že obecném případě tyhle věci téměř némá smysl řešit, protože determinismus tady jde do kytek.
"nesni JIT pouzivaji hodne agresivni strategie na optimalizaci - dynamicky inlining/deinlining apod." - co je na tom jako agresívního? To je ta nejprimitivnější optimalizace a často je sporné, jde-li vůbec o optimalizaci nebo naopak.To bylo asi agresivní v dobách Selfu 93. ;-) Dneska by to už člověk celkem čekal.