{"id":35851,"date":"2019-10-31T22:07:03","date_gmt":"2019-10-31T19:07:03","guid":{"rendered":"https:\/\/prohoster.info\/blog\/bolshoe-intervyu-s-kliffom-klikom-ottsom-jit-kompilyatsii-v-java\/"},"modified":"2019-10-31T22:07:03","modified_gmt":"2019-10-31T19:07:03","slug":"bolshoe-intervyu-s-kliffom-klikom-ottsom-jit-kompilyatsii-v-java","status":"publish","type":"post","link":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/bolshoe-intervyu-s-kliffom-klikom-ottsom-jit-kompilyatsii-v-java","title":{"rendered":"Velk\u00fd rozhovor s Cliffem Clickem \u2014 otcem JIT kompilace v Jav\u011b","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Velk\u00fd rozhovor s Cliffem Clickem \u2014 otcem JIT kompilace v Jav\u011b\" src=\"\/wp-content\/uploads\/2019\/07\/9ea9740ef74c0ae14d334482af115222.png\" style=\"display:block;margin: 0 auto;\" \/><strong>Cliff Click<\/strong> \u2014 CTO spole\u010dnosti Cratus (IoT senzory pro zlep\u0161en\u00ed proces\u016f), zakladatel a spoluzakladatel n\u011bkolika startup\u016f (v\u010detn\u011b Rocket Realtime School, Neurensic a H2O.ai) s n\u011bkolika \u00fasp\u011b\u0161n\u00fdmi v\u00fdstupy. Cliff napsal sv\u016fj prvn\u00ed kompil\u00e1tor ve 15 letech (Pascal pro TRS Z-80)! Je nejzn\u00e1m\u011bj\u0161\u00ed za pr\u00e1ci na C2 v Java (the Sea of Nodes IR). Tento kompil\u00e1tor uk\u00e1zal sv\u011btu, \u017ee JIT m\u016f\u017ee produkovat kvalitn\u00ed k\u00f3d, co\u017e se stalo jedn\u00edm z faktor\u016f, pro\u010d se Java stala jednou z hlavn\u00edch modern\u00edch softwarov\u00fdch platforem. Pot\u00e9 Cliff pomohl spole\u010dnosti Azul Systems postavit 864j\u00e1drov\u00fd mainframe se softwarem napsan\u00fdm \u010dist\u011b v Jav\u011b, kter\u00fd podporoval GC pauzy na 500gigabajtov\u00e9m hald\u011b v rozmez\u00ed 10 milisekund. Obecn\u011b, Cliff m\u011bl mo\u017enost pracovat na v\u0161ech aspektech JVM.<br clear=\"all\"><br \/>\n\u00a0<br \/>\nTento habra-p\u0159\u00edsp\u011bvek je velk\u00fd rozhovor s Cliffem. Budeme hovo\u0159it na n\u00e1sleduj\u00edc\u00ed t\u00e9mata:<\/p>\n<p><\/p>\n<ul>\n<li>P\u0159echod k n\u00edzko\u00farov\u0148ov\u00fdm optimalizac\u00edm<\/li>\n<li>Jak prov\u00e9st velkou refaktorizaci<\/li>\n<li>Model n\u00e1klad\u016f<\/li>\n<li>V\u00fduka n\u00edzko\u00farov\u0148ov\u00fdm optimalizac\u00edm<\/li>\n<li>Praktick\u00e9 p\u0159\u00edklady zlep\u0161en\u00ed v\u00fdkonu<\/li>\n<li>Pro\u010d vytvo\u0159it sv\u016fj vlastn\u00ed programovac\u00ed jazyk<\/li>\n<li>Kari\u00e9ra in\u017een\u00fdra v\u00fdkonu<\/li>\n<li>Technick\u00e9 v\u00fdzvy<\/li>\n<li>Trochu o alokaci registr\u016f a v\u00edcej\u00e1drovosti<\/li>\n<li>Nejv\u011bt\u0161\u00ed v\u00fdzva v \u017eivot\u011b<\/li>\n<\/ul>\n<p><\/p>\n<p>Rozhovor vede:<\/p>\n<p><\/p>\n<ul>\n<li><strong>Andrej Satarin<\/strong> z Amazon Web Services. Ve sv\u00e9 kari\u00e9\u0159e m\u011bl mo\u017enost pracovat na zcela r\u016fzn\u00fdch projektech: testoval distribuovanou datab\u00e1zi NewSQL v Yandexu, syst\u00e9m cloudov\u00e9ho detekov\u00e1n\u00ed v laborato\u0159i Kaspersky, multiplayerovou hru v Mail.ru a slu\u017ebu pro v\u00fdpo\u010det m\u011bnov\u00fdch cen v Deutsche Bank. Zaj\u00edm\u00e1 se o testov\u00e1n\u00ed velkorozm\u011brov\u00fdch backendov\u00fdch a distribuovan\u00fdch syst\u00e9m\u016f.<\/li>\n<li><strong>Vladimir Sitnikov<\/strong> z Netcracker. Deset let pracuje na v\u00fdkonu a \u0161k\u00e1lovatelnosti NetCracker OS \u2014 software pou\u017e\u00edvan\u00e9ho provozovateli s\u00edt\u00ed pro automatizaci proces\u016f spr\u00e1vy s\u00edt\u011b a s\u00ed\u0165ov\u00e9ho vybaven\u00ed. Zaj\u00edm\u00e1 se o ot\u00e1zky v\u00fdkonu Java a Oracle Database. Autor v\u00edce ne\u017e deseti zlep\u0161en\u00ed v\u00fdkonu v ofici\u00e1ln\u00edm PostgreSQL JDBC ovlada\u010di.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"perehod-k-nizkourovnevym-optimizaciyam\">P\u0159echod k n\u00edzko\u00farov\u0148ov\u00fdm optimalizac\u00edm<\/h1>\n<p><\/p>\n<p><strong>Andrej<\/strong>: Jste zn\u00e1m\u00fd v oblasti JIT kompilace, v Jav\u011b a pr\u00e1ci na v\u00fdkonu obecn\u011b, \u017ee?\u00a0<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: P\u0159esn\u011b tak!<\/p>\n<p><\/p>\n<p><strong>Andrej<\/strong>: Poj\u010fme za\u010d\u00edt s obecn\u00fdmi ot\u00e1zkami o pr\u00e1ci na v\u00fdkonu. Co si mysl\u00edte o volb\u011b mezi vysoce\u00farov\u0148ov\u00fdmi a n\u00edzko\u00farov\u0148ov\u00fdmi optimalizacemi, jako je pr\u00e1ce na \u00farovni CPU?<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: Tady je v\u0161echno jednoduch\u00e9. Nejrychlej\u0161\u00ed k\u00f3d je ten, kter\u00fd se nikdy nespou\u0161t\u00ed. Proto je v\u017edy d\u016fle\u017eit\u00e9 za\u010d\u00edt na vysok\u00e9 \u00farovni a pracovat na algoritmech. Lep\u0161\u00ed O-notation p\u0159ebije hor\u0161\u00ed O-notation, jen pokud se neobjev\u00ed n\u011bkter\u00e9 dostate\u010dn\u011b velk\u00e9 konstanty. Pr\u00e1ce na n\u00edzk\u00e9 \u00farovni p\u0159ich\u00e1z\u00ed a\u017e na sam\u00e9m konci. Obvykle, pokud jste optimalizovali cel\u00fd zb\u00fdvaj\u00edc\u00ed stack dostate\u010dn\u011b dob\u0159e a st\u00e1le zb\u00fdv\u00e1 n\u011bco zaj\u00edmav\u00e9ho \u2013 to u\u017e je n\u00edzk\u00e1 \u00farove\u0148. Ale jak za\u010d\u00edt na vysok\u00e9 \u00farovni? Jak zjistit, \u017ee bylo ud\u011bl\u00e1no dostate\u010dn\u00e9 mno\u017estv\u00ed pr\u00e1ce na vysok\u00e9 \u00farovni? Nu\u2026 nijak. Neexistuj\u00ed \u017e\u00e1dn\u00e9 hotov\u00e9 recepty. Mus\u00edte se vyznat v probl\u00e9mu, rozhodnout se, co chcete ud\u011blat (abyste se vyhnuli zbyte\u010dn\u00fdm krok\u016fm) a teprve pak m\u016f\u017eete vyt\u00e1hnout profiler, kter\u00fd m\u016f\u017ee \u0159\u00edct n\u011bco u\u017eite\u010dn\u00e9ho. V ur\u010dit\u00e9m okam\u017eiku si sami uv\u011bdom\u00edte, \u017ee jste se zbavili zbyte\u010dn\u00fdch v\u011bc\u00ed a nastal \u010das v\u011bnovat se jemn\u00e9mu lad\u011bn\u00ed na n\u00edzk\u00e9 \u00farovni. To je rozhodn\u011b specifick\u00fd druh um\u011bn\u00ed. Spousta lid\u00ed d\u011bl\u00e1 zbyte\u010dn\u00e9 v\u011bci, ale pohybuje se tak rychle, \u017ee se o v\u00fdkonu nemaj\u00ed \u010das starat. Ale to plat\u00ed do t\u00e9 doby, ne\u017e se probl\u00e9m stane nal\u00e9hav\u00fdm. Obvykle 99 % \u010dasu nikoho nezaj\u00edm\u00e1, co d\u011bl\u00e1m, a\u017e do momentu, kdy se na kritick\u00e9 cest\u011b objev\u00ed d\u016fle\u017eit\u00e1 v\u011bc, o kterou m\u00e1 n\u011bkdo z\u00e1jem. A pak se v\u0161ichni za\u010dnou pt\u00e1t na t\u00e9ma \u201epro\u010d to od za\u010d\u00e1tku nefungovalo dokonale\u201c. V podstat\u011b v\u017edy existuje n\u011bco, co lze zlep\u0161it v oblasti v\u00fdkonu. Ale 99 % \u010dasu nem\u00e1te vod\u00edtka! Jen se sna\u017e\u00edte, aby n\u011bco fungovalo, a p\u0159i tom zjist\u00edte, co je d\u016fle\u017eit\u00e9. Nikdy nem\u016f\u017eete v\u011bd\u011bt p\u0159edem, \u017ee tento kousek by m\u011bl b\u00fdt dokonal\u00fd, tak\u017ee v podstat\u011b mus\u00edte b\u00fdt dokonal\u00ed ve v\u0161em. A to je nemo\u017en\u00e9 a tak se to ned\u011bl\u00e1. V\u017edy je spousta v\u011bc\u00ed k oprav\u011b \u2013 a to je naprosto v po\u0159\u00e1dku.<\/p>\n<p><\/p>\n<h1 id=\"kak-delat-bolshoy-refaktoring\">Jak prov\u00e9st velkou refaktorizaci<\/h1>\n<p><\/p>\n<p><strong>Andrej<\/strong>: Jak pracujete na v\u00fdkonu? Je to p\u0159ece nad\u0159azen\u00fd probl\u00e9m. Nap\u0159\u00edklad, m\u011bli jste n\u011bkdy na starosti probl\u00e9my, kter\u00e9 vznikly v d\u016fsledku interakce velk\u00e9ho mno\u017estv\u00ed ji\u017e existuj\u00edc\u00ed funk\u010dnosti?<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: Sna\u017e\u00edm se tomu vyh\u00fdbat. Jestli\u017ee v\u00edm, \u017ee v\u00fdkon bude probl\u00e9m, p\u0159em\u00fd\u0161l\u00edm o tom, ne\u017e za\u010dnu k\u00f3dovat, zejm\u00e9na o datov\u00fdch struktur\u00e1ch. Ale \u010dasto to zjist\u00ed\u0161 a\u017e mnohem pozd\u011bji. A pak mus\u00ed\u0161 p\u0159istoupit na krajn\u00ed opat\u0159en\u00ed a ud\u011blat to, co naz\u00fdv\u00e1m \u201ep\u0159epracuj a vl\u00e1dni\u201c: mus\u00ed\u0161 se chopit dostate\u010dn\u011b velk\u00e9 \u010d\u00e1sti. \u010c\u00e1st k\u00f3du bude stejn\u011b nutn\u00e9 p\u0159epracovat kv\u016fli probl\u00e9m\u016fm s v\u00fdkonem nebo z jin\u00e9ho d\u016fvodu. A\u0165 u\u017e je d\u016fvod k p\u0159epracov\u00e1n\u00ed k\u00f3du jak\u00fdkoli, skoro v\u017edy je lep\u0161\u00ed p\u0159epracovat v\u011bt\u0161\u00ed kus ne\u017e men\u0161\u00ed. V tu chv\u00edli se v\u0161ichni za\u010dnou t\u0159\u00e1st strachy: \u201e\u00f3 bo\u017ee, nesm\u00ed\u0161 se dot\u00fdkat tolik k\u00f3du!\u201c. Ale ve skute\u010dnosti tento p\u0159\u00edstup v\u011bt\u0161inou funguje mnohem l\u00e9pe. Je t\u0159eba se hned uchopit v\u011bt\u0161\u00edho probl\u00e9mu, obkreslit kolem n\u011bj velk\u00fd kruh a \u0159\u00edct: v\u0161echno, co je uvnit\u0159 kruhu, p\u0159epracov\u00e1v\u00e1m. Hranice je p\u0159ece mnohem men\u0161\u00ed ne\u017e ten obsah uvnit\u0159, kter\u00fd podl\u00e9h\u00e1 v\u00fdm\u011bn\u011b. A pokud takov\u00e9 obkreslen\u00ed hranic umo\u017en\u00ed perfektn\u011b zvl\u00e1dnout pr\u00e1ci uvnit\u0159 \u2013 m\u00e1\u0161 voln\u00e9 ruce, d\u011blej si, co chce\u0161. Jakmile porozum\u00ed\u0161 probl\u00e9mu, proces p\u0159epracov\u00e1n\u00ed jde mnohem hlad\u010deji, tak si uj\u00eddej velk\u00fd kus!<br \/>\nZ\u00e1rove\u0148, kdy\u017e p\u0159epracov\u00e1v\u00e1\u0161 velk\u00fd kus a ch\u00e1pe\u0161, \u017ee v\u00fdkon se stane probl\u00e9mem, m\u016f\u017ee\u0161 se za\u010d\u00edt o n\u011bj hned ob\u00e1vat. Obvykle se to prom\u011bn\u00ed v jednoduch\u00e9 v\u011bci jako \u201enekop\u00edruj data, spravuj data co nejjednodu\u0161eji, d\u011blej je men\u0161\u00edmi\u201c. U velk\u00fdch p\u0159epracov\u00e1n\u00ed jsou standardn\u00ed zp\u016fsoby, jak zlep\u0161it v\u00fdkon. A ty se t\u00e9m\u011b\u0159 v\u017edy to\u010d\u00ed kolem dat.<\/p>\n<p><\/p>\n<h1 id=\"model-stoimosti\">Model n\u00e1klad\u016f<\/h1>\n<p><\/p>\n<p><strong>Andrej<\/strong>: V jednom z podcast\u016f jste mluvili o modelech n\u00e1klad\u016f v kontextu v\u00fdkonu. M\u016f\u017eete vysv\u011btlit, co t\u00edm bylo my\u0161leno?<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: Samoz\u0159ejm\u011b. Narodil jsem se v dob\u011b, kdy byla v\u00fdkon procesoru nesm\u00edrn\u011b d\u016fle\u017eit\u00fd. A tato \u00e9ra se op\u011bt vrac\u00ed \u2013 osud nen\u00ed bez ironie. Za\u010d\u00ednal jsem \u017e\u00edt ve sv\u011bt\u011b osmibitov\u00fdch stroj\u016f, m\u016fj prvn\u00ed po\u010d\u00edta\u010d m\u011bl 256 byte. Skute\u010dn\u011b byte. V\u0161echno bylo velmi mal\u00e9. Bylo t\u0159eba vyhodnocovat instrukce a jakmile jsme za\u010dali postupovat nahoru v r\u00e1mci jazyk\u016f programov\u00e1n\u00ed, jazyky p\u0159eb\u00edraly st\u00e1le v\u00edce a v\u00edce. Bylo to Assembler, pak Basic, pak C, a C p\u0159eb\u00edral pr\u00e1ci s mnoha detaily, jako je distribuce registr\u016f a v\u00fdb\u011br instrukc\u00ed. Ale tam bylo v\u0161echno docela jasn\u00e9 a pokud jsem ud\u011blal ukazatel na instanci prom\u011bnn\u00e9, dostal jsem load, a n\u00e1klady na tuto instrukci jsou zn\u00e1my. Hardware poskytuje zn\u00e1m\u00fd po\u010det strojov\u00fdch cykl\u016f, tak\u017ee rychlost proveden\u00ed r\u016fzn\u00fdch akc\u00ed lze spo\u010d\u00edtat pouh\u00fdm se\u010dten\u00edm v\u0161ech instrukc\u00ed, kter\u00e9 pl\u00e1nuje\u0161 spustit. Ka\u017ed\u00fd compare\/test\/branch\/call\/load\/store se dal se\u010d\u00edst a \u0159\u00edct: m\u00e1te tu \u010das proveden\u00ed. P\u0159i optimalizaci v\u00fdkonu si ur\u010dit\u011b v\u0161imne\u0161, jak\u00e1 \u010d\u00edsla odpov\u00eddaj\u00ed mal\u00fdm hork\u00fdm cykl\u016fm.\u00a0<br \/>\nAle jakmile p\u0159epne\u0161 na Javu, Python a podobn\u00e9 v\u011bci, velmi rychle se vzdaluje\u0161 od n\u00edzko\u00farov\u0148ov\u00e9ho hardwaru. Jak\u00e1 je cena vol\u00e1n\u00ed getteru v Jav\u011b? Pokud JIT v HotSpotu v\u0161e spr\u00e1vn\u011b <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.openjdk.java.net\/display\/HotSpot\/Inlining\">za-inlinoval<\/a><\/noindex>, bude to load, ale pokud to neud\u011blal \u2013 bude to vol\u00e1n\u00ed funkce. Vzhledem k tomu, \u017ee vol\u00e1n\u00ed le\u017e\u00ed na hork\u00e9m cyklu, zru\u0161\u00ed v\u0161echny ostatn\u00ed optimalizace v tomto cyklu. Proto bude skute\u010dn\u00e1 cena mnohem vy\u0161\u0161\u00ed. A hned ztr\u00e1c\u00ed\u0161 schopnost pod\u00edvat se na kus k\u00f3du a rozum\u011bt tomu, co bychom m\u011bli vykonat v term\u00ednech taktovac\u00ed frekvence procesoru, pou\u017eit\u00e9 pam\u011bti a cache. To v\u0161echno se st\u00e1v\u00e1 zaj\u00edmav\u00e9 pouze tehdy, pokud se skute\u010dn\u011b pono\u0159\u00ed\u0161 do v\u00fdkonu.<br \/>\nNyn\u00ed jsme se ocitli v situaci, kdy rychlosti procesor\u016f u\u017e v\u00edce ne\u017e deset let t\u00e9m\u011b\u0159 nerostou. Star\u00e9 \u010dasy se vracej\u00ed! U\u017e nem\u016f\u017eete po\u010d\u00edtat s dobrou jednovl\u00e1knovou v\u00fdkonnost\u00ed. Ale pokud se n\u00e1hodou pust\u00edte do paraleln\u00edho v\u00fdpo\u010dtu \u2013 to je \u0161\u00edlen\u011b slo\u017eit\u00e9, v\u0161ichni se na v\u00e1s d\u00edvaj\u00ed jako na Jamese Bonda. Desetin\u00e1sobn\u00e1 zrychlen\u00ed se zde obvykle vyskytuj\u00ed tam, kde si n\u011bkdo n\u011b\u010deho nev\u0161iml. Paralelnost vy\u017eaduje spoustu pr\u00e1ce. Aby bylo dosa\u017eeno on\u011bch desetin\u00e1sobn\u00fdch zrychlen\u00ed, je t\u0159eba pochopit model n\u00e1klad\u016f. Co a kolik to stoj\u00ed. A k tomu je t\u0159eba porozum\u011bt, jak jazyk odpov\u00edd\u00e1 z\u00e1kladn\u00edmu hardwaru.<br \/>\nMartin Thompson na\u0161el skv\u011bl\u00e9 slovo pro sv\u016fj blog <noindex><a rel=\"nofollow\" href=\"https:\/\/mechanical-sympathy.blogspot.com\/\">Mechanick\u00e1 sympatie<\/a><\/noindex>! Je nezbytn\u00e9 pochopit, co se hardware chyst\u00e1 ud\u011blat, jak p\u0159esn\u011b to bude d\u011blat a pro\u010d vlastn\u011b d\u011bl\u00e1 to, co d\u011bl\u00e1. D\u00edky tomu je docela snadn\u00e9 za\u010d\u00edt po\u010d\u00edtat instrukce a zjistit, kde \u010das b\u011bhu unik\u00e1. Pokud v\u0161ak nem\u00e1te odpov\u00eddaj\u00edc\u00ed p\u0159\u00edpravu, jen hled\u00e1te \u010dernou ko\u010dku v temn\u00e9 m\u00edstnosti. St\u00e1le vid\u00edm lidi, kte\u0159\u00ed optimalizuj\u00ed v\u00fdkon, a nemaj\u00ed ani tu\u0161en\u00ed, co vlastn\u011b d\u011blaj\u00ed. Trp\u00ed a moc se neposunuj\u00ed. A kdy\u017e vezmu ten sam\u00fd k\u00f3d, p\u0159id\u00e1m tam p\u00e1r drobn\u00fdch hack\u016f a dos\u00e1hnu p\u011bti nebo desetin\u00e1sobn\u00e9ho zrychlen\u00ed, \u0159\u00edkaj\u00ed: no, to nen\u00ed f\u00e9r, my jsme u\u017e v\u011bd\u011bli, \u017ee jsi lep\u0161\u00ed. Ohromuj\u00edc\u00ed. O \u010dem to mluv\u00edm\u2026 model n\u00e1klad\u016f \u2013 to je o tom, za jak\u00fd k\u00f3d p\u00ed\u0161ete a jak rychle v pr\u016fm\u011bru funguje v r\u00e1mci celkov\u00e9ho obrazu.<\/p>\n<p><\/p>\n<p><strong>Andrej<\/strong>: A jak takov\u00fd objem udr\u017eet v hlav\u011b? To se dosahuje velk\u00fdm mno\u017estv\u00edm zku\u0161enost\u00ed, nebo? Kde se takov\u00e9 zku\u0161enosti z\u00edsk\u00e1vaj\u00ed?<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: No, svou zku\u0161enost jsem z\u00edskal ne zrovna nejjednodu\u0161\u0161\u00ed cestou. Programoval jsem v Assembleru je\u0161t\u011b v dob\u00e1ch, kdy jste mohli rozum\u011bt ka\u017ed\u00e9 jednotliv\u00e9 instrukci. Zn\u00ed to hloup\u011b, ale od t\u00e9 doby mi z\u016fstala v hlav\u011b, v pam\u011bti, nav\u017edy sada instrukc\u00ed Z80. Nepamatuji si jm\u00e9na lid\u00ed ani minutu po rozhovoru, ale pamatuji si k\u00f3d napsan\u00fd p\u0159ed 40 lety. Legra\u010dn\u00ed, vypad\u00e1 to jako syndrom \u201e<noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A1%D0%B8%D0%BD%D0%B4%D1%80%D0%BE%D0%BC_%D1%81%D0%B0%D0%B2%D0%B0%D0%BD%D1%82%D0%B0\">v\u011bdeck\u00e9ho idiota<\/a><\/noindex>\u00bb.<\/p>\n<p><\/p>\n<h1 id=\"obuchenie-nizkourovnevym-optimizaciyam\">V\u00fduka n\u00edzko\u00farov\u0148ov\u00fdm optimalizac\u00edm<\/h1>\n<p><\/p>\n<p><strong>Andrej<\/strong>: Existuje n\u011bjak\u00fd jednodu\u0161\u0161\u00ed zp\u016fsob, jak se do toho pono\u0159it?<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: Ano i ne. Hardware, kter\u00fd v\u0161ichni pou\u017e\u00edv\u00e1me, se za tuto dobu p\u0159\u00edli\u0161 nezm\u011bnil. V\u0161ichni pou\u017e\u00edvaj\u00ed x86, krom\u011b chytr\u00fdch telefon\u016f na Arm. Pokud se nev\u011bnujete n\u011bjak\u00e9mu hardcore embedded programov\u00e1n\u00ed, m\u00e1te to sam\u00e9. Dob\u0159e, pokra\u010dujme d\u00e1l. Instrukce se tak\u00e9 po stalet\u00ed nezm\u011bnily. Je pot\u0159eba j\u00edt a napsat n\u011bco v assembleru. Trochu, ale dost, abyste za\u010dali ch\u00e1pat. Usm\u00edv\u00e1te se, ale j\u00e1 to mysl\u00edm naprosto v\u00e1\u017en\u011b. Je t\u0159eba porozum\u011bt vztahu mezi jazykem a hardwarem. Pot\u00e9 je t\u0159eba j\u00edt napsat trochu k\u00f3du a vytvo\u0159it mal\u00fd experiment\u00e1ln\u00ed kompil\u00e1tor pro mal\u00fd experiment\u00e1ln\u00ed jazyk. \u201eExperiment\u00e1ln\u00ed\u201c znamen\u00e1, \u017ee ho mus\u00edte ud\u011blat v rozumn\u00e9m \u010dase. M\u016f\u017ee b\u00fdt super jednoduch\u00fd, ale mus\u00ed generovat instrukce. Akt generov\u00e1n\u00ed instrukc\u00ed umo\u017en\u00ed pochopit model n\u00e1klad\u016f pro most mezi vysokou \u00farovn\u00ed k\u00f3du, na kter\u00e9m v\u0161ichni p\u00ed\u0161\u00ed, a strojov\u00fdm k\u00f3dem, kter\u00fd se prov\u00e1d\u00ed na hardware. Tento vztah se vryje do pam\u011bti p\u0159i psan\u00ed kompil\u00e1toru. I toho nejjednodu\u0161\u0161\u00edho kompil\u00e1toru. Pot\u00e9 m\u016f\u017eete za\u010d\u00edt zkoumat Javu a to, \u017ee jej\u00ed s\u00e9mantick\u00e1 propast je mnohem hlub\u0161\u00ed, a budovat nad n\u00ed mosty, co\u017e je mnohem slo\u017eit\u011bj\u0161\u00ed. V Jav\u011b je mnohem slo\u017eit\u011bj\u0161\u00ed pochopit, zda je n\u00e1\u0161 most dobr\u00fd nebo \u0161patn\u00fd, co ho p\u0159ivede k p\u00e1du a co ne. Ale pot\u0159ebujete n\u011bjak\u00fd v\u00fdchoz\u00ed bod, kdy\u017e se d\u00edv\u00e1te na k\u00f3d a ch\u00e1pete: \u201eaha, tento getter by m\u011bl b\u00fdt inlinovan\u00fd poka\u017ed\u00e9\u201c. A pak se uk\u00e1\u017ee, \u017ee se to n\u011bkdy opravdu d\u011bje, s v\u00fdjimkou p\u0159\u00edpad\u016f, kdy se metoda stane p\u0159\u00edli\u0161 velkou a JIT za\u010dne inlinovat v\u0161echno. V\u00fdkon t\u011bchto m\u00edst lze okam\u017eit\u011b p\u0159edpov\u011bd\u011bt. Obvykle work with getters dob\u0159e, ale pak se pod\u00edv\u00e1te na velk\u00e9 hork\u00e9 smy\u010dky a zjist\u00edte, \u017ee tam plavou n\u011bjak\u00e9 vol\u00e1n\u00ed funkc\u00ed, kter\u00e9 nev\u00edm, co d\u011blaj\u00ed. V tom je probl\u00e9m s masivn\u00edm pou\u017e\u00edv\u00e1n\u00edm getter\u016f, d\u016fvod, pro\u010d se neinlinuj\u00ed - nen\u00ed jasn\u00e9, zda je to getter. Pokud m\u00e1te supermalou k\u00f3dovou z\u00e1kladnu, m\u016f\u017eete si ji jednodu\u0161e zapamatovat a pak \u0159\u00edct: to je getter a to je setter. V rozs\u00e1hl\u00e9 k\u00f3dov\u00e9 z\u00e1kladn\u011b ka\u017ed\u00e1 funkce pro\u017e\u00edv\u00e1 sv\u016fj vlastn\u00ed p\u0159\u00edb\u011bh, kter\u00fd nikomu, vlastn\u011b, nen\u00ed zn\u00e1m. Profiler \u0159\u00edk\u00e1, \u017ee jsme ztratili 24 % \u010dasu na n\u011bjak\u00e9 smy\u010dce a abychom pochopili, co tato smy\u010dka d\u011bl\u00e1, mus\u00edme se pod\u00edvat na ka\u017edou funkci uvnit\u0159. Nen\u00ed mo\u017en\u00e9 to pochopit, ani\u017e byste studovali funkci, a to v\u00e1\u017en\u011b zpomaluje proces porozum\u011bn\u00ed. Proto j\u00e1 nepou\u017e\u00edv\u00e1m gettery a settery, dostal jsem se na novou \u00farove\u0148!<br \/>\nKde naj\u00edt model n\u00e1klad\u016f? No, m\u016f\u017eete si n\u011bco p\u0159e\u010d\u00edst, samoz\u0159ejm\u011b... Ale mysl\u00edm, \u017ee nejlep\u0161\u00ed zp\u016fsob je jednat. Vytvo\u0159it mal\u00fd kompil\u00e1tor a to bude nejlep\u0161\u00ed zp\u016fsob, jak pochopit model n\u00e1klad\u016f a vm\u011bstnat si ho do vlastn\u00ed hlavy. Mal\u00fd kompil\u00e1tor, kter\u00fd by se hodil pro programov\u00e1n\u00ed mikrovlnn\u00e9 trouby \u2013 to je \u00fakol pro za\u010d\u00e1te\u010dn\u00edka. No, mysl\u00edm, \u017ee pokud u\u017e m\u00e1te programovac\u00ed dovednosti, m\u011blo by to sta\u010dit. V\u0161echny tyto v\u011bci, jako nap\u0159\u00edklad parsov\u00e1n\u00ed \u0159et\u011bzce, kter\u00fd bude n\u011bjak\u00fdm algemi\u010dt\u00ednov\u00fdm v\u00fdrazem, vyt\u00e1hnout z n\u011bj instrukce matematick\u00fdch operac\u00ed ve spr\u00e1vn\u00e9m po\u0159ad\u00ed, vz\u00edt spr\u00e1vn\u00e9 hodnoty z registr\u016f \u2013 to v\u0161e jde snadno. A zat\u00edmco to d\u011bl\u00e1te, bude se v\u00e1m to otiskovat v mozku. Mysl\u00edm, \u017ee v\u0161ichni v\u011bd\u00ed, \u010d\u00edm se zab\u00fdv\u00e1 kompil\u00e1tor. A to v\u00e1m poskytne pochopen\u00ed modelu n\u00e1klad\u016f.<\/p>\n<p><\/p>\n<h1 id=\"prakticheskie-primery-uluchsheniya-proizvoditelnosti\">Praktick\u00e9 p\u0159\u00edklady zlep\u0161en\u00ed v\u00fdkonu<\/h1>\n<p><\/p>\n<p><strong>Andrej<\/strong>: Na co dal\u0161\u00edho byste m\u011bli d\u00e1vat pozor p\u0159i pr\u00e1ci na v\u00fdkonnosti?<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: Datov\u00e9 struktury. Mimochodem, dlouho jsem tyto lekce nevedl\u2026 <noindex>Rocket School<\/noindex>. Bylo to z\u00e1bavn\u00e9, ale vy\u017eadovalo to tolik \u00fasil\u00ed, a p\u0159itom m\u00e1m je\u0161t\u011b i \u017eivot! Dob\u0159e. Tak\u017ee b\u011bhem jednoho z velk\u00fdch a zaj\u00edmav\u00fdch p\u0159edn\u00e1\u0161ek, \u201eKam jde v\u00e1\u0161 v\u00fdkon\u201c, jsem student\u016fm d\u00e1val p\u0159\u00edklad: dva a p\u016fl gigabajtu fintech dat byla na\u010dtena z CSV souboru a d\u00e1l bylo t\u0159eba spo\u010d\u00edtat po\u010det prod\u00e1van\u00fdch produkt\u016f. B\u011b\u017en\u00e1 tickov\u00e1 tr\u017en\u00ed data. UDP pakety, p\u0159eveden\u00e9 na textov\u00fd form\u00e1t, za\u010d\u00ednaj\u00edc\u00ed od 70. let. Chicago Mercantile Exchange \u2013 r\u016fzn\u00e9 v\u011bci jako olej, kuku\u0159ice, s\u00f3jov\u00e9 boby a podobn\u011b. Bylo pot\u0159eba spo\u010d\u00edtat tyto produkty, po\u010det obchod\u016f, pr\u016fm\u011brn\u00fd objem pohybu prost\u0159edk\u016f a zbo\u017e\u00ed, atd. To je docela jednoduch\u00e1 obchodn\u00ed matematika: naj\u00edt k\u00f3d produktu (to jsou 1-2 znaky v hash tabulce), z\u00edskat sumu, p\u0159idat ji do jednoho z obchodn\u00edch sad, p\u0159idat objem, p\u0159idat n\u00e1klady a p\u00e1r dal\u0161\u00edch v\u011bc\u00ed. Velmi jednoduch\u00e1 matematika. Hra\u010dkov\u00e1 implementace byla velmi p\u0159\u00edmo\u010dar\u00e1: v\u0161echno le\u017e\u00ed v souboru, \u010dtu soubor a proch\u00e1z\u00edm j\u00edm, rozd\u011bluji jednotliv\u00e9 z\u00e1znamy na Java \u0159et\u011bzce, hled\u00e1m v nich pot\u0159ebn\u00e9 v\u011bci a s\u010d\u00edt\u00e1m podle v\u00fd\u0161e uveden\u00e9 matematiky. A funguje to n\u011bjakou malou rychlost\u00ed. <\/p>\n<p><\/p>\n<p>S t\u00edmto p\u0159\u00edstupem je jasn\u00e9, co se d\u011bje, a paraleln\u00ed v\u00fdpo\u010dty zde nepomohou, je to tak? Ukazuje se, \u017ee p\u011btin\u00e1sobn\u00e9ho zv\u00fd\u0161en\u00ed v\u00fdkonu lze dos\u00e1hnout pouze volbou spr\u00e1vn\u00fdch datov\u00fdch struktur. A to p\u0159ekvapuje i zku\u0161en\u00e9 program\u00e1tory! V m\u00e9m konkr\u00e9tn\u00edm p\u0159\u00edpad\u011b bylo kl\u00ed\u010dov\u00e9, \u017ee nen\u00ed dobr\u00e9 prov\u00e1d\u011bt alokace pam\u011bti v hork\u00e9 smy\u010dce. No, to nen\u00ed cel\u00e1 pravda, ale celkov\u011b \u2013 nen\u00ed vhodn\u00e9 alokovat \"jednou za X\", kdy\u017e je X dostate\u010dn\u011b velk\u00e9. Kdy\u017e je X dva a p\u016fl gigabajtu, nen\u00ed dobr\u00e9 alokovat nic \"jednou za znak\", \"jednou za \u0159\u00e1dek\" nebo \"jednou za pole\", nic takov\u00e9ho. Pr\u00e1v\u011b tohle zab\u00edr\u00e1 \u010das. Jak to v\u016fbec funguje? P\u0159edstavte si, \u017ee prov\u00e1d\u00edm vol\u00e1n\u00ed <code>String.split()<\/code> nebo <code>BufferedReader.readLine()<\/code>. <code>Readline<\/code> vytv\u00e1\u0159\u00ed \u0159et\u011bzec z byteov\u00e9ho p\u016fdorysu, kter\u00fd p\u0159i\u0161el p\u0159es s\u00ed\u0165, jednou pro ka\u017ed\u00fd \u0159\u00e1dek, pro ka\u017ed\u00fd z n\u011bkolika stovek milion\u016f \u0159\u00e1dk\u016f. Vezmu ten \u0159et\u011bzec, analyzuji ho a zahazuji. Pro\u010d ho zahazuji \u2013 no, u\u017e jsem ho zpracoval, hotovo. Tak\u017ee, pro ka\u017ed\u00fd byte p\u0159e\u010dten\u00fd z t\u011bchto 2.7G bude ulo\u017eena dv\u011b p\u00edsmena v \u0159et\u011bzci, tedy u\u017e 5.4G, a ty mi pak k ni\u010demu nejsou, proto jsou zahazov\u00e1ny. Kdy\u017e se pod\u00edv\u00e1te na propustnost pam\u011bti, zat\u00ed\u017een\u00ed 2.7G proch\u00e1z\u00ed pam\u011bt\u00ed a pam\u011b\u0165ovou sb\u011brnic\u00ed v procesoru a d\u00e1le se dvojn\u00e1sobn\u00e9 mno\u017estv\u00ed pos\u00edl\u00e1 do \u0159et\u011bzce ulo\u017een\u00e9ho v pam\u011bti, a ve\u0161ker\u00e9 to se p\u0159epo\u010d\u00edt\u00e1v\u00e1 p\u0159i vytv\u00e1\u0159en\u00ed ka\u017ed\u00e9ho nov\u00e9ho \u0159et\u011bzce. Ale mus\u00edm ho p\u0159e\u010d\u00edst, hardware ho \u010dte, i kdy\u017e nakonec bude v\u0161echno p\u0159epo\u010d\u00edt\u00e1no. A mus\u00edm ho zapsat, proto\u017ee jsem vytvo\u0159il \u0159et\u011bzec a cache se p\u0159eplnily \u2013 cache nem\u016f\u017ee obsahovat 2.7G. Tak\u017ee, pro ka\u017ed\u00fd p\u0159e\u010dten\u00fd byte \u010dtu je\u0161t\u011b dva dal\u0161\u00ed byty a zapisuji dva dal\u0161\u00ed byty, co\u017e m\u00e1 pom\u011br 4:1 \u2013 takto ne\u00fam\u011brn\u011b pl\u00fdtv\u00e1me propustnost\u00ed pam\u011bti. A nakonec se ukazuje, \u017ee pokud d\u011bl\u00e1m <code>String.split()<\/code> \u2013 d\u011bl\u00e1m to rozhodn\u011b ne naposled, uvnit\u0159 m\u016f\u017ee b\u00fdt dal\u0161\u00edch 6-7 pol\u00ed. Proto klasick\u00fd k\u00f3d pro \u010dten\u00ed CSV s n\u00e1sledn\u00fdm parsov\u00e1n\u00edm \u0159\u00e1dk\u016f vede ke ztr\u00e1t\u00e1m propustnosti pam\u011bti kolem 14:1 ve srovn\u00e1n\u00ed s t\u00edm, co byste vlastn\u011b cht\u011bli m\u00edt. Pokud tyto alokace vyhod\u00edme, m\u016f\u017eeme z\u00edskat p\u011btin\u00e1sobn\u00e9 zrychlen\u00ed. <\/p>\n<p><\/p>\n<p>Nen\u00ed to ani tak slo\u017eit\u00e9. Pokud se na k\u00f3d pod\u00edv\u00e1te pod spr\u00e1vn\u00fdm \u00fahlem, v\u0161e se st\u00e1v\u00e1 docela jednoduch\u00fdm, jakmile si uv\u011bdom\u00edte j\u00e1dro probl\u00e9mu. Nen\u00ed t\u0159eba p\u0159est\u00e1vat s alokac\u00ed pam\u011bti: probl\u00e9m je v tom, \u017ee n\u011bco alokujete a to hned um\u00edr\u00e1, p\u0159i\u010dem\u017e po cest\u011b spaluje d\u016fle\u017eit\u00fd zdroj, kter\u00fdm je v tomto p\u0159\u00edpad\u011b propustnost pam\u011bti. A to v\u0161echno se prom\u00edt\u00e1 do poklesu v\u00fdkonu. Na x86 se obvykle mus\u00ed aktivn\u011b pou\u017e\u00edvat procesorov\u00e9 cykly, ale zde jste sp\u00e1lili celou pam\u011b\u0165 mnohem d\u0159\u00edv. \u0158e\u0161en\u00ed spo\u010d\u00edv\u00e1 v tom, \u017ee je pot\u0159eba sni\u017eovat po\u010det alokac\u00ed.\u00a0<br \/>\nDal\u0161\u00ed \u010d\u00e1st probl\u00e9mu spo\u010d\u00edv\u00e1 v tom, \u017ee kdy\u017e spu\u0161t\u00edte profiler, kdy\u017e dojde k p\u0159epln\u011bn\u00ed pam\u011b\u0165ov\u00e9 linky, v okam\u017eiku, kdy se to d\u011bje, obvykle \u010dek\u00e1te na n\u00e1vrat cache, proto\u017ee je pln\u00e1 nepo\u0159\u00e1dku, kter\u00fd jste pr\u00e1v\u011b vytvo\u0159ili se v\u0161emi t\u011bmi \u0159et\u011bzci. Proto ka\u017ed\u00e1 operace load nebo store se st\u00e1v\u00e1 pomalou, proto\u017ee vedou k cache miss \u2013 cel\u00e1 cache se stala pomalou, zat\u00edmco \u010dekala, a\u017e z n\u00ed odjede nepo\u0159\u00e1dek. Tak\u017ee profiler jen uk\u00e1\u017ee tepl\u00fd n\u00e1hodn\u00fd \u0161um rozta\u017een\u00fd po cel\u00e9m cyklu \u2013 nebude tam \u017e\u00e1dn\u00e1 samostatn\u00e1 hork\u00e1 instrukce nebo m\u00edsto v k\u00f3du. Jen \u0161um. A pokud se pod\u00edv\u00e1te na cykly GC, v\u0161echny budou v Young Generation a super rychl\u00e9 \u2013 mikrosekundy nebo maxim\u00e1ln\u011b milisekundy. V\u017edy\u0165 cel\u00e1 ta pam\u011b\u0165 um\u00edr\u00e1 okam\u017eit\u011b. Alokujete miliardy gigabajt\u016f a on je o\u0159ez\u00e1v\u00e1, o\u0159ez\u00e1v\u00e1 a znovu o\u0159ez\u00e1v\u00e1. V\u0161echno se to d\u011bje velmi rychle. Tak\u017ee tu m\u00e1me levn\u00e9 cykly GC, tepl\u00fd \u0161um po cel\u00e9m cyklu, ale chceme dosa\u017een\u00ed p\u011btin\u00e1sobn\u00e9ho zrychlen\u00ed. V ten okam\u017eik by se m\u011blo v hlav\u011b n\u011bco uzav\u0159\u00edt a zazn\u00edt: \u201ePro\u010d to tak je?!\u201c. P\u0159ete\u010den\u00ed pam\u011b\u0165ov\u00e9 linky se nezobrazuje v klasick\u00e9m debuggeru, je t\u0159eba spustit debugger hardwarov\u00fdch v\u00fdkonov\u00fdch \u010didel a vid\u011bt to samostatn\u011b a p\u0159\u00edmo. A nep\u0159\u00edmo to lze podez\u0159\u00edvat z t\u011bchto t\u0159\u00ed symptom\u016f. T\u0159et\u00ed symptom \u2013 to je, kdy\u017e se pod\u00edv\u00e1te na to, co alokujete, zept\u00e1te se profilu a on odpov\u00ed: \u201eUd\u011blali jste miliardu \u0159et\u011bzc\u016f, ale GC pracoval zdarma.\u201c Jakmile se to stalo, ch\u00e1pete, \u017ee jste vytvo\u0159ili p\u0159\u00edli\u0161 mnoho objekt\u016f a sp\u00e1lili celou pam\u011b\u0165ovou linku. Existuje zp\u016fsob, jak se v tom vyznat, ale nen\u00ed to z\u0159ejm\u00e9.\u00a0<\/p>\n<p><\/p>\n<p>Probl\u00e9m ve struktu\u0159e dat: hol\u00e1 struktura, kter\u00e1 le\u017e\u00ed za v\u0161\u00edm, co se d\u011bje, je p\u0159\u00edli\u0161 velk\u00e1, m\u00e1 2,7 GB na disku, tak\u017ee je velmi ne\u017e\u00e1douc\u00ed d\u011blat kopii t\u00e9to v\u011bci \u2013 chcete ji na\u010d\u00edst p\u0159\u00edmo z ethernetov\u00e9ho datov\u00e9ho buffera do registr\u016f, abyste to nemuseli \u010d\u00edst a zapisovat tam a zp\u011bt p\u011btkr\u00e1t. Bohu\u017eel, Java ti ve v\u00fdchoz\u00edm nastaven\u00ed nenab\u00edz\u00ed takovou knihovnu jako sou\u010d\u00e1st JDK. Ale to by m\u011blo b\u00fdt ban\u00e1ln\u00ed, \u017ee? V podstat\u011b se jedn\u00e1 o 5-10 \u0159\u00e1dk\u016f k\u00f3du, kter\u00e9 pot\u0159ebujete k tomu, abyste implementovali vlastn\u00ed buffered loader \u0159et\u011bzc\u016f, kter\u00fd napodobuje chov\u00e1n\u00ed t\u0159\u00eddy \u0159et\u011bzc\u016f, a p\u0159itom je obalov\u00fdm wrapperem kolem podkladov\u00e9ho datov\u00e9ho buffera. V\u00fdsledkem je, \u017ee pracujete skoro jako byste pracovali se \u0159et\u011bzci, ale ve skute\u010dnosti se pohybuj\u00ed ukazatele na buffer, a syrov\u00e1 data se nikam nekop\u00edruj\u00ed, a t\u00edmto zp\u016fsobem se znovu pou\u017eij\u00ed stejn\u00e9 buffery bez ust\u00e1n\u00ed, zat\u00edmco opera\u010dn\u00ed syst\u00e9m je spokojen s t\u00edm, \u017ee si vezme na starost v\u011bci, kter\u00e9 mu jsou ur\u010deny, jako nap\u0159\u00edklad skryt\u00e9 dvojit\u00e9 bufferov\u00e1n\u00ed t\u011bchto datov\u00fdch buffer\u016f, a u\u017e se nezab\u00fdv\u00e1te nekone\u010dn\u00fdm zpracov\u00e1v\u00e1n\u00edm nepot\u0159ebn\u00fdch dat. Mimochodem, ch\u00e1pete, \u017ee p\u0159i pr\u00e1ci s GC je zaru\u010deno, \u017ee ka\u017ed\u00e9 p\u0159id\u011blen\u00ed pam\u011bti nebude viditeln\u00e9 pro CPU po posledn\u00edm cyklu GC? Tak\u017ee, to v\u0161echno prost\u011b nem\u016f\u017ee b\u00fdt v cache, a pak se stane 100% zaru\u010den\u00fd miss. P\u0159i pr\u00e1ci s ukazatelem trv\u00e1 na x86 p\u0159e\u010d\u00edst registr z pam\u011bti 1-2 cykly, a jakmile k tomu dojde, plat\u00edte, plat\u00edte, plat\u00edte, proto\u017ee cel\u00e1 pam\u011b\u0165 je <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Cache_inclusion_policy\">NINE cachech<\/a><\/noindex> \u2013 a to je cena p\u0159id\u011blen\u00ed pam\u011bti. Skute\u010dn\u00e1 cena.<\/p>\n<p><\/p>\n<p>Jin\u00fdmi slovy, datov\u00e9 struktury jsou to, co se m\u011bn\u00ed nejh\u016f\u0159e. Jakmile si uv\u011bdom\u00edte, \u017ee jste si vybrali \u0161patnou datovou strukturu, kter\u00e1 nakonec zabije v\u00fdkon, obvykle je zapot\u0159eb\u00ed ud\u011blat z\u00e1sadn\u00ed pr\u00e1ci, ale pokud to neud\u011bl\u00e1te, bude to je\u0161t\u011b hor\u0161\u00ed. P\u0159edev\u0161\u00edm je d\u016fle\u017eit\u00e9 p\u0159em\u00fd\u0161let o datov\u00fdch struktur\u00e1ch. Hlavn\u00ed n\u00e1klady zde le\u017e\u00ed na robustn\u00edch datov\u00fdch struktur\u00e1ch, kter\u00e9 za\u010d\u00edn\u00e1me pou\u017e\u00edvat stylem \"zkop\u00edroval jsem datovou strukturu X do datov\u00e9 struktury Y, proto\u017ee se mi Y l\u00edb\u00ed v\u00edc\". Ale operace kop\u00edrov\u00e1n\u00ed (kter\u00e1 se zd\u00e1 b\u00fdt levn\u00e1) ve skute\u010dnosti spot\u0159ebov\u00e1v\u00e1 pam\u011b\u0165ov\u00fd p\u00e1s a pr\u00e1v\u011b tam je zakop\u00e1no ve\u0161ker\u00e9 ztracen\u00e9 b\u011bhov\u00e9 \u010dasu. Pokud m\u00e1m obrovsk\u00fd \u0159et\u011bzec s JSON a chci ho prom\u011bnit na strukturovan\u00e9 DOM-struce z POJO nebo n\u011bco takov\u00e9ho, operace parsov\u00e1n\u00ed tohoto \u0159et\u011bzce a sestaven\u00ed POJO, a pak nov\u00fd p\u0159\u00edstup k POJO pozd\u011bji, se p\u0159i obrac\u00ed na dodate\u010dn\u00e9 n\u00e1klady \u2013 v\u011bc, kter\u00e1 nen\u00ed levn\u00e1. S v\u00fdjimkou p\u0159\u00edpadu, kdy budete b\u011bhat po POJO mnohem \u010dast\u011bji ne\u017e po \u0159et\u011bzci. Napad\u00e1 m\u011b, \u017ee m\u00edsto toho byste mohli zkusit dek\u00f3dovat \u0159et\u011bzec a vyt\u00e1hnout z n\u011bj jen to pot\u0159ebn\u00e9, ani\u017e byste ho prom\u011b\u0148ovali na n\u011bjak\u00e1 POJO. Pokud se to v\u0161e d\u011bje na cest\u011b, kde je po\u017eadov\u00e1n maxim\u00e1ln\u00ed v\u00fdkon, \u017e\u00e1dn\u00e9 POJO \u2013 mus\u00edte n\u011bjak p\u0159\u00edmo hrabat v \u0159et\u011bzci.<\/p>\n<p><\/p>\n<h1 id=\"zachem-sozdavat-svoy-yazyk-programmirovaniya\">Pro\u010d vytvo\u0159it sv\u016fj vlastn\u00ed programovac\u00ed jazyk<\/h1>\n<p><\/p>\n<p><strong>Andrej<\/strong>: \u0158ekl jste, \u017ee pro pochopen\u00ed modelu n\u00e1klad\u016f je t\u0159eba napsat sv\u016fj vlastn\u00ed mal\u00fd jazyk\u2026<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: Ne jazyk, ale kompil\u00e1tor. Jazyk a kompil\u00e1tor jsou r\u016fzn\u00e9 v\u011bci. Nejv\u011bt\u0161\u00ed rozd\u00edl je ve va\u0161\u00ed hlav\u011b.\u00a0<\/p>\n<p><\/p>\n<p><strong>Andrej<\/strong>: Mimochodem, pokud v\u00edm, experimentujete s vytvo\u0159en\u00edm vlastn\u00edch jazyk\u016f. Pro\u010d?<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: Proto\u017ee mohu! Jsem nap\u016fl v d\u016fchodu, tak\u017ee je to moje hobby. Cel\u00fd \u017eivot jsem realizoval ciz\u00ed jazyky. Tak\u00e9 jsem hodn\u011b pracoval na stylu k\u00f3dov\u00e1n\u00ed. A tak\u00e9 proto, \u017ee vid\u00edm probl\u00e9my v jin\u00fdch jazyc\u00edch. Vid\u00edm, \u017ee existuj\u00ed lep\u0161\u00ed zp\u016fsoby, jak d\u011blat b\u011b\u017en\u00e9 v\u011bci. A t\u011bch bych vyu\u017eil. U\u017e m\u011b omrzelo vid\u011bt probl\u00e9my v sob\u011b, v Jav\u011b, v Pythonu, v jak\u00e9mkoli jin\u00e9m jazyce. Te\u010f p\u00ed\u0161u v React Native, JavaScriptu a Elm jako hobby, kter\u00e9 nen\u00ed o d\u016fchodu, ale o aktivn\u00ed pr\u00e1ci. A tak\u00e9 p\u00ed\u0161i v Pythonu a pravd\u011bpodobn\u011b budu pokra\u010dovat s strojov\u00fdm u\u010den\u00edm pro Java backendy. Existuje mnoho popul\u00e1rn\u00edch jazyk\u016f a v\u0161echny maj\u00ed zaj\u00edmav\u00e9 vlastnosti. Ka\u017ed\u00fd je dobr\u00fd n\u011b\u010d\u00edm sv\u00fdm a lze zkusit zkombinovat v\u0161echny tyto vychyt\u00e1vky dohromady. Tak\u017ee se v\u011bnuji studiu zaj\u00edmav\u00fdch v\u011bc\u00ed pro m\u011b, chov\u00e1n\u00ed jazyka, sna\u017e\u00edm se vymyslet rozumnou semantiku. A zat\u00edm se mi to da\u0159\u00ed! V sou\u010dasnosti bojuji s pam\u011b\u0165ovou semantikou, proto\u017ee chci m\u00edt pam\u011b\u0165 jako v C a Jav\u011b, a z\u00edskat siln\u00fd model pam\u011bti a pam\u011b\u0165ovou semantiku pro na\u010d\u00edt\u00e1n\u00ed a ukl\u00e1d\u00e1n\u00ed. Z\u00e1rove\u0148 m\u00edt automatick\u00e9 odvozov\u00e1n\u00ed typ\u016f jako v Haskellu. Takhle se sna\u017e\u00edm zkombinovat Haskellovsk\u00e9 odvozov\u00e1n\u00ed typ\u016f s pam\u011bt\u00ed, kter\u00e1 funguje jako v C a Jav\u011b. Tomu se v\u011bnuji posledn\u00ed 2-3 m\u011bs\u00edce, nap\u0159\u00edklad.<\/p>\n<p><\/p>\n<p><strong>Andrej<\/strong>: Pokud stav\u00edte jazyk, kter\u00fd bere nejlep\u0161\u00ed aspekty z jin\u00fdch jazyk\u016f, p\u0159em\u00fd\u0161leli jste o tom, \u017ee by n\u011bkdo ud\u011blal opak: vzal by va\u0161e n\u00e1pady a pou\u017eil je u sebe?<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: P\u0159esn\u011b tak vznikaj\u00ed nov\u00e9 jazyky! Pro\u010d je Java podobn\u00e1 C? Proto\u017ee C m\u011blo dobrou syntaxi, kterou v\u0161ichni ch\u00e1pali, a Java se inspirovala touto syntaxi, p\u0159idala do n\u00ed typovou bezpe\u010dnost, kontroly hranic pol\u00ed, GC, a tak\u00e9 zlep\u0161ili n\u011bkter\u00e9 v\u011bci z C. P\u0159idali sv\u00e9. Ale inspirovali se dost siln\u011b, \u017ee? V\u0161ichni stoj\u00ed na ramenou ob\u0159\u00edch, kte\u0159\u00ed byli p\u0159ed tebou - takto se d\u011bl\u00e1 pokrok.<\/p>\n<p><\/p>\n<p><strong>Andrej<\/strong>: Jak ch\u00e1pu, v\u00e1\u0161 jazyk bude bezpe\u010dn\u00fd z hlediska pou\u017e\u00edv\u00e1n\u00ed pam\u011bti. P\u0159em\u00fd\u0161leli jste o implementaci n\u011b\u010deho jako borrow checker z Rustu? D\u00edvali jste se na n\u011bj, co si o n\u011bm mysl\u00edte?<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: No, u\u017e dlouho p\u00ed\u0161u na C, se v\u0161emi t\u011bmi malloc a free, a ru\u010dn\u011b spravuji \u017eivotnost. V\u00edte, 90-95% ru\u010dn\u011b \u0159\u00edzen\u00e9 \u017eivotnosti m\u00e1 stejnou strukturu. A je velmi, velmi bolestiv\u00e9 se t\u00edm zab\u00fdvat ru\u010dn\u011b. Cht\u011blo by to, aby p\u0159eklada\u010d prost\u011b \u0159\u00edkal, co se d\u011bje a co jste sv\u00fdmi \u010diny dos\u00e1hli. U n\u011bkter\u00fdch v\u011bc\u00ed to borrow checker d\u011bl\u00e1 automaticky. A m\u011bl by tak\u00e9 automaticky generovat informace, v\u0161e ch\u00e1pat a ani m\u011b nezat\u011b\u017eovat t\u00edm, abych tu informaci s\u00e1m formuloval. M\u011bl by prov\u00e1d\u011bt minim\u00e1ln\u011b lok\u00e1ln\u00ed anal\u00fdzu \u00fanik\u016f, a teprve pokud se mu to nepoda\u0159\u00ed, m\u011bl bych p\u0159id\u00e1vat typov\u00e9 anotace, kter\u00e9 popisuj\u00ed \u017eivotnost - a tento syst\u00e9m je mnohem slo\u017eit\u011bj\u0161\u00ed ne\u017e borrow checker, nebo jak\u00fdkoli jin\u00fd st\u00e1vaj\u00edc\u00ed pam\u011b\u0165ov\u00fd checker. Volba mezi \u201ev\u0161echno je v po\u0159\u00e1dku\u201c a \u201enic jsem nepochopil\u201c - ne, m\u011blo by tu b\u00fdt n\u011bco lep\u0161\u00edho.\u00a0<br \/>\nJako n\u011bkdo, kdo napsal hodn\u011b k\u00f3du v C, pova\u017euji za z\u00e1sadn\u00ed m\u00edt podporu automatick\u00e9ho \u0159\u00edzen\u00ed \u017eivotnosti. A tak\u00e9 m\u011b skute\u010dn\u011b frustruje, jak moc Java vyu\u017e\u00edv\u00e1 pam\u011b\u0165; hlavn\u00ed st\u00ed\u017enost se t\u00fdk\u00e1 garbage collectoru. Kdy\u017e alokujete pam\u011b\u0165 v Jav\u011b, nedostanete zp\u011bt pam\u011b\u0165, kter\u00e1 byla lok\u00e1ln\u00ed v posledn\u00edm kole garbage collectoru. V jazyc\u00edch s p\u0159esn\u011bj\u0161\u00edm \u0159\u00edzen\u00edm pam\u011bti tomu tak nen\u00ed. Kdy\u017e zavol\u00e1te malloc, okam\u017eit\u011b z\u00edsk\u00e1te pam\u011b\u0165, kter\u00e1 byla obvykle pr\u00e1v\u011b pou\u017eita. Obvykle pam\u011bti d\u011bl\u00e1te n\u011bjak\u00e9 do\u010dasn\u00e9 v\u011bci a ihned ji vrac\u00edte zp\u011bt. A hned se vrac\u00ed do poolu mallocu a p\u0159i dal\u0161\u00edm vol\u00e1n\u00ed mallocu ji m\u016f\u017eete pou\u017e\u00edt znovu. Proto skute\u010dn\u00e9 vyu\u017eit\u00ed pam\u011bti kles\u00e1 na mno\u017estv\u00ed \u017eiv\u00fdch objekt\u016f v konkr\u00e9tn\u00edm \u010dasov\u00e9m okam\u017eiku, plus \u00faniky. A pokud v\u00e1m neunik\u00e1 pam\u011b\u0165 v \u00fapln\u011b nep\u0159ijateln\u00e9m mno\u017estv\u00ed, v\u011bt\u0161ina pam\u011bti kon\u010d\u00ed v cache a procesoru, a to funguje rychle. Ale vy\u017eaduje to hodn\u011b manu\u00e1ln\u00edho \u0159\u00edzen\u00ed pam\u011bti pomoc\u00ed malloc a free, volan\u00fdch ve spr\u00e1vn\u00e9m po\u0159ad\u00ed a na spr\u00e1vn\u00fdch m\u00edstech. Rust si s t\u00edm dok\u00e1\u017ee poradit s\u00e1m a v mnoha p\u0159\u00edpadech dokonce nab\u00eddnout v\u011bt\u0161\u00ed v\u00fdkon, proto\u017ee spot\u0159eba pam\u011bti se zu\u017euje pouze na aktu\u00e1ln\u00ed v\u00fdpo\u010dty \u2013 na rozd\u00edl od \u010dek\u00e1n\u00ed na dal\u0161\u00ed kolo garbage collectoru, kter\u00e9 uvoln\u00ed pam\u011b\u0165. Nakonec jsme dostali velmi zaj\u00edmav\u00fd zp\u016fsob, jak zlep\u0161it v\u00fdkon. A docela siln\u00fd \u2013 co se t\u00fd\u010de zpracov\u00e1n\u00ed dat pro fintech, to umo\u017e\u0148ovalo zrychlen\u00ed zhruba p\u011btkr\u00e1t. To je docela velk\u00e9 zrychlen\u00ed, zejm\u00e9na v dob\u011b, kdy procesory nezrychluj\u00ed a my st\u00e1le \u010dek\u00e1me na zlep\u0161en\u00ed.<\/p>\n<p><\/p>\n<h1 id=\"karera-performans-inzhenera\">Kari\u00e9ra in\u017een\u00fdra v\u00fdkonu<\/h1>\n<p><\/p>\n<p><strong>Andrej<\/strong>: Cht\u011bl bych tak\u00e9 polo\u017eit p\u00e1r ot\u00e1zek ohledn\u011b va\u0161\u00ed kari\u00e9ry. Stal jste se slavn\u00fdm d\u00edky pr\u00e1ci na JIT v HotSpotu a pot\u00e9 jste se p\u0159esunuli do spole\u010dnosti Azul \u2013 co\u017e je tak\u00e9 spole\u010dnost zab\u00fdvaj\u00edc\u00ed se JVM. Ale v\u00edce jste se zam\u011b\u0159ovali na hardware ne\u017e na software. A pak jste se n\u00e1hle p\u0159epnuli na Big Data a strojov\u00e9 u\u010den\u00ed, a n\u00e1sledn\u011b na detekci podvod\u016f. Jak k tomu do\u0161lo? To jsou velmi odli\u0161n\u00e9 oblasti v\u00fdvoje.<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: U\u017e se n\u011bjakou dobu zab\u00fdv\u00e1m programov\u00e1n\u00edm a stihl jsem se vyzkou\u0161et na r\u016fzn\u00fdch projektech. Kdy\u017e lid\u00e9 \u0159\u00edkaj\u00ed: \u201eOh, ty jsi ten, kdo ud\u011blal JIT pro Java!\u201c, je to v\u017edycky z\u00e1bavn\u00e9. A p\u0159itom jsem p\u0159edt\u00edm d\u011blal klon PostScriptu \u2013 toho jazyka, kter\u00fd Apple kdysi pou\u017e\u00edvala pro sv\u00e9 laserov\u00e9 tisk\u00e1rny. A p\u0159edt\u00edm jsem realizoval jazyk Forth. Mysl\u00edm, \u017ee spole\u010dn\u00fdm t\u00e9matem pro m\u011b je v\u00fdvoj n\u00e1stroj\u016f. Cel\u00fd \u017eivot vytv\u00e1\u0159\u00edm n\u00e1stroje, pomoc\u00ed kter\u00fdch lid\u00e9 p\u00ed\u0161\u00ed sv\u00e9 skv\u011bl\u00e9 programy. Ale tak\u00e9 jsem pracoval na v\u00fdvoji opera\u010dn\u00edch syst\u00e9m\u016f, ovlada\u010d\u016f, j\u00e1drov\u00fdch debugger\u016f a jazyk\u016f pro v\u00fdvoj OS, kter\u00e9 zpo\u010d\u00e1tku vypadaly trivi\u00e1ln\u011b, ale \u010dasem se st\u00e1le komplikovaly. Ale hlavn\u00ed t\u00e9ma je p\u0159ece jen v\u00fdvoj n\u00e1stroj\u016f. Velk\u00e1 \u010d\u00e1st m\u00e9ho \u017eivota prob\u011bhla mezi Azul a Sun a byla zam\u011b\u0159ena na Java. Ale kdy\u017e jsem se za\u010dal zab\u00fdvat Big Data a strojov\u00fdm u\u010den\u00edm, znovu jsem si nasadil svou slavnostn\u00ed \u010depici a \u0159ekl: \u201eAch, nyn\u00ed m\u00e1me netrivi\u00e1ln\u00ed probl\u00e9m, a zde se d\u011bje spousta zaj\u00edmav\u00fdch v\u011bc\u00ed a lid\u00ed, kte\u0159\u00ed n\u011bco d\u011blaj\u00ed.\u201c To je skv\u011bl\u00e1 cesta pro rozvoj, kterou stoj\u00ed za to proj\u00edt. <\/p>\n<p><\/p>\n<p>Ano, opravdu m\u00e1m r\u00e1d distribuovan\u00e9 v\u00fdpo\u010dty. Moje prvn\u00ed pr\u00e1ce byla v dob\u011b studia na C, na reklamn\u00edm projektu. Byly to distribuovan\u00e9 v\u00fdpo\u010dty na \u010dipech Zilog Z80, kter\u00e9 shroma\u017e\u010fovaly data pro analogov\u00e9 optick\u00e9 rozpozn\u00e1v\u00e1n\u00ed textu, kter\u00e9 prov\u00e1d\u011bl skute\u010dn\u00fd analogov\u00fd analyz\u00e1tor. Bylo to \u00fa\u017easn\u00e9 a naprosto neobvykl\u00e9 t\u00e9ma. Ale byly tam probl\u00e9my, n\u011bjak\u00e1 \u010d\u00e1st nebyla spr\u00e1vn\u011b rozpozn\u00e1na, tak\u017ee bylo pot\u0159eba dostat obr\u00e1zek a uk\u00e1zat ho \u010dlov\u011bku, kter\u00fd u\u017e to \u010detl o\u010dima a \u0159ekl, co tam vlastn\u011b je, a proto tam byly \u00falohy s daty, a tyto \u00falohy m\u011bly sv\u016fj vlastn\u00ed jazyk. Byl tam backend, kter\u00fd to v\u0161e zpracov\u00e1val \u2013 paraleln\u00ed Z80 s aktivn\u00edmi termin\u00e1ly vt100 \u2013 po jednom na \u010dlov\u011bka, a existoval model paraleln\u00edho programov\u00e1n\u00ed na Z80. Ur\u010dit\u00fd spole\u010dn\u00fd kus pam\u011bti, kter\u00fd sd\u00edlely v\u0161echny Z80 uvnit\u0159 konfigurace typu \u201ehv\u011bzda\u201c; sd\u00edlel se i backplane, a polovina RAM byla sd\u00edlena v s\u00edti, zat\u00edmco druh\u00e1 polovina byla soukrom\u00e1 nebo \u0161la na n\u011bco jin\u00e9ho. Smyslupln\u011b slo\u017eit\u00fd paraleln\u00ed distribuovan\u00fd syst\u00e9m se sd\u00edlenou\u2026 polozd\u00edlenou pam\u011bt\u00ed. Kdy to bylo\u2026 U\u017e si ani nevzpomenu, n\u011bkde v polovin\u011b 80. let. Docela d\u00e1vno.\u00a0<br \/>\nAno, budeme pova\u017eovat, \u017ee 30 let je dost d\u00e1vno. \u00dakoly spojen\u00e9 s distribuovan\u00fdmi v\u00fdpo\u010dty existuj\u00ed u\u017e dlouhou dobu, lid\u00e9 se s nimi odjak\u017eiva pot\u00fdkali. <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Beowulf_(%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80)\">Beowulf<\/a><\/noindex>-klastry. Takov\u00e9 klastry vypadaj\u00ed jako\u2026 Nap\u0159\u00edklad: m\u00e1te Ethernet a v\u00e1\u0161 rychl\u00fd x86 je p\u0159ipojen k tomuto Ethernetu, a te\u010f chcete z\u00edskat fake shared memory, proto\u017ee nikdo nemohl tehdy d\u011blat k\u00f3dov\u00e1n\u00ed distribuovan\u00fdch v\u00fdpo\u010dt\u016f, bylo to p\u0159\u00edli\u0161 slo\u017eit\u00e9 a proto existovala fake shared memory s ochranou str\u00e1nek pam\u011bti na x86, a pokud jste zapisovali na tuto str\u00e1nku, \u0159\u00edkali jsme ostatn\u00edm procesor\u016fm, \u017ee pokud z\u00edskaj\u00ed p\u0159\u00edstup k t\u00e9 sam\u00e9 shared memory, mus\u00ed ji na\u010d\u00edst od v\u00e1s, a tak se objevil n\u011bco jako protokol pro podporu koherence cache a software pro to. Zaj\u00edmav\u00e1 koncepce. Skute\u010dn\u00fd probl\u00e9m, samoz\u0159ejm\u011b, byl jinde. To v\u0161echno fungovalo, ale rychle jste z\u00edskali probl\u00e9my s v\u00fdkonem, proto\u017ee nikdo nerozum\u011bl modelu v\u00fdkonu na dostate\u010dn\u011b dobr\u00e9 \u00farovni \u2013 jak\u00e9 tam byly vzory p\u0159\u00edstupu k pam\u011bti, jak ud\u011blat, aby uzly navz\u00e1jem nepingovaly v\u011b\u010dn\u011b, a tak d\u00e1le. <\/p>\n<p><\/p>\n<p>V H2O jsem si vymyslel n\u00e1sleduj\u00edc\u00ed: sami v\u00fdvoj\u00e1\u0159i jsou odpov\u011bdn\u00ed za ur\u010den\u00ed, kde se skr\u00fdv\u00e1 paralelismus a kde nen\u00ed. Vymyslel jsem takov\u00fd model k\u00f3dov\u00e1n\u00ed, \u017ee psan\u00ed vysoce v\u00fdkonn\u00e9ho k\u00f3du se stalo snadn\u00fdm a jednoduch\u00fdm. Naproti tomu napsat pomalu b\u011b\u017e\u00edc\u00ed k\u00f3d je obt\u00ed\u017en\u00e9, bude vypadat \u0161patn\u011b. Je t\u0159eba se v\u00e1\u017en\u011b sna\u017eit, abyste napsali pomal\u00fd k\u00f3d, bude nutn\u00e9 pou\u017e\u00edt nestandardn\u00ed metody. P\u0159\u00edli\u0161 pomal\u00fd k\u00f3d je viditeln\u00fd na prvn\u00ed pohled. Jakmile toho dos\u00e1hnete, obvykle se p\u00ed\u0161e k\u00f3d, kter\u00fd funguje rychle, ale je t\u0159eba vy\u0159e\u0161it, co d\u011blat v p\u0159\u00edpad\u011b sd\u00edlen\u00e9 pam\u011bti. V\u0161echno to souvis\u00ed s velk\u00fdmi poli a chov\u00e1n\u00ed je podobn\u00e9 nevolatiln\u00edm velk\u00fdm pol\u00edm v paraleln\u00edm Jav\u011b. P\u0159edstavte si, \u017ee dva vl\u00e1kna zapisuj\u00ed do paraleln\u00edho pole, jedno z nich vyhr\u00e1v\u00e1, a druh\u00e9 t\u00edm p\u00e1dem prohr\u00e1v\u00e1, a vy nev\u00edte, kdo je kdo. Pokud nejsou volatiln\u00ed, po\u0159ad\u00ed m\u016f\u017ee b\u00fdt jak\u00e9koli \u2013 a to skute\u010dn\u011b dob\u0159e funguje. Lid\u00e9 skute\u010dn\u011b dbaj\u00ed na po\u0159\u00e1dek operac\u00ed, spr\u00e1vn\u011b um\u00eds\u0165uj\u00ed volatile a na spr\u00e1vn\u00fdch m\u00edstech o\u010dek\u00e1vaj\u00ed probl\u00e9my s v\u00fdkonem spojen\u00e9 s pam\u011bt\u00ed. Jinak by prost\u011b psali k\u00f3d ve form\u011b cykl\u016f od 1 do N, kde N jsou n\u011bjak\u00e9 triliony, v nad\u011bji, \u017ee v\u0161echny slo\u017eit\u00e9 p\u0159\u00edpady se automaticky stanou paraleln\u00edmi \u2013 a tam to nefunguje. Ale v H2O to nen\u00ed ani Java, ani Scala, d\u00e1 se to pova\u017eovat za \u201eJava minus minus\u201c, pokud chcete. Je to velmi srozumiteln\u00fd styl programov\u00e1n\u00ed a p\u0159ipom\u00edn\u00e1 psan\u00ed jednoduch\u00e9ho k\u00f3du v C nebo Jav\u011b s cykly a poli. P\u0159itom v\u0161ak m\u016f\u017eete zpracov\u00e1vat terabajty pam\u011bti. St\u00e1le pou\u017e\u00edv\u00e1m H2O. Ob\u010das jej pou\u017e\u00edv\u00e1m v r\u016fzn\u00fdch projektech \u2013 a to je st\u00e1le nejrychlej\u0161\u00ed v\u011bc, kter\u00e1 o des\u00edtky let p\u0159edb\u00edh\u00e1 konkurenci. Pokud d\u011bl\u00e1te Big Data s sloupcov\u00fdmi daty, je velmi obt\u00ed\u017en\u00e9 p\u0159ekonat H2O.<\/p>\n<p><\/p>\n<h1 id=\"tehnicheskie-chellenzhi\">Technick\u00e9 v\u00fdzvy<\/h1>\n<p><\/p>\n<p><strong>Andrej<\/strong>: Jak\u00fd byl v\u00e1\u0161 nejv\u011bt\u0161\u00ed v\u00fdzvou za celou va\u0161i kari\u00e9ru?<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: Diskutujeme o technick\u00e9 nebo netechnick\u00e9 \u010d\u00e1sti ot\u00e1zky? \u0158ekl bych, \u017ee nejv\u011bt\u0161\u00ed v\u00fdzvy nejsou technick\u00e9.\u00a0<br \/>\nPokud jde o technick\u00e9 v\u00fdzvy. Jednodu\u0161e jsem je p\u0159ekonal. Ani nev\u00edm, kter\u00e1 byla ta nejv\u011bt\u0161\u00ed, ale bylo jich n\u011bkolik docela zaj\u00edmav\u00fdch, na kter\u00e9 mi zabralo hodn\u011b \u010dasu a ment\u00e1ln\u00edho boje. Kdy\u017e jsem p\u0159i\u0161el do Sunu, byl jsem si jist\u00fd, \u017ee vytvo\u0159\u00edm rychl\u00fd kompil\u00e1tor, ale spousta senior\u016f mi \u0159ekla, \u017ee nikdy nic nedok\u00e1\u017eu. Ale \u0161el jsem tou cestou, napsal jsem kompil\u00e1tor a\u017e po alok\u00e1tor registr\u016f a byl docela rychl\u00fd. Byl tak rychl\u00fd jako modern\u00ed C1, ale tehdy byl alok\u00e1tor mnohem pomalej\u0161\u00ed, a kdy\u017e se d\u00edv\u00e1m zp\u011bt, to byla ot\u00e1zka velk\u00e9 datov\u00e9 struktury. Pot\u0159eboval jsem ji k naps\u00e1n\u00ed grafick\u00e9ho alok\u00e1toru registr\u016f a nerozum\u011bl jsem dilema mezi v\u00fdsti\u017enost\u00ed k\u00f3du a rychlost\u00ed, kter\u00e9 existovalo v t\u00e9 dob\u011b a bylo velmi d\u016fle\u017eit\u00e9. Uk\u00e1zalo se, \u017ee datov\u00e1 struktura obvykle p\u0159ekra\u010duje velikost cache na x86 po\u010d\u00edta\u010d\u00edch t\u00e9 doby, a proto, pokud jsem zpo\u010d\u00e1tku p\u0159edpokl\u00e1dal, \u017ee alok\u00e1tor registr\u016f bude pracovat 5-10 procent cel\u00e9ho \u010dasu jitov\u00e1n\u00ed, v realit\u011b to vy\u0161lo na 50 procent. <\/p>\n<p><\/p>\n<p>\u010cas plynul, kompil\u00e1tor se stal st\u00e1le jasn\u011bj\u0161\u00edm a v\u00fdkonn\u011bj\u0161\u00edm, p\u0159estal generovat odporn\u00fd k\u00f3d v v\u011bt\u0161\u00edm po\u010dtu p\u0159\u00edpad\u016f, a v\u00fdkon \u010d\u00edm d\u00e1l t\u00edm v\u00edc za\u010dal p\u0159ipom\u00ednat to, co vyd\u00e1val kompil\u00e1tor C. Pokud samoz\u0159ejm\u011b nep\u00ed\u0161ete n\u011bjakou sra\u010dku, kterou ani C nezrychl\u00ed. Pokud p\u00ed\u0161ete k\u00f3d jako v C, dost\u00e1v\u00e1te v\u00fdkon jako v C ve v\u011bt\u0161\u00edm po\u010dtu p\u0159\u00edpad\u016f. A \u010d\u00edm d\u00e1l \u010dast\u011bji se vyskytoval k\u00f3d, kter\u00fd asymptoticky odpov\u00eddal \u00farovni C, alok\u00e1tor registr\u016f za\u010dal p\u0159ipom\u00ednat n\u011bco hotov\u00e9ho\u2026 nez\u00e1visle na tom, zda v\u00e1\u0161 k\u00f3d funguje rychle nebo pomalu. Pokra\u010doval jsem v pr\u00e1ci na alok\u00e1toru, aby prov\u00e1d\u011bl lep\u0161\u00ed alokace. St\u00e1val se pomalej\u0161\u00edm a pomalej\u0161\u00edm, ale poskytoval st\u00e1le lep\u0161\u00ed v\u00fdkon v t\u011bch p\u0159\u00edpadech, kde si nikdo u\u017e nevedl. Mohu se pono\u0159it do alok\u00e1toru registr\u016f, bury tam m\u011bs\u00edc pr\u00e1ce, a najednou se cel\u00fd k\u00f3d za\u010dal vykon\u00e1vat o 5% rychleji. To se d\u011blo znovu a znovu a alok\u00e1tor registr\u016f se stal n\u011bco jako um\u011bleck\u00e9 d\u00edlo \u2013 v\u0161ichni ho milovali nebo nen\u00e1vid\u011bli, a lid\u00e9 z akademie kladli ot\u00e1zky na t\u00e9ma \u201epro\u010d se v\u0161e d\u011bl\u00e1 t\u00edmto zp\u016fsobem\u201c, pro\u010d ne. <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Register_allocation#Linear_Scan\">line\u00e1rn\u00ed skenov\u00e1n\u00ed<\/a><\/noindex>, a jak\u00fd je rozd\u00edl. Odpov\u011b\u010f je st\u00e1le stejn\u00e1: alok\u00e1tor zalo\u017een\u00fd na barven\u00ed grafu plus velmi pe\u010dliv\u00e1 pr\u00e1ce s obslu\u017en\u00fdm k\u00f3dem rovn\u00e1 se n\u00e1stroj k v\u00edt\u011bzstv\u00ed, nejlep\u0161\u00ed kombinace, kterou nikdo nem\u016f\u017ee porazit. A to je docela nejasn\u00e1 z\u00e1le\u017eitost. V\u0161echno ostatn\u00ed, co kompil\u00e1tor d\u011bl\u00e1, jsou pom\u011brn\u011b prozkouman\u00e9 v\u011bci, i kdy\u017e i ty dos\u00e1hly \u00farovn\u011b um\u011bn\u00ed. V\u017edycky jsem d\u011blal v\u011bci, kter\u00e9 m\u011bly prom\u011bnit kompil\u00e1tor v um\u011bleck\u00e9 d\u00edlo. Ale nic z toho nebylo n\u011b\u010d\u00edm v\u00fdjime\u010dn\u00fdm \u2013 s v\u00fdjimkou alok\u00e1toru registr\u016f. Kl\u00ed\u010dov\u00e9 je to, \u017ee je pot\u0159eba pe\u010dliv\u011b <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Register_allocation\">na\u0159ezat<\/a><\/noindex> pod z\u00e1t\u011b\u017e\u00ed a pokud k tomu dojde (mohu podrobn\u011bji vysv\u011btlit, pokud to zaj\u00edm\u00e1), znamen\u00e1 to, \u017ee je mo\u017en\u00e9 inline v\u00edce agresivn\u011b, bez rizika p\u0159ekon\u00e1n\u00ed ohybu v\u00fdkonov\u00e9ho grafu. V t\u00e9 dob\u011b bylo spousta plnohodnotn\u00fdch kompil\u00e1tor\u016f, ozdoben\u00fdch vychyt\u00e1vkami, kter\u00e9 m\u011bly alok\u00e1tory registr\u016f, ale nikdo to u\u017e nedok\u00e1zal. <\/p>\n<p><\/p>\n<p>Probl\u00e9m je v tom, \u017ee pokud p\u0159id\u00e1\u0161 metody podl\u00e9haj\u00edc\u00ed inliningov\u00e1n\u00ed, a t\u00edm neust\u00e1le zvy\u0161uje\u0161 oblast inliningov\u00e1n\u00ed, soubor pou\u017e\u00edvan\u00fdch hodnot okam\u017eit\u011b p\u0159ekro\u010d\u00ed po\u010det registr\u016f a mus\u00ed\u0161 za\u010d\u00edt spilit. Kritick\u00e1 \u00farove\u0148 obvykle nast\u00e1v\u00e1, kdy\u017e alok\u00e1tor sel\u017ee, a jeden dobr\u00fd kandid\u00e1t na spilit stoj\u00ed za druh\u00fdm; spili\u0161 n\u011bjak\u00e9 opravdu nezvykl\u00e9 v\u011bci. Hodnota inliningov\u00e1n\u00ed spo\u010d\u00edv\u00e1 v tom, \u017ee ztr\u00e1c\u00ed\u0161 \u010d\u00e1st overheadu, overheadu na vol\u00e1n\u00ed a ukl\u00e1d\u00e1n\u00ed; m\u016f\u017ee\u0161 vid\u011bt hodnoty uvnit\u0159 a d\u00e1l je optimalizovat. Cena inliningov\u00e1n\u00ed spo\u010d\u00edv\u00e1 v tom, \u017ee vznik\u00e1 velk\u00e9 mno\u017estv\u00ed \u017eiv\u00fdch hodnot, a pokud tv\u016fj alok\u00e1tor registr\u016f spilitne v\u00edc, ne\u017e je pot\u0159eba, okam\u017eit\u011b o to p\u0159ich\u00e1z\u00ed\u0161. Proto maj\u00ed v\u011bt\u0161ina alok\u00e1tor\u016f probl\u00e9m: kdy\u017e inlining p\u0159ekro\u010d\u00ed ur\u010ditou mez, spilitne se v\u0161e, co se d\u00e1, a v\u00fdkon m\u016f\u017ee b\u00fdt spl\u00e1chnut do z\u00e1chodu. Ti, kdo implementuj\u00ed kompil\u00e1tor, p\u0159id\u00e1vaj\u00ed n\u011bjak\u00e9 heuristiky; nap\u0159\u00edklad aby zastavili inlining, kdy\u017e dos\u00e1hne ur\u010dit\u00e9 dostate\u010dn\u011b velk\u00e9 velikosti, proto\u017ee alokace v\u0161echno pokaz\u00ed. Tak vznik\u00e1 zlomek na grafu v\u00fdkonu \u2013 inlinuje\u0161, inlinuje\u0161, v\u00fdkon pomalu roste \u2013 a pak bum! \u2013 klesne dol\u016f jako blesk, proto\u017ee jsi inlinoval p\u0159\u00edli\u0161 mnoho. Tak to \u0161lo a\u017e do p\u0159\u00edchodu Javy. Java vy\u017eaduje daleko v\u00edce inliningov\u00e1n\u00ed, tak\u017ee jsem musel ud\u011blat sv\u016fj alok\u00e1tor mnohem agresivn\u011bj\u0161\u00edm, aby se vyrovnal, a neklesnul, a kdy\u017e inlinuje\u0161 p\u0159\u00edli\u0161 mnoho \u2013 za\u010dne spilit, ale p\u0159esto nakonec nastane okam\u017eik \"u\u017e nen\u00ed v\u00edce spilitov\u00e1n\u00ed\". To je zaj\u00edmav\u00e9 pozorov\u00e1n\u00ed, kter\u00e9 mi p\u0159i\u0161lo tak n\u011bjak z ni\u010deho, nen\u00ed to o\u010dividn\u00e9, ale dob\u0159e se to vyplatilo. Pustil jsem se do agresivn\u00edho inliningov\u00e1n\u00ed a to m\u011b p\u0159ivedlo na m\u00edsta, kde je v\u00fdkon Javy a C vedle sebe. Jsou opravdu bl\u00edzko \u2013 mohu ps\u00e1t k\u00f3d na Jav\u011b, kter\u00fd bude v\u00fdrazn\u011b rychlej\u0161\u00ed ne\u017e k\u00f3d v C a podobn\u011b, ale v pr\u016fm\u011bru, v \u0161ir\u0161\u00edm kontextu v\u011bc\u00ed, jsou p\u0159ibli\u017en\u011b srovnateln\u00e9. Mysl\u00edm, \u017ee \u010d\u00e1st t\u00e9to z\u00e1sluhy pat\u0159\u00ed alok\u00e1toru registr\u016f, kter\u00fd mi umo\u017e\u0148uje inlinovat maxim\u00e1ln\u011b bez rozmyslu. Prost\u011b inlinuji v\u0161e, co vid\u00edm. Ot\u00e1zka je, zda alok\u00e1tor funguje dob\u0159e, zda vznik\u00e1 v\u00fdsledn\u011b rozumn\u011b pracuj\u00edc\u00ed k\u00f3d. Tady byla velk\u00e1 v\u00fdzva: pochopit to v\u0161e a dostat to do chodu.<\/p>\n<p><\/p>\n<h1 id=\"nemnogo-pro-allokaciyu-registrov-i-mnogoyadernost\">Trochu o alokaci registr\u016f a v\u00edcej\u00e1drovosti<\/h1>\n<p><\/p>\n<p><strong>Vladimir<\/strong>: Probl\u00e9my jako alokace registr\u016f se zdaj\u00ed b\u00fdt n\u011bjak\u00fdm v\u011b\u010dn\u00fdm nep\u0159etr\u017eit\u00fdm t\u00e9matem. Je zaj\u00edmav\u00e9, zda n\u011bkdy n\u011bjak\u00fd n\u00e1pad vypadal slibn\u011b, ale pak neusp\u011bl v praxi?<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: Samoz\u0159ejm\u011b! Alokace registr\u016f je oblast, v n\u00ed\u017e se sna\u017e\u00edte naj\u00edt n\u011bjak\u00e9 heuristiky pro \u0159e\u0161en\u00ed NP-\u00fapln\u00e9ho probl\u00e9mu. A nikdy nem\u016f\u017eete dos\u00e1hnout ide\u00e1ln\u00edho \u0159e\u0161en\u00ed, \u017ee? To je prost\u011b nemo\u017en\u00e9. Pod\u00edvejte se, Ahead of Time kompilace \u2013 ta tak\u00e9 nefunguje dob\u0159e. Hovo\u0159\u00edme zde o n\u011bjak\u00fdch pr\u016fm\u011brn\u00fdch p\u0159\u00edpadech. O typick\u00e9m v\u00fdkonu, tak\u017ee je mo\u017en\u00e9 j\u00edt a m\u011b\u0159it n\u011bco, co pova\u017eujete za dobr\u00fd typick\u00fd v\u00fdkon \u2013 nakonec, p\u0159ece pracujete na tom, aby se zlep\u0161il! Alokace registr\u016f je t\u00e9ma, kter\u00e9 se zcela v\u011bnuje v\u00fdkonu. Jakmile m\u00e1te prvn\u00ed prototyp, kter\u00fd funguje a d\u011bl\u00e1, co m\u00e1, za\u010d\u00edn\u00e1 pr\u00e1ce na v\u00fdkonu. Mus\u00edte se nau\u010dit dob\u0159e m\u011b\u0159it. Pro\u010d je to d\u016fle\u017eit\u00e9? Pokud jsou k dispozici jasn\u00e1 data, m\u016f\u017eete se pod\u00edvat na r\u016fzn\u00e9 \u010d\u00e1sti a vid\u011bt: aha, to tu pomohlo, ale tady se v\u0161echno rozpadlo! Objev\u00ed se n\u011bjak\u00e9 dobr\u00e9 n\u00e1pady, p\u0159id\u00e1te novou heuristiku a najednou v\u0161echno za\u010dne pr\u016fm\u011brn\u011b fungovat o n\u011bco l\u00e9pe. Nebo neza\u010dne. M\u011bl jsem spoustu p\u0159\u00edpad\u016f, kdy jsme se sna\u017eili o p\u011bt procent v\u00fdkonu, kter\u00e9 d\u011blily na\u0161i implementaci od p\u0159edchoz\u00edho alok\u00e1toru. A poka\u017ed\u00e9 to vypad\u00e1 takto: n\u011bkde vyhr\u00e1l, n\u011bkde prohr\u00e1l. Pokud m\u00e1te dobr\u00e9 n\u00e1stroje pro anal\u00fdzu v\u00fdkonu, m\u016f\u017eete naj\u00edt prohr\u00e1vaj\u00edc\u00ed n\u00e1pady a pochopit, pro\u010d prohr\u00e1vaj\u00ed. Mo\u017en\u00e1 stoj\u00ed za to nechat v\u0161echno jak je, nebo se v\u00e1\u017en\u011b pustit do lad\u011bn\u00ed, nebo j\u00edt a opravit n\u011bco jin\u00e9ho. Je to cel\u00fd soubor v\u011bc\u00ed! Ud\u011blal jsem tenhle skv\u011bl\u00fd hack, ale pot\u0159ebujete i tenhle, a tenhle, a tenhle \u2013 a jejich celkov\u00e1 kombinace p\u0159in\u00e1\u0161\u00ed n\u011bkter\u00e1 zlep\u0161en\u00ed. A ojedin\u011bl\u00e9 n\u00e1pady mohou selhat. Takov\u00e1 je povaha pr\u00e1ce na v\u00fdkonu NP-\u00fapln\u00fdch \u00faloh.<\/p>\n<p><\/p>\n<p><strong>Vladimir<\/strong>: M\u00e1m pocit, \u017ee v\u011bci jako barven\u00ed v alok\u00e1torech jsou u\u017e vy\u0159e\u0161en\u00e9. No, pro v\u00e1s vy\u0159e\u0161en\u00e9, soud\u011b podle toho, co \u0159\u00edk\u00e1te, tak m\u00e1 to v\u016fbec smysl\u2026<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: Nen\u00ed to \u0159e\u0161eno jako takov\u00e9. To ty bys to m\u011bl prom\u011bnit na \u00ab\u0159e\u0161en\u00e9\u00bb. Existuj\u00ed obt\u00ed\u017en\u00e9 \u00fakoly a je pot\u0159eba je \u0159e\u0161it. Kdy\u017e je to hotovo, p\u0159ich\u00e1z\u00ed \u010das na pr\u00e1ci na v\u00fdkonu. K t\u00e9to pr\u00e1ci je t\u0159eba p\u0159istupovat odpov\u00eddaj\u00edc\u00edm zp\u016fsobem \u2013 d\u011blat benchmarky, shroma\u017e\u010fovat metriky, vysv\u011btlovat situace, kdy p\u0159i n\u00e1vratu k p\u0159edchoz\u00ed verzi tv\u016fj star\u00fd hack op\u011bt za\u010dal fungovat (nebo naopak, p\u0159estal). A neustupovat, dokud n\u011b\u010deho nedos\u00e1hne\u0161. Jak u\u017e jsem \u0159\u00edkal, pokud jde o skv\u011bl\u00e9 n\u00e1pady, kter\u00e9 nevy\u0161ly, ale v oblasti alokace registr\u016f je jich zhruba nekone\u010dn\u00e9 mno\u017estv\u00ed. M\u016f\u017ee\u0161 nap\u0159\u00edklad \u010d\u00edst v\u011bdeck\u00e9 publikace. A\u010dkoli se tato oblast nyn\u00ed vyv\u00edj\u00ed mnohem pomaleji a st\u00e1v\u00e1 se jasn\u011bj\u0161\u00ed ne\u017e v dob\u011b svoje mladosti. Nicm\u00e9n\u011b, v t\u00e9to oblasti pracuje cel\u00e1 nekone\u010dnost lid\u00ed a v\u0161echny jejich n\u00e1pady stoj\u00ed za zkou\u0161ku, v\u0161echny \u010dekaj\u00ed na sv\u016fj \u010das. A nem\u016f\u017ee\u0161 \u0159\u00edci, jak dobr\u00e9 jsou, pokud je nevyzkou\u0161\u00ed\u0161. Jak dob\u0159e se integruj\u00ed se v\u0161\u00edm ostatn\u00edm ve tv\u00e9m alok\u00e1toru, proto\u017ee alok\u00e1tor d\u011bl\u00e1 spoustu v\u011bc\u00ed, a n\u011bjak\u00e9 n\u00e1pady ve tv\u00e9m konkr\u00e9tn\u00edm alok\u00e1toru nebudou fungovat, zat\u00edmco v jin\u00e9m alok\u00e1toru \u2013 klidn\u011b. Hlavn\u00ed zp\u016fsob, jak vyhr\u00e1t pro alok\u00e1tor \u2013 je vyt\u00e1hnout pomal\u00e9 v\u011bci za hranice hlavn\u00ed cesty a n\u00e1siln\u011b je rozd\u011blit na hranic\u00edch pomal\u00fdch cest. Tak\u017ee, pokud chce\u0161 spustit GC, j\u00edt po pomal\u00e9 cest\u011b, deoptimalizovat se, vyhodit v\u00fdjimku, v\u0161echno v tomto duchu \u2013 v\u00ed\u0161, \u017ee tyto v\u011bci jsou relativn\u011b vz\u00e1cn\u00e9. A skute\u010dn\u011b vz\u00e1cn\u00e9, zkontroloval jsem to. D\u011bl\u00e1\u0161 dal\u0161\u00ed pr\u00e1ci a d\u00edky tomu zmiz\u00ed spousta omezen\u00ed na t\u011bch pomal\u00fdch cest\u00e1ch, ale to nen\u00ed p\u0159\u00edli\u0161 d\u016fle\u017eit\u00e9, proto\u017ee jsou pomal\u00e9 a m\u00e1lokdy se po nich chod\u00ed. Nap\u0159\u00edklad nulov\u00fd ukazatel \u2013 nikdy se to nestane, \u017ee? Je pot\u0159eba m\u00edt n\u011bkolik cest pro r\u016fzn\u00e9 v\u011bci, ale nem\u011bly by se m\u00edsit na hlavn\u00ed.\u00a0<\/p>\n<p><\/p>\n<p><strong>Vladimir<\/strong>: Co si mysl\u00edte o v\u00edcej\u00e1drovosti, kdy\u017e je jader hned tis\u00edce? Je to u\u017eite\u010dn\u00e1 v\u011bc?<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: \u00dasp\u011bch GPU ukazuje, \u017ee je to docela u\u017eite\u010dn\u00e9!<\/p>\n<p><\/p>\n<p><strong>Vladimir<\/strong>: Jsou celkem specializovan\u00e9. A co procesory v\u0161eobecn\u00e9ho ur\u010den\u00ed?<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: To byla obchodn\u00ed model Azul. Odpov\u011b\u010f p\u0159i\u0161la je\u0161t\u011b v \u00e9\u0159e, kdy lid\u00e9 velmi oce\u0148ovali p\u0159edv\u00eddateln\u00fd v\u00fdkon. Tehdy bylo obt\u00ed\u017en\u00e9 ps\u00e1t paraleln\u00ed k\u00f3d. Model k\u00f3dov\u00e1n\u00ed H2O se dob\u0159e \u0161k\u00e1luje, ale nen\u00ed to model pro obecn\u00e9 pou\u017eit\u00ed. Snad jen m\u00edrn\u011b obecn\u011bj\u0161\u00ed ve srovn\u00e1n\u00ed s pou\u017e\u00edv\u00e1n\u00edm GPU. Mluv\u00edme o slo\u017eitosti v\u00fdvoje takov\u00e9 v\u011bci nebo o slo\u017eitosti jej\u00edho pou\u017e\u00edv\u00e1n\u00ed? Nap\u0159\u00edklad, zaj\u00edmavou lekci mi dala Azul, docela nepatrnou: mal\u00e9 cache jsou v po\u0159\u00e1dku.\u00a0<\/p>\n<p><\/p>\n<h1 id=\"samyy-bolshoy-chellenzh-v-zhizni\">Nejv\u011bt\u0161\u00ed v\u00fdzva v \u017eivot\u011b<\/h1>\n<p><\/p>\n<p><strong>Vladimir<\/strong>: Co \u0159\u00edk\u00e1te na netechnick\u00e9 v\u00fdzvy?<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: Nejv\u011bt\u0161\u00ed v\u00fdzvou bylo b\u00fdt\u2026 nezdvo\u0159il\u00fd a nesympatick\u00fd k lidem. A jako d\u016fsledek jsem se neust\u00e1le ocital v extr\u00e9mn\u011b konflikt\u010dn\u00edch situac\u00edch. V t\u011bch, kde jsem v\u011bd\u011bl, \u017ee v\u0161echno jde \u0161patn\u011b, ale nev\u011bd\u011bl jsem, jak d\u00e1l postupovat p\u0159i \u0159e\u0161en\u00ed t\u011bchto probl\u00e9m\u016f a nedok\u00e1zal jsem si s nimi poradit. Mnoho dlouhotrvaj\u00edc\u00edch probl\u00e9m\u016f, kter\u00e9 trvaly des\u00edtky let, vzniklo pr\u00e1v\u011b takto. To, \u017ee v Jav\u011b existuj\u00ed kompil\u00e1tory C1 a C2 \u2013 je p\u0159\u00edm\u00fdm d\u016fsledkem toho. To, \u017ee v Jav\u011b po dobu deseti let nebylo v\u00edcestup\u0148ov\u00e9 kompilace \u2013 tak\u00e9 p\u0159\u00edm\u00fd d\u016fsledek. Je z\u0159ejm\u00e9, \u017ee takov\u00fd syst\u00e9m jsme pot\u0159ebovali, ale nen\u00ed z\u0159ejm\u00e9 \u2013 pro\u010d tady nebyl. M\u011bl jsem probl\u00e9my s jedn\u00edm in\u017een\u00fdrem\u2026 nebo skupinou in\u017een\u00fdr\u016f. P\u0159ed mnoha lety, kdy\u017e jsem za\u010dal pracovat ve Sunu, jsem byl\u2026 No, ne jen tehdy, j\u00e1 m\u011bl vlastn\u011b v\u017edycky sv\u016fj n\u00e1zor na v\u0161echno. A pova\u017eoval jsem za pravdu, \u017ee sta\u010d\u00ed svou pravdu prost\u011b \u0159\u00edct na plnou hubu. Zvl\u00e1\u0161\u0165 kdy\u017e jsem byl \u0161okuj\u00edc\u00edm zp\u016fsobem pravdiv\u00fd v\u011bt\u0161inu \u010dasu. A pokud se ti takov\u00fd p\u0159\u00edstup nel\u00edb\u00ed\u2026 zejm\u00e9na pokud jsi zjevn\u011b na omylu a d\u011bl\u00e1\u0161 hlouposti\u2026 Obecn\u011b, m\u00e1lo lid\u00ed dok\u00e1zalo sn\u00e1\u0161et takovou formu komunikace. I kdy\u017e n\u011bkte\u0159\u00ed ano, nap\u0159\u00edklad j\u00e1. Cel\u00fd sv\u016fj \u017eivot jsem postavil na meritokratick\u00fdch principech. Pokud mi uk\u00e1\u017eete n\u011bco \u0161patn\u00e9ho, okam\u017eit\u011b se oto\u010d\u00edm a \u0159eknu: \u0159ekl jsi nesmysl. P\u0159itom se samoz\u0159ejm\u011b omlouv\u00e1m, a tak d\u00e1le, vyzdvihuji z\u00e1sluhy, pokud n\u011bjak\u00e9 jsou, a d\u011bl\u00e1m dal\u0161\u00ed spr\u00e1vn\u00e9 kroky. Na druhou stranu, jsem \u0161okuj\u00edc\u00edm zp\u016fsobem pravdiv\u00fd \u0161okuj\u00edc\u00edm velk\u00fdm procentem celkov\u00e9ho \u010dasu. A to ve vztaz\u00edch s lidmi nefunguje moc dob\u0159e. Nesna\u017e\u00edm se b\u00fdt mil\u00fd, ale kladu probl\u00e9m na st\u016fl. \u201eTohle nikdy nebude fungovat, proto\u017ee jedni, dva a t\u0159i.\u201c A oni: \u201eOch!\u201c. Byly i jin\u00e9 d\u016fsledky, kter\u00e9 by asi bylo lep\u0161\u00ed p\u0159esko\u010dit: nap\u0159\u00edklad vedly k rozvodu s man\u017eelkou a des\u00edtkov\u00e9mu obdob\u00ed deprese po tom.<\/p>\n<p><\/p>\n<p>V\u00fdzva je boj s lidmi a jejich vn\u00edm\u00e1n\u00edm toho, co m\u016f\u017eete nebo nem\u016f\u017eete d\u011blat, co je d\u016fle\u017eit\u00e9 a co nen\u00ed. Bylo mnoho v\u00fdzev ohledn\u011b stylu k\u00f3dov\u00e1n\u00ed. St\u00e1le p\u00ed\u0161u hodn\u011b k\u00f3du, a tehdy jsem se musel dokonce zpomalit, proto\u017ee jsem d\u011blal p\u0159\u00edli\u0161 mnoho paraleln\u00edch \u00fakol\u016f a d\u011blal je \u0161patn\u011b, m\u00edsto abych se soust\u0159edil na jeden. Kdy\u017e se ohl\u00e9dnu zp\u011bt, napsal jsem polovinu k\u00f3du t\u00fdmu Java JIT, t\u00fdmu C2. N\u00e1sleduj\u00edc\u00ed nejrychlej\u0161\u00ed kod\u00e9r psal polovinu tak rychle, dal\u0161\u00ed je\u0161t\u011b pomaleji, a to bylo exponenci\u00e1ln\u00ed pokles. Sedm\u00fd \u010dlov\u011bk v tomto \u0159adu byl velmi, velmi pomal\u00fd \u2013 tak to v\u017edycky b\u00fdv\u00e1! Pro\u0161el jsem spoustou k\u00f3du. Sledoval jsem, kdo co p\u00ed\u0161e, bez v\u00fdjimek, z\u00edral jsem na jejich k\u00f3d, kontroloval ka\u017ed\u00e9ho z nich, a p\u0159esto jsem st\u00e1le psal v\u00edc ne\u017e kdokoliv z nich. S lidmi tento p\u0159\u00edstup nefunguje moc dob\u0159e. N\u011bkte\u0159\u00ed to nemaj\u00ed r\u00e1di. A kdy\u017e to nezvl\u00e1daj\u00ed, za\u010d\u00ednaj\u00ed se objevovat v\u0161echny mo\u017en\u00e9 st\u00ed\u017enosti. Nap\u0159\u00edklad mi jednou \u0159ekli, abych p\u0159estal ps\u00e1t k\u00f3d, proto\u017ee p\u00ed\u0161u p\u0159\u00edli\u0161 mnoho k\u00f3du, a to ohro\u017euje t\u00fdm, a mn\u011b to v\u0161echno zn\u011blo jako vtip: chlape, pokud cel\u00e1 zb\u00fdvaj\u00edc\u00ed parta zmiz\u00ed a j\u00e1 budu pokra\u010dovat v psan\u00ed k\u00f3du, ztrat\u00ed\u0161 jen polovinu t\u00fdmu. Na druhou stranu, pokud budu pokra\u010dovat v psan\u00ed k\u00f3du a ty ztrat\u00ed\u0161 polovinu t\u00fdmu \u2013 to zn\u00ed jako velmi \u0161patn\u00fd management. Nikdy jsem o tom moc nep\u0159em\u00fd\u0161lel, nikdy jsem to nezmi\u0148oval, ale p\u0159esto to bylo n\u011bkde v m\u00e9 hlav\u011b. V pozad\u00ed v\u011bdom\u00ed se mihotala my\u0161lenka: \u201eCo si d\u011bl\u00e1te srandu?\u201c. Tedy, nejv\u011bt\u0161\u00edm probl\u00e9mem jsem byl j\u00e1 a m\u00e9 vztahy s lidmi. Te\u010f se l\u00e9pe ch\u00e1pu, dlouho jsem byl team leader mezi program\u00e1tory, a te\u010f lidem \u0159\u00edk\u00e1m p\u0159\u00edmo: v\u00ed\u0161, jsem takov\u00fd, jak\u00fd jsem, a budete si muset se mnou poradit \u2013 nevad\u00ed, kdy\u017e tu chv\u00edli z\u016fstanu? A kdy\u017e se s t\u00edm srovnali, v\u0161echno za\u010dalo fungovat. Ve skute\u010dnosti nejsem ani \u0161patn\u00fd, ani dobr\u00fd, nem\u00e1m \u017e\u00e1dn\u00e9 \u0161patn\u00e9 \u00famysly nebo sobeck\u00e9 c\u00edle, to je prost\u011b moje podstata, a je t\u0159eba s t\u00edm n\u011bjak \u017e\u00edt.<\/p>\n<p><\/p>\n<p><strong>Andrej<\/strong>Ned\u00e1vno se v\u0161ichni za\u010dali bavit o sebereflexi pro introverty a v\u016fbec o soft skills. Co k tomu \u0159\u00edct?<\/p>\n<p><\/p>\n<p><strong>Cliff<\/strong>: Ano, to byla porozum\u011bn\u00ed a lekce, kterou jsem si odnesl z rozvodu s man\u017eelkou. Co jsem si z rozvodu vzal \u2013 je to porozum\u011bn\u00ed sob\u011b sam\u00e9mu. Tak jsem za\u010dal ch\u00e1pat ostatn\u00ed lidi. Ch\u00e1pat, jak toto interakce funguje. To vedlo k objev\u016fm jeden za druh\u00fdm. Objevilo se v\u011bdom\u00ed, kdo jsem a co ze sebe p\u0159edstavuj\u00ed. Co d\u011bl\u00e1m: bu\u010f jsem zanepr\u00e1zdn\u011bn \u00fakoly, nebo se vyh\u00fdb\u00e1m konfliktu, nebo n\u011bco jin\u00e9ho \u2013 a takov\u00e1 \u00farove\u0148 sebereflexe opravdu pom\u00e1h\u00e1 udr\u017eet se na uzd\u011b. Pot\u00e9 v\u0161e jde mnohem sn\u00e1ze. Jedna v\u011bc, kterou jsem zjistil nejen u sebe, ale i u ostatn\u00edch program\u00e1tor\u016f \u2013 neschopnost verbalizovat my\u0161lenky, kdy\u017e jsi ve stavu emocion\u00e1ln\u00edho stresu. Nap\u0159\u00edklad sed\u00ed\u0161 a k\u00f3duje\u0161, jsi v m\u00f3du flow a najednou k tob\u011b n\u011bkdo p\u0159ib\u011bhne a za\u010dne v hysterii k\u0159i\u010det, \u017ee se n\u011bco pokazilo, a te\u010f ti hroz\u00ed extr\u00e9mn\u00ed opat\u0159en\u00ed. A ty nem\u016f\u017ee\u0161 \u0159\u00edct ani slovo, proto\u017ee jsi v emocion\u00e1ln\u00edm stresu. Z\u00edskan\u00e9 znalosti ti umo\u017e\u0148uj\u00ed se na tento moment p\u0159ipravit, pro\u017e\u00edt ho a p\u0159ej\u00edt k pl\u00e1nu \u00fastupu, po kter\u00e9m m\u016f\u017ee\u0161 n\u011bco ud\u011blat. Tak\u017ee ano, kdy\u017e za\u010dne\u0161 ch\u00e1pat, jak to cel\u00e9 funguje \u2013 je to obrovsk\u00e1 \u017eivotn\u00ed ud\u00e1lost.\u00a0<br \/>\nS\u00e1m jsem nedok\u00e1zal naj\u00edt ta spr\u00e1vn\u00e1 slova, ale zapamatoval jsem si sekvenci akc\u00ed. Podstatou je, \u017ee tato reakce je stejn\u011b fyzick\u00e1, jako je verb\u00e1ln\u00ed, a pot\u0159ebuje\u0161 prostor. Takov\u00fd prostor, v zenov\u00e9m smyslu. To je pr\u00e1v\u011b to, co je t\u0159eba vysv\u011btlit, a pak se hned st\u00e1hnout \u2013 \u010dist\u011b fyzicky ustoupit. Kdy\u017e ml\u010d\u00edm, mohu zpracovat situaci v emoc\u00edch. Jakmile adrenalin doraz\u00ed do mozku a p\u0159epne t\u011b do m\u00f3du \u201eboj nebo \u00fat\u011bk\u201c, u\u017e nem\u016f\u017ee\u0161 nic \u0159\u00edct, ne \u2013 te\u010f jsi idiot, in\u017een\u00fdr pro bit\u00ed, neschopn\u00fd adekv\u00e1tn\u00ed reakce nebo alespo\u0148 zastavit \u00fatok, a \u00fato\u010dn\u00edk m\u016f\u017ee znovu a znovu \u00fato\u010dit. Nejd\u0159\u00edve se mus\u00ed\u0161 znovu st\u00e1t s\u00e1m sebou, z\u00edskat kontrolu, vystoupit z m\u00f3du \u201eboj nebo \u00fat\u011bk\u201c. <\/p>\n<p><\/p>\n<p>A pr\u00e1v\u011b k tomu je pot\u0159eba verb\u00e1ln\u00ed prostor. Prost\u011b voln\u00fd prostor. Pokud u\u017e v\u016fbec n\u011bco \u0159\u00edkat, m\u016f\u017eete \u0159\u00edct p\u0159esn\u011b tohle, a pak si j\u00edt skute\u010dn\u011b naj\u00edt \"prostor\": j\u00edt se proj\u00edt po parku, zamknout se v koupeln\u011b \u2013 to je jedno. Hlavn\u00ed je do\u010dasn\u011b se odpojit od t\u00e9 situace. Jakmile se na n\u011bkolik sekund odpoj\u00ed\u0161, kontrola se vrac\u00ed, za\u010d\u00edn\u00e1\u0161 myslet st\u0159\u00edzliv\u011b. \"Dob\u0159e, j\u00e1 p\u0159ece nejsem n\u011bjak\u00fd idiot, ned\u011bl\u00e1m hloup\u00e9 v\u011bci, jsem docela u\u017eite\u010dn\u00fd \u010dlov\u011bk.\" Jakmile se ti poda\u0159\u00ed p\u0159esv\u011bd\u010dit s\u00e1m sebe, p\u0159ich\u00e1z\u00ed \u010das na dal\u0161\u00ed krok: pochopit, co se stalo. Byl jsi napaden, \u00fatok p\u0159i\u0161el odnikud, to byla ne\u010destn\u00e1, podl\u00e1 past. To je \u0161patn\u011b. Dal\u0161\u00ed krok \u2013 pochopit, pro\u010d to \u00fato\u010dn\u00edkovi bylo pot\u0159eba. Opravdu, pro\u010d? Mo\u017en\u00e1 proto, \u017ee je s\u00e1m v zu\u0159ivosti? Pro\u010d je v zu\u0159ivosti? Nap\u0159\u00edklad proto, \u017ee s\u00e1m selhal a nem\u016f\u017ee p\u0159ijmout zodpov\u011bdnost? Takto bys m\u011bl pe\u010dliv\u011b zpracovat celou situaci. Ale k tomu pot\u0159ebuje\u0161 prostor pro man\u00e9vrov\u00e1n\u00ed, verb\u00e1ln\u00ed prostor. Prvn\u00ed krok \u2013 p\u0159eru\u0161it verb\u00e1ln\u00ed kontakt. Uj\u00edt od slovn\u00edho projedn\u00e1v\u00e1n\u00ed. Zru\u0161it ho, odej\u00edt co nejrychleji. Pokud je to telefonn\u00ed hovor \u2013 prost\u011b polo\u017e sluch\u00e1tko \u2013 to je dovednost, kterou jsem z\u00edskal z komunikace s b\u00fdvalou man\u017eelkou. Pokud rozhovor nikam nevede, prost\u011b \u0159ekni \"sbohem\" a zav\u011bs. Na druh\u00e9 stran\u011b sluch\u00e1tka: \"bla-bla-bla\", ty odpov\u00edd\u00e1\u0161: \"aha, \u010dau!\" a pokl\u00e1d\u00e1\u0161 sluch\u00e1tko. Prost\u011b p\u0159eru\u0161\u00ed\u0161 rozhovor. O p\u011bt minut pozd\u011bji, kdy\u017e se ti vrac\u00ed schopnost racion\u00e1ln\u011b myslet, tro\u0161ku jsi se uklidnil, st\u00e1v\u00e1 se mo\u017en\u00e9 promyslet, co se vlastn\u011b stalo a co bude d\u00e1l. A za\u010d\u00edt formulovat promy\u0161lenou odpov\u011b\u010f, m\u00edsto abych jen reagoval na emoce. Pro m\u011b bylo proz\u0159en\u00ed v sebereflexi pr\u00e1v\u011b to, \u017ee v p\u0159\u00edpad\u011b emocion\u00e1ln\u00edho stresu nemohu mluvit. Vystoupit z tohoto stavu, promyslet a napl\u00e1novat, jak odpov\u011bd\u011bt a kompenzovat probl\u00e9my \u2013 to jsou spr\u00e1vn\u00e9 kroky, kdy\u017e nem\u016f\u017ee\u0161 mluvit. Nejjednodu\u0161\u0161\u00ed zp\u016fsob je ut\u00e9ct ze situace, ve kter\u00e9 se projevuje emocion\u00e1ln\u00ed stres, a jednodu\u0161e p\u0159estat se na tomto stresu pod\u00edlet. Pot\u00e9 z\u00edsk\u00e1\u0161 schopnost myslet, kdy\u017e m\u016f\u017ee\u0161 myslet, objev\u00ed se mo\u017enost mluvit, a tak d\u00e1le.<\/p>\n<p><\/p>\n<p>Mimochodem, advok\u00e1t protistrany se pokou\u0161\u00ed to s tebou d\u011blat \u2013 nyn\u00ed u\u017e je jasn\u00e9, pro\u010d. Proto\u017ee m\u00e1 mo\u017enost t\u011b potla\u010dit do takov\u00e9ho stavu, \u017ee nebude\u0161 moci ani vyslovit sv\u00e9 jm\u00e9no, nap\u0159\u00edklad. V doslovn\u00e9m smyslu, nebude\u0161 moci mluvit. Pokud se ti to d\u011bje a pokud v\u00ed\u0161, \u017ee se ocitne\u0161 na m\u00edst\u011b, kde se vedou slovn\u00ed bitvy, na m\u00edst\u011b jako je soud, m\u016f\u017ee\u0161 p\u0159ij\u00edt se sv\u00fdm pr\u00e1vn\u00edkem. Pr\u00e1vn\u00edk t\u011b zastoup\u00ed a ukon\u010d\u00ed slovn\u00ed \u00fatok, a ud\u011bl\u00e1 to zcela leg\u00e1ln\u00edm zp\u016fsobem, a k tob\u011b se vr\u00e1t\u00ed ztracen\u00e9 zenov\u00e9 prostor. Nap\u0159\u00edklad, p\u00e1rkr\u00e1t jsem musel zavolat rodin\u011b, soudce k tomu p\u0159istupoval celkem p\u0159\u00e1telsky, ale advok\u00e1t protistrany na m\u011b po\u0159\u00e1d k\u0159i\u010del a k\u0159i\u010del, ani jsem nemohl promluvit. V takov\u00fdch p\u0159\u00edpadech pro m\u011b nejl\u00e9pe funguje vyu\u017eit\u00ed zprost\u0159edkovatele. Zprost\u0159edkovatel ukon\u010duje ve\u0161ker\u00fd ten tlak, kter\u00fd na tebe neust\u00e1le p\u016fsob\u00ed, znovu objevuje\u0161 pot\u0159ebn\u00e9 zenov\u00e9 prostor, spolu s n\u00edm se vrac\u00ed schopnost mluvit. Je to cel\u00e1 oblast znalost\u00ed, ve kter\u00e9 je t\u0159eba se hodn\u011b u\u010dit, hodn\u011b objevovat uvnit\u0159 sebe, a to se prom\u011bn\u00ed v vysokou \u00farove\u0148 strategick\u00fdch rozhodnut\u00ed, kter\u00e1 jsou r\u016fzn\u00e1 pro r\u016fzn\u00e9 lidi. N\u011bkdo tyto v\u00fd\u0161e popsan\u00e9 probl\u00e9my nem\u00e1, obvykle je nemaj\u00ed lid\u00e9, kte\u0159\u00ed se profesion\u00e1ln\u011b zab\u00fdvaj\u00ed prodejem. V\u0161ichni ti, kte\u0159\u00ed si vyd\u011bl\u00e1vaj\u00ed na \u017eivobyt\u00ed slovy \u2013 zn\u00e1m\u00ed zp\u011bv\u00e1ci, b\u00e1sn\u00edci, n\u00e1bo\u017een\u0161t\u00ed v\u016fdci a politici, ti maj\u00ed v\u017edy co \u0159\u00edct. Ti nemaj\u00ed takov\u00e9 probl\u00e9my, ale j\u00e1 je m\u00e1m.<\/p>\n<p><\/p>\n<p><strong>Andrej<\/strong>: To bylo\u2026 ne\u010dekan\u00e9. Skv\u011bl\u00e9, u\u017e jsme toho dost probrali a je \u010das tohle interview ukon\u010dit. Ur\u010dit\u011b se setk\u00e1me na konferenci a budeme moci tento dialog pokra\u010dovat. Uvid\u00edme se na Hydra!<\/p>\n<p><\/p>\n<blockquote><p>Komunikaci s Cliffem bude mo\u017en\u00e9 pokra\u010dovat na konferenci Hydra 2019, kter\u00e1 se uskute\u010dn\u00ed 11.-12. \u010dervence 2019 v Petrohrad\u011b. P\u0159ijede s prezentac\u00ed <noindex><a rel=\"nofollow\" href=\"https:\/\/hydraconf.com\/2019\/talks\/2jix5mst7iduyp9linqhfj\/?utm_source=habr&amp;utm_medium=45871\">\u201eZku\u0161enosti s hardwarovou transak\u010dn\u00ed pam\u011bt\u00ed Azul\u201c<\/a><\/noindex>. Vstupenky si m\u016f\u017eete zakoupit <noindex><a rel=\"nofollow\" href=\"https:\/\/hydraconf.ru\/?utm_source=habr&amp;utm_medium=458718\">na ofici\u00e1ln\u00edch str\u00e1nk\u00e1ch<\/a><\/noindex>.<\/p><\/blockquote>\n<p>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/jugru\/blog\/458718\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041a\u043b\u0438\u0444\u0444 \u041a\u043b\u0438\u043a \u2014 CTO \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Cratus (IoT \u0441\u0435\u043d\u0441\u043e\u0440\u044b \u0434\u043b\u044f \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432), \u043e\u0441\u043d\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0438 \u0441\u043e\u043e\u0441\u043d\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0442\u0430\u0440\u0442\u0430\u043f\u043e\u0432 (\u0432\u043a\u043b\u044e\u0447\u0430\u044f Rocket Realtime School, Neurensic \u0438 H2O.ai) \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u043c\u0438 \u044d\u043a\u0437\u0438\u0442\u0430\u043c\u0438. \u041a\u043b\u0438\u0444\u0444 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u0432\u043e\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0432 15 \u043b\u0435\u0442 (Pascal \u0434\u043b\u044f TRS Z-80)! \u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u0437\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u043d\u0430\u0434 \u04212 \u0432 Java (the Sea of Nodes IR). \u042d\u0442\u043e\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043f\u043e\u043a\u0430\u0437\u0430\u043b [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-35851","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041a\u043b\u0438\u0444\u0444 \u041a\u043b\u0438\u043a \u2014.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/bolshoe-intervyu-s-kliffom-klikom-ottsom-jit-kompilyatsii-v-java\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0411\u043e\u043b\u044c\u0448\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u044c\u044e \u0441 \u041a\u043b\u0438\u0444\u0444\u043e\u043c \u041a\u043b\u0438\u043a\u043e\u043c \u2014 \u043e\u0442\u0446\u043e\u043c JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0432 Java | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041a\u043b\u0438\u0444\u0444 \u041a\u043b\u0438\u043a \u2014.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/bolshoe-intervyu-s-kliffom-klikom-ottsom-jit-kompilyatsii-v-java\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:07:03+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:07:03+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Velk\u00fd rozhovor s Cliffem Clickem \u2013 otcem JIT kompilace v Java | ProHoster","description":"Cliff Click \u2013.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/bolshoe-intervyu-s-kliffom-klikom-ottsom-jit-kompilyatsii-v-java","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0411\u043e\u043b\u044c\u0448\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u044c\u044e \u0441 \u041a\u043b\u0438\u0444\u0444\u043e\u043c \u041a\u043b\u0438\u043a\u043e\u043c \u2014 \u043e\u0442\u0446\u043e\u043c JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0432 Java | ProHoster","og:description":"\u041a\u043b\u0438\u0444\u0444 \u041a\u043b\u0438\u043a \u2014.","og:url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/bolshoe-intervyu-s-kliffom-klikom-ottsom-jit-kompilyatsii-v-java","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:07:03+00:00","article:modified_time":"2019-10-31T19:07:03+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"35851","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-22 01:01:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:55:25","updated":"2026-01-22 01:01:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/35851","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=35851"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/35851\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=35851"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=35851"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=35851"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}