{"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\/lv\/blog\/administrirovanie\/bolshoe-intervyu-s-kliffom-klikom-ottsom-jit-kompilyatsii-v-java","title":{"rendered":"Liels intervija ar Klifu Kliku \u2014 JIT kompil\u0101cijas t\u0113vu Java valod\u0101","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Liels intervija ar Klifu Kliku \u2014 JIT kompil\u0101cijas t\u0113vu Java valod\u0101\" src=\"\/wp-content\/uploads\/2019\/07\/9ea9740ef74c0ae14d334482af115222.png\" style=\"display:block;margin: 0 auto;\" \/><strong>Kliffs Kliks<\/strong> \u2014 CTO uz\u0146\u0113mum\u0101 Cratus (IoT sensori procesu uzlabo\u0161anai), dibin\u0101t\u0101js un l\u012bdzdibin\u0101t\u0101js vair\u0101kiem start-up uz\u0146\u0113mumiem (ieskaitot Rocket Realtime School, Neurensic un H2O.ai) ar vair\u0101kiem veiksm\u012bgiem izie\u0161anas dar\u012bjumiem. Kliffs uzrakst\u012bja savu pirmo kompilatoru 15 gadu vecum\u0101 (Pascal priek\u0161 TRS Z-80)! Vi\u0146\u0161 ir vislab\u0101k paz\u012bstams ar darbu pie C2 valodas Java (the Sea of Nodes IR). \u0160is kompilators par\u0101d\u012bja pasaulei, ka JIT var ra\u017eot kvalitat\u012bvu kodu, kas k\u013cuva par vienu no faktoriem, k\u0101p\u0113c Java ir viena no galvenaj\u0101m m\u016bsdienu programmat\u016bras platform\u0101m. P\u0113c tam Kliffs pal\u012bdz\u0113ja uz\u0146\u0113mumam Azul Systems uzb\u016bv\u0113t 864 kodolu galveno datoru ar programmat\u016bru t\u012br\u0101 Java, kas atbalst\u012bja GC pauzes 500 gigabaitu heap\u0101 10 milisekund\u0113s. Paties\u012bb\u0101 Kliffs ir str\u0101d\u0101jis visos JVM aspektos.<br clear=\"all\"><br \/>\n\u00a0<br \/>\n\u0160is habraposts ir liels intervija ar Kliffu. M\u0113s run\u0101sim par \u0161\u0101d\u0101m t\u0113m\u0101m:<\/p>\n<p><\/p>\n<ul>\n<li>P\u0101rsl\u0113g\u0161an\u0101s uz zemo l\u012bme\u0146u optimiz\u0101cij\u0101m<\/li>\n<li>K\u0101 veikt lielu refaktoriz\u0101ciju<\/li>\n<li>Izmaksu modelis<\/li>\n<li>M\u0101c\u012bbas par zemo l\u012bme\u0146u optimiz\u0101cij\u0101m<\/li>\n<li>Praktiski piem\u0113ri veiktsp\u0113jas uzlabo\u0161anai<\/li>\n<li>K\u0101p\u0113c rad\u012bt savu programm\u0113\u0161anas valodu<\/li>\n<li>Veiktsp\u0113jas in\u017eeniera karjera<\/li>\n<li>Tehniskie izaicin\u0101jumi<\/li>\n<li>Nedaudz par re\u0123istru pie\u0161\u0137ir\u0161anu un daudzprocesoru skait\u013co\u0161anu<\/li>\n<li>Liel\u0101kais izaicin\u0101jums dz\u012bv\u0113<\/li>\n<\/ul>\n<p><\/p>\n<p>Interviju vada:<\/p>\n<p><\/p>\n<ul>\n<li><strong>Andrej Sat\u0101rin<\/strong> no Amazon Web Services. Sav\u0101 karjer\u0101 ir pasp\u0113jis str\u0101d\u0101t da\u017e\u0101dos projektos: test\u0113jis izplat\u012btu NewSQL datub\u0101zi Yandex, m\u0101ko\u0146detect\u0113\u0161anas sist\u0113mu Kaspersky laboratorij\u0101, daudzu sp\u0113l\u0113t\u0101ju sp\u0113li Mail.ru un val\u016btas cenu apr\u0113\u0137ina servisu Deutsche Bank. Interes\u0113jas par pla\u0161u aizmugur\u0113 eso\u0161o un izplat\u012bto sist\u0113mu test\u0113\u0161anu.<\/li>\n<li><strong>Vladimirs Sit\u0146ikovs<\/strong> no Netcracker. Desmit gadus str\u0101d\u0101 pie veiktsp\u0113jas un m\u0113rogotsp\u0113jas NetCracker OS \u2014 programmat\u016bra, ko lieto sakaru operatori t\u012bklu p\u0101rvald\u012bbas un t\u012bkla apr\u012bkojuma automatiz\u0101cijas procesu automatiz\u0113\u0161anai. Interes\u0113jas par Java un Oracle Database veiktsp\u0113ju. Vair\u0101k nek\u0101 desmit veiktsp\u0113jas uzlabojumu autors ofici\u0101lajam PostgreSQL JDBC draiverim.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"perehod-k-nizkourovnevym-optimizaciyam\">P\u0101rsl\u0113g\u0161an\u0101s uz zemo l\u012bme\u0146u optimiz\u0101cij\u0101m<\/h1>\n<p><\/p>\n<p><strong>Andrej<\/strong>: J\u016bs esat paz\u012bstams cilv\u0113ks JIT kompil\u0101cijas, Java un veiktsp\u0113jas jom\u0101 kopum\u0101, vai ne?\u00a0<\/p>\n<p><\/p>\n<p><strong>Kliffs<\/strong>: Tie\u0161i t\u0101!<\/p>\n<p><\/p>\n<p><strong>Andrej<\/strong>: S\u0101ksim ar visp\u0101r\u012bgiem jaut\u0101jumiem par veiktsp\u0113jas uzlabo\u0161anu. Ko j\u016bs dom\u0101jat par izv\u0113li starp augsta l\u012bme\u0146a un zemo l\u012bme\u0146u optimiz\u0101cij\u0101m, piem\u0113ram, darbu pie CPU l\u012bme\u0146a?<\/p>\n<p><\/p>\n<p><strong>Kliffs<\/strong>: \u0160eit viss ir vienk\u0101r\u0161i. \u0100tr\u0101kais kods ir tas, kuru nekad nes\u0101k. T\u0101p\u0113c vienm\u0113r j\u0101s\u0101k no augsta l\u012bme\u0146a un j\u0101str\u0101d\u0101 pie algoritmiem. Lab\u0101ka O-not\u0101cija uzvar\u0113s slikt\u0101ku O-not\u0101ciju, iz\u0146emot gad\u012bjumus, ja iejaucas pietiekami lieli koeficienti. Zema l\u012bme\u0146a lietas tiek apskat\u012btas pa\u0161\u0101s beig\u0101s. Parasti, ja esat pietiekami labi optimiz\u0113jis visu p\u0101r\u0113jo steku un joproj\u0101m ir kaut kas interesants, tad tas ar\u012b ir zems l\u012bmenis. Bet k\u0101 s\u0101kt no augsta l\u012bme\u0146a? K\u0101 zin\u0101t, ka augst\u0101 l\u012bme\u0146a darb\u0101 ir paveikts pietiekami daudz? Nu... nav nek\u0101du gatavu recep\u0161u. J\u0101izp\u0113ta probl\u0113ma, j\u0101noskaidro, ko grasies dar\u012bt (lai neveiktu nevajadz\u012bgus n\u0101kamos so\u013cus), un tad var s\u0101kt izmantot profileru, kas var pateikt kaut ko noder\u012bgu. K\u0101d\u0101 br\u012bd\u012b j\u016bs pa\u0161i saprotat, ka esat atbr\u012bvoties no nevajadz\u012bg\u0101m liet\u0101m un pien\u0101kusi laiks piev\u0113rst uzman\u012bbu zema l\u012bme\u0146a optimiz\u0101cijai. Tas noteikti ir \u012bpa\u0161a veida m\u0101ksla. Daudzi cilv\u0113ki dara nevajadz\u012bgas lietas, bet kustas tik \u0101tri, ka par sniegumu vi\u0146iem nav laika dom\u0101t. Bet t\u0101 ir, l\u012bdz br\u012bdim, kad jaut\u0101jums k\u013c\u016bst kritisks. Parasti 99% laika nevienam nav interese, ko es daru, l\u012bdz kritisk\u0101s ce\u013c\u0101 nepar\u0101d\u0101s k\u0101da svar\u012bga lieta, kas k\u0101dam interes\u0113. Un tie\u0161i tad visi s\u0101k par tevi pras\u012bt, \u201ek\u0101p\u0113c tas no pa\u0161a s\u0101kuma nedarboj\u0101s ide\u0101li\u201d. Kopum\u0101 vienm\u0113r ir kas j\u0101uzlabo sniegum\u0101. Bet 99% laika tev nav pavedienu! Tu vienk\u0101r\u0161i m\u0113\u0123ini pan\u0101kt, lai kaut kas str\u0101d\u0101tu, un \u0161\u012b procesa laik\u0101 saproti, kas ir svar\u012bgi. Nekad nav iesp\u0113jams iepriek\u0161 zin\u0101t, ka tie\u0161i \u0161is fragments ir j\u0101izveido ide\u0101ls, t\u0101p\u0113c b\u016bt\u012bb\u0101 j\u0101cen\u0161as b\u016bt ide\u0101lam vis\u0101. Bet tas nav iesp\u0113jams un t\u0101 tu nedari. Vienm\u0113r ir daudz lietu, kas j\u0101remont\u0113 \u2013 un tas ir piln\u012bgi norm\u0101li.<\/p>\n<p><\/p>\n<h1 id=\"kak-delat-bolshoy-refaktoring\">K\u0101 veikt lielu refaktoriz\u0101ciju<\/h1>\n<p><\/p>\n<p><strong>Andrej<\/strong>: K\u0101 j\u016bs str\u0101d\u0101jat pie snieguma? Tas ir univers\u0101ls jaut\u0101jums. Piem\u0113ram, vai jums ir n\u0101cies str\u0101d\u0101t pie probl\u0113m\u0101m, kas rodas no daudzu jau eso\u0161o funkcionalit\u0101tes savietojuma?<\/p>\n<p><\/p>\n<p><strong>Kliffs<\/strong>: Es cen\u0161os to izvair\u012bties. Ja es zinu, ka veiktsp\u0113ja k\u013c\u016bs par probl\u0113mu, es par to dom\u0101ju v\u0113l pirms kod\u0113\u0161anas uzs\u0101k\u0161anas, it \u012bpa\u0161i par datu strukt\u016br\u0101m. Bet bie\u017ei vien tu to atkl\u0101j tikai daudz v\u0113l\u0101k. Un tad ir j\u0101iet uz ekstr\u0113miem pas\u0101kumiem un j\u0101dara tas, ko es saucu par 'p\u0101rprogramm\u0113\u0161anu un p\u0101rvald\u012b\u0161anu': j\u0101\u0146em pietiekami liels gabals. K\u0101da da\u013ca koda t\u0101pat j\u0101p\u0101rprogramm\u0113 sakar\u0101 ar veiktsp\u0113jas probl\u0113m\u0101m vai k\u0101du citu iemeslu. K\u0101ds jebkur\u0161 koda p\u0101rprogramm\u0113\u0161anas iemesls var b\u016bt \u2013 gandr\u012bz vienm\u0113r ir lab\u0101k p\u0101rprogramm\u0113t liel\u0101ku gabalu nek\u0101 maz\u0101ku. Taj\u0101 br\u012bd\u012b visi s\u0101k dreb\u0113t no bail\u0113m: 'Ak Dievs, nevar ta\u010du izmain\u012bt tik daudz koda!'. Bet, paties\u012bb\u0101, \u0161\u0101ds pieejas veids gandr\u012bz vienm\u0113r darbojas daudz lab\u0101k. J\u0101\u0137eras pie lielas probl\u0113mas uzreiz, j\u0101izveido liels aplis ap to un j\u0101saka: viss, kas ir iek\u0161\u0101 apl\u012b, es to p\u0101rprogramm\u0113\u0161u. Robe\u017ea ta\u010du ir daudz maz\u0101ka par to saturu iek\u0161\u0101, kuru nepiecie\u0161ams nomain\u012bt. Un, ja \u0161\u0101ds robe\u017eas noteikums \u013caus perfekti paveikt iek\u0161\u0113j\u0101s darbu \u2013 tev ir br\u012bvas rokas, dari ko v\u0113lies. Tikl\u012bdz tu saproti probl\u0113mu, p\u0101rprogramm\u0113\u0161anas process norit daudz viegl\u0101k, t\u0101p\u0113c \u0146em lielu gabalu!<br \/>\nTaj\u0101 pa\u0161\u0101 laik\u0101, kad tu p\u0101rprogramm\u0113 lielu gabalu un apzini, ka veiktsp\u0113ja k\u013c\u016bs par probl\u0113mu, vari uzreiz s\u0101kt par to uztraukties. Parasti tas p\u0101rv\u0113r\u0161as vienk\u0101r\u0161\u0101s liet\u0101s, piem\u0113ram, 'nep\u0101rvietojiet datus, p\u0101rvaldiet datus p\u0113c iesp\u0113jas vienk\u0101r\u0161\u0101k, padariet tos maz\u0101kus'. Liel\u0101s p\u0101rprogramm\u0113\u0161an\u0101s gad\u012bjumos ir standartveida veidi, k\u0101 uzlabot veiktsp\u0113ju. Un tie gandr\u012bz vienm\u0113r ir saist\u012bti ar datiem.<\/p>\n<p><\/p>\n<h1 id=\"model-stoimosti\">Izmaksu modelis<\/h1>\n<p><\/p>\n<p><strong>Andrej<\/strong>: Vien\u0101 no podk\u0101stiem j\u016bs run\u0101j\u0101t par cenu mode\u013ciem veiktsp\u0113jas kontekst\u0101. Vai var\u0113tu paskaidrot, ko j\u016bs ar to dom\u0101j\u0101t?<\/p>\n<p><\/p>\n<p><strong>Kliffs<\/strong>: Protams. Es piedzimst\u012bju laikmet\u0101, kad procesoru veiktsp\u0113ja bija \u0101rk\u0101rt\u012bgi svar\u012bga. Un \u0161\u012b \u0113ra atkal atgrie\u017eas \u2013 liktenis neizb\u0113gami ironiz\u0113. Es s\u0101ku dz\u012bvot asto\u0146bitu ma\u0161\u012bnu laikmet\u0101, mans pirmais dators darboj\u0101s ar 256 baitiem. Tie\u0161\u0101m, ar baitiem. Viss bija \u013coti neliels. Bija j\u0101skaita instrukcijas, un tikl\u012bdz s\u0101k\u0101m virz\u012bties augst\u0101k programm\u0113\u0161anas valodu stek\u0101, valodas uz\u0146\u0113ma aizvien vair\u0101k un vair\u0101k. Bija Assembler, tad Basic, tad C, un C uz\u0146\u0113ma darbu ar daudz\u0101m deta\u013c\u0101m, piem\u0113ram, re\u0123istru sadali un instrukciju pl\u0101no\u0161anu. Bet tur viss bija diezgan skaidrs, un, ja es izveidoju r\u0101d\u012bt\u0101ju uz main\u012bg\u0101 instanci, es sa\u0146em\u0161u load, un \u0161ai instrukcijai izmaksas ir zin\u0101mas. Dzel\u017ei sniedz zin\u0101mu skaitu ma\u0161\u012bnu ciklu, t\u0101p\u0113c da\u017e\u0101du uzdevumu izpildes \u0101trumu var apr\u0113\u0137in\u0101t, vienk\u0101r\u0161i summ\u0113jot visas instrukcijas, kuras tu pl\u0101no palaist. Katru compare\/test\/branch\/call\/load\/store var\u0113j\u0101m saskait\u012bt un teikt: l\u016bk, te ir izpildes laiks. Nodarb\u0113joties ar veiktsp\u0113jas uzlabo\u0161anu, tu noteikti piev\u0113rs\u012bsi uzman\u012bbu tam, k\u0101di skait\u013ci atbilst maz\u0101m karst\u0101m ciklu reakcij\u0101m.\u00a0<br \/>\nBet tikl\u012bdz tu p\u0101riet uz Java, Python un taml\u012bdz\u012bg\u0101m liet\u0101m, tu \u013coti \u0101tri att\u0101linies no zemo l\u012bme\u0146u dzel\u017eiem. K\u0101da ir getters izsaukuma izmaksas Java? Ja JIT HotSpot\u0101 viss ir pareizi <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.openjdk.java.net\/display\/HotSpot\/Inlining\">iek\u013cauts<\/a><\/noindex>, tas b\u016bs load, bet, ja vi\u0146\u0161 to nav izdar\u012bjis \u2013 tas b\u016bs funkcijas izsaukums. T\u0101 k\u0101 izsaukums atrodas karstaj\u0101 cikl\u0101, tas atcels visas p\u0101r\u0113j\u0101s optimiz\u0101cijas \u0161aj\u0101 cikl\u0101. T\u0101p\u0113c re\u0101l\u0101 cena b\u016bs daudz liel\u0101ka. Un tu uzreiz zaud\u0113 sp\u0113ju skat\u012bties uz koda fragmentu un saprast, k\u0101d\u0113\u013c mums to v\u0113rts veikt attiec\u012bb\u0101 uz procesora takts frekvenci, izmantoto atmi\u0146u un ke\u0161atmi\u0146u. Viss tas k\u013c\u016bst interesants tikai tad, ja tie\u0161\u0101m dzi\u013ci iegrims veiktsp\u0113j\u0101.<br \/>\nTagad m\u0113s esam situ\u0101cij\u0101, kad procesoru \u0101trumi jau vair\u0101k nek\u0101 desmit gadu laik\u0101 gandr\u012bz nav augu\u0161i. Vecie laiki atgrie\u017eas! J\u016bs vairs nevarat pa\u013cauties uz labu vienas pavediena veiktsp\u0113ju. Bet, ja notiks paral\u0113l\u0101s apr\u0113\u0137ina uzs\u0101k\u0161ana \u2013 tas ir \u0101rk\u0101rt\u012bgi sare\u017e\u0123\u012bti, visi skat\u0101s uz jums k\u0101 uz D\u017eeimsu Bondu. Desmitk\u0101rt\u012bgas pa\u0101trin\u0101\u0161anas parasti notiek taj\u0101s viet\u0101s, kur k\u0101ds ir kaut ko izlaidis. Paral\u0113lismam ir nepiecie\u0161ams daudz darba. Lai sasniegtu \u0161o desmitk\u0101rt\u012bgo pa\u0101trin\u0101jumu, ir j\u0101izprot izmaksu modelis. Kas un cik maks\u0101. Un, lai to izprastu, j\u0101saprot, k\u0101 valoda tiek uzlikta uz zem\u0101k eso\u0161\u0101 dzelzs.<br \/>\nM\u0101rtins Tompsons savam emu\u0101ram atrada lielisku v\u0101rdu <noindex><a rel=\"nofollow\" href=\"https:\/\/mechanical-sympathy.blogspot.com\/\">Meh\u0101nisk\u0101 simp\u0101tija<\/a><\/noindex>! Ir j\u0101izprot, ko pl\u0101no dar\u012bt dzelzs, k\u0101 tie\u0161i tas to dar\u012bs un k\u0101p\u0113c tas visp\u0101r dara to, ko dara. Izmantojot to, ir diezgan vienk\u0101r\u0161i s\u0101kt saskait\u012bt instrukcijas un noskaidrot, kurp iet izpildes laiks. Ja tev nav attiec\u012bg\u0101s sagatavot\u012bbas, tu vienk\u0101r\u0161i mekl\u0113 melnu ka\u0137i tum\u0161\u0101 istab\u0101. Es past\u0101v\u012bgi redzu cilv\u0113kus, kas optimiz\u0113 veiktsp\u0113ju, kuriem nav ne maz\u0101k\u0101s nojausmas, ko l\u0101ga vi\u0146i visp\u0101r dar\u0101. Vi\u0146i \u013coti cie\u0161 un nekur \u012bpa\u0161i nevirz\u0101s uz priek\u0161u. Un, kad es pa\u0146emu to pa\u0161u koda gabalu, ielikdams tur p\u0101ris s\u012bku haku, un ieg\u016bstu pieck\u0101rt\u012bgu vai desmitk\u0101rt\u012bgu pa\u0101trin\u0101jumu, vi\u0146i saka: nu, tas nav god\u012bgi, m\u0113s ar\u012b t\u0101 zin\u0101j\u0101m, ka tu esi lab\u0101ks. P\u0101rsteidzo\u0161i. Par ko es run\u0101ju\u2026 izmaksu modelis \u2013 tas ir par to, k\u0101du kodu tu raksti un cik \u0101tri tas vid\u0113ji darbojas visp\u0101r\u0113j\u0101 att\u0113l\u0101.<\/p>\n<p><\/p>\n<p><strong>Andrej<\/strong>: Un k\u0101 t\u0101du apjomu notur\u0113t pr\u0101t\u0101? To sasniedz ar lielu pieredzi, vai ne? Kur ieg\u016bt t\u0101du pieredzi?<\/p>\n<p><\/p>\n<p><strong>Kliffs<\/strong>: Nu, savu pieredzi es ieguvu ne vistuv\u0101kaj\u0101 ce\u013c\u0101. Es programm\u0113ju Assembler\u012b v\u0113l tajos laikos, kad var\u0113ja izprast katru atsevi\u0161\u0137u instrukciju. Tas izklaus\u0101s mu\u013c\u0137\u012bgi, bet no t\u0101 laika man pr\u0101t\u0101, atmi\u0146\u0101, uz visiem laikiem ir palicis Z80 instrukciju komplekts. Es neatceros cilv\u0113ku v\u0101rdus jau min\u016bti p\u0113c sarunas, bet atceros kodu, kas rakst\u012bts pirms 40 gadiem. Interesanti, tas izskat\u0101s k\u0101 \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\">zin\u0101tnieka idiots<\/a><\/noindex>\u00bb.<\/p>\n<p><\/p>\n<h1 id=\"obuchenie-nizkourovnevym-optimizaciyam\">M\u0101c\u012bbas par zemo l\u012bme\u0146u optimiz\u0101cij\u0101m<\/h1>\n<p><\/p>\n<p><strong>Andrej<\/strong>: Vai ir k\u0101ds vienk\u0101r\u0161\u0101ks veids, k\u0101 iesaist\u012bties?<\/p>\n<p><\/p>\n<p><strong>Kliffs<\/strong>: J\u0101 un n\u0113. Dzelzs, ko m\u0113s visi izmantojam, \u0161aj\u0101 laik\u0101 b\u016btiski nemain\u012bj\u0101s. Visi izmanto x86, iz\u0146emot viedt\u0101lru\u0146us uz Arm. Ja tu nenodarbojies ar k\u0101du hardcore ieb\u016bv\u0113to sist\u0113mu, tev viss ir tie\u0161i t\u0101ds pats. Labi, t\u0101l\u0101k. Instrukcijas ar\u012b gadsimtus nav main\u012bju\u0161\u0101s. J\u0101iet un j\u0101raksta kaut kas par Assembler. Nedaudz, bet pietiekami, lai s\u0101ktu saprast. J\u016bs smaid\u0101t, bet es piln\u012bgi nopietni to saku. J\u0101izprot valodas un dzel\u017ea attiec\u012bbas. P\u0113c tam j\u0101iet, j\u0101uzraksta nedaudz un j\u0101izveido neliels rota\u013cu kompilers nelielai rota\u013cu valodai. 'Rota\u013cu' noz\u012bm\u0113, ka j\u0101izveido to sapr\u0101t\u012bg\u0101 laik\u0101. Tam var b\u016bt supervienk\u0101r\u0161a strukt\u016bra, bet tam j\u0101\u0123ener\u0113 instrukcijas. Instrukciju \u0123ener\u0113\u0161anas akts \u013caus saprast izmaksu modeli tiltam starp augst\u0101 l\u012bme\u0146a kodu, ko visi raksta, un ma\u0161\u012bnkodu, kas izpild\u0101s uz dzel\u017ea. \u0160\u012b attiec\u012bba paliks pr\u0101tos br\u012bd\u012b, kad rakst\u012bsiet kompileri. Pat visvienk\u0101r\u0161\u0101kajam kompilerim. P\u0113c tam var s\u0101kt skat\u012bties uz Java un saprast, ka t\u0101s semantisk\u0101 klo\u0137\u0113\u0161ana ir daudz dzi\u013c\u0101ka, un t\u0101s virs\u016b uzcelt tiltus ir daudz gr\u016bt\u0101k. Java ir daudz gr\u016bt\u0101k saprast, vai m\u016bsu tilts ir labs vai slikts, kas to var saboj\u0101t un kas n\u0113. Bet tev ir nepiecie\u0161ama k\u0101da s\u0101kumpunkts, kad tu skaties uz kodu un saproti: 'Aha, \u0161im getteram katru reizi j\u0101satur\u0101s iek\u0161\u0101'. Un t\u0101l\u0101k izr\u0101d\u0101s, ka da\u017ereiz t\u0101 ar\u012b notiek, iz\u0146emot situ\u0101cijas, kad metode k\u013c\u016bst p\u0101r\u0101k liela, un JIT s\u0101ks satur\u0113t visu kop\u0101. \u0160\u0101du vietu veiktsp\u0113ju var paredz\u0113t nekav\u0113joties. Parasti getter\u012b darbojas labi, bet p\u0113c tam tu skaties uz lieliem karstiem cikliem un saproti, ka tur ir k\u0101di funkcion\u0101lie izsaukumi, kas nav skaidrs, ko dara. \u0160eit ir probl\u0113ma ar pla\u0161u getteru lieto\u0161anu, iemesls, k\u0101p\u0113c tie neiek\u013caujas - nav skaidrs, vai tas ir getters. Ja tev ir supermaza kodu b\u0101ze, to var vienk\u0101r\u0161i iegaum\u0113t un p\u0113c tam teikt: \u0161is ir getters, bet \u0161is ir setters. Liel\u0101 kodu b\u0101z\u0113 katrai funkcion\u0101lijai ir sava st\u0101sts, kas nevienam, b\u016bt\u012bb\u0101, nav zin\u0101ms. Profileris saka, ka m\u0113s zaud\u0113ju\u0161i 24% laika kaut k\u0101d\u0101 cikl\u0101, un lai saprastu, ko dara \u0161is cikls, j\u0101skat\u0101s uz katru funkciju iek\u0161\u0101. Nevar to saprast, nep\u0113t\u012bjot funkciju, un tas nopietni pal\u0113nina izpratnes procesu. T\u0101p\u0113c es neizmantoju getterus un setterus, es esmu sasniedzis jaunu l\u012bmeni!<br \/>\nK\u0101 ieg\u016bt izmaksu modeli? Protams, var palas\u012bt kaut ko... Bet es dom\u0101ju, lab\u0101kais veids ir r\u012bkoties. Izveidot mazu kompilatoru, un tas b\u016bs lab\u0101kais veids, k\u0101 apzin\u0101t izmaksu modeli un iek\u013caut to sav\u0101 pr\u0101t\u0101. Mazs kompilators, kas der\u0113tu mikrovi\u013c\u0146u kr\u0101sns programm\u0113\u0161anai \u2013 tas ir uzdevums ies\u0101c\u0113jiem. Nu, es dom\u0101ju, ja tev jau ir programm\u0113\u0161anas prasmes, tad t\u0101s pietiks. Visas t\u0101s lietas, piem\u0113ram, izparsin\u0101t rindu, kas b\u016bs k\u0101ds algebriskais izteikums, izvilkt no t\u0101s matem\u0101tisko oper\u0101ciju instrukcijas pareizaj\u0101 sec\u012bb\u0101, ieg\u016bt pareiz\u0101s v\u0113rt\u012bbas no re\u0123istriem \u2013 to visu var izdar\u012bt viegli. Un kam\u0113r tu to dar\u012bsi, tas ieies pr\u0101t\u0101. Dom\u0101ju, visi zina, ko dara kompilators. Un tas dos izpratni par izmaksu modeli.<\/p>\n<p><\/p>\n<h1 id=\"prakticheskie-primery-uluchsheniya-proizvoditelnosti\">Praktiski piem\u0113ri veiktsp\u0113jas uzlabo\u0161anai<\/h1>\n<p><\/p>\n<p><strong>Andrej<\/strong>: Uz ko v\u0113l j\u0101piev\u0113r\u0161 uzman\u012bba, str\u0101d\u0101jot pie veiktsp\u0113jas?<\/p>\n<p><\/p>\n<p><strong>Kliffs<\/strong>: Datu strukt\u016bras. Starp citu, j\u0101, jau sen neesmu vad\u012bjis \u0161os pas\u0101kumus\u2026 <noindex>Rocket School<\/noindex>. Tas bija interesanti, bet pras\u012bja tik daudz sp\u0113ku, bet man ta\u010du ir ar\u012b dz\u012bve! Labi. T\u0101tad, vien\u0101 no lielaj\u0101m un interesantaj\u0101m nodarb\u012bb\u0101m, \"Kur paz\u016bd j\u016bsu veiktsp\u0113ja\", es devu studentiem piem\u0113ru: divarpus gigabaiti finteh datu tika nolas\u012bti no CSV faila, un t\u0101l\u0101k bija j\u0101skaita p\u0101rdoto produktu skaits. Parasti tirgus dati. UDP paketes, kas p\u0101rv\u0113rstas teksta form\u0101t\u0101, s\u0101kot ar 70. gadiem. \u010cik\u0101gas Pre\u010du bir\u017ea \u2013 vis\u0101das lietas k\u0101 e\u013c\u013ca, kukur\u016bza, sojas pupas un taml\u012bdz\u012bgi. Bija j\u0101skaita \u0161ie produkti, dar\u012bjumu skaits, vid\u0113jais naudas un pre\u010du apgroz\u012bjums utt. T\u0101 ir diezgan vienk\u0101r\u0161a tirdzniec\u012bbas matem\u0101tika: atrast produkta kodu (tas ir 1-2 simboli hash tabul\u0101), ieg\u016bt summu, pievienot to vienam no dar\u012bjumu kopumiem, pievienot apjomu, pievienot izmaksas un p\u0101ris citas lietas. \u013boti vienk\u0101r\u0161a matem\u0101tika. Rota\u013c\u012bg\u0101 realiz\u0101cija bija \u013coti vienk\u0101r\u0161a: viss atrodas fail\u0101, es lasu failu un p\u0101rvietojos pa to, sadalot atsevi\u0161\u0137as ierakstu Java rind\u0101s, mekl\u0113ju taj\u0101s nepiecie\u0161am\u0101s lietas un sum\u0113ju saska\u0146\u0101 ar iepriek\u0161 aprakst\u012bto matem\u0101tiku. Un tas darbojas ar k\u0101du nelielu \u0101trumu. <\/p>\n<p><\/p>\n<p>Ar \u0161\u0101du pieeju viss ir ac\u012bmredzams, kas notiek, un paral\u0113lie apr\u0113\u0137ini \u0161eit nepal\u012bdz, vai ne? Izr\u0101d\u0101s, piecu reizes liel\u0101ku veiktsp\u0113ju var sasniegt, vienk\u0101r\u0161i izv\u0113loties pareiz\u0101s datu strukt\u016bras. Un tas p\u0101rsteidz pat pieredz\u0113ju\u0161us programm\u0113t\u0101jus! Man\u0101 konkr\u0113taj\u0101 gad\u012bjum\u0101 uzman\u012bba bija piev\u0113rsta tam, ka nevajadz\u0113tu veikt atmi\u0146as rezerv\u0113\u0161anu karstaj\u0101 cikl\u0101. Nu, tas nav viss, bet kopum\u0101 \u2013 nevajadz\u0113tu veikt rezerv\u0101cijas \u201ereizi X\u201d, kad X ir pietiekami liels. Kad X ir divi ar pusi gigabaiti, nevajadz\u0113tu rezerv\u0113t neko \u201ereizi par burtu\u201d, vai \u201ereizi par rindi\u0146u\u201d, vai \u201ereizi par lauku\u201d, neko taml\u012bdz\u012bgu. Tie\u0161i taj\u0101 tiek t\u0113r\u0113ts laiks. K\u0101 tas visp\u0101r darbojas? Iedom\u0101jieties, ka veicu izsaukumu <code>String.split()<\/code> vai <code>BufferedReader.readLine()<\/code>. <code>Readline<\/code> izveido virkni no byte kopas, kas n\u0101k pa t\u012bklu, vienu reizi katrai rindi\u0146ai, katrai no simtiem miljoniem rindi\u0146u. Es pa\u0146emu \u0161o rindu, analiz\u0113ju to un izmetu. K\u0101p\u0113c izmetu \u2013 nu, es to jau esmu apstr\u0101d\u0101jis, viss. T\u0101tad katram byte, kas nolas\u012bts no \u0161iem 2.7G, tiks ierakst\u012bti divi simboli virknes, t.i., jau 5.4G, un tie man turpm\u0101k nav nepiecie\u0161ami, t\u0101p\u0113c tie tiek izmestti. Ja paskat\u0101mies uz atmi\u0146as caurlaidsp\u0113ju, m\u0113s slodze 2.7G, kas iet cauri atmi\u0146ai un atmi\u0146as bus, procesoram, un t\u0101l\u0101k divreiz vair\u0101k tiek nos\u016bt\u012bti uz virkni, kas atrodas atmi\u0146\u0101, un viss tas tiek p\u0101rstr\u0101d\u0101ts, veidojot katru jauno virkni. Bet man ta\u010du ir j\u0101izlasa t\u0101, dzelzs to nolasa, pat ja p\u0113c tam viss tiks p\u0101rstr\u0101d\u0101ts. Un man tas j\u0101ieraksta, jo es izveidoju virkni, un ke\u0161i ir p\u0101rpild\u012bti \u2013 ke\u0161s nevar uz\u0146emt 2.7G. T\u0101tad katram nolas\u012btajam byte es nolasu v\u0113l divus papildu byte un ierakstu divus papildu byte, un kopum\u0101 tiem ir attiec\u012bba 4:1 \u2013 \u0161\u0101d\u0101 attiec\u012bb\u0101 m\u0113s nevajadz\u012bgi t\u0113r\u0113jam atmi\u0146as caurlaidsp\u0113ju. Un t\u0101l\u0101k izr\u0101d\u0101s, ka, ja es veicu <code>String.split()<\/code> \u2013 tad es to noteikti nedaru p\u0113d\u0113jo reizi, tur iek\u0161\u0101 var b\u016bt v\u0113l 6-7 lauki. T\u0101p\u0113c klasisk\u0101 CSV nolas\u012b\u0161anas un p\u0113c tam virkn\u0113\u0161anas kods noved pie atmi\u0146as caurlaidsp\u0113jas zuduma aptuveni 14:1 attiec\u012bb\u0101 pret to, ko jums faktiski v\u0113l\u0113tos. Ja izmetam \u0161\u012bs rezerv\u0101cijas, tad varam sasniegt piecu reizes \u0101trumu. <\/p>\n<p><\/p>\n<p>Un tas nav \u013coti sare\u017e\u0123\u012bti. Ja j\u016bs paskat\u012bsieties uz kodu no pareiz\u0101 le\u0146\u0137a, viss k\u013c\u016bst diezgan vienk\u0101r\u0161i, tikl\u012bdz saprotat probl\u0113mas b\u016bt\u012bbu. Nav v\u0113rts visp\u0101r p\u0101rtraukt atmi\u0146as sadali: probl\u0113ma ir taj\u0101, ka j\u016bs kaut ko sadal\u0101t un tas t\u016bl\u012bt mirst, un pa ce\u013cam izn\u012bcina svar\u012bgu resursu, kas \u0161aj\u0101 gad\u012bjum\u0101 ir atmi\u0146as caurlaid\u012bba. Un viss tas beidzas ar veiktsp\u0113jas kritumu. x86 parasti ir nepiecie\u0161ams akt\u012bvi izmantot procesora taktis, bet \u0161eit j\u016bs izt\u0113r\u0113j\u0101t visu atmi\u0146u daudz agr\u0101k. Risin\u0101jums ir samazin\u0101t sadal\u012bjumu skaitu.\u00a0<br \/>\nV\u0113l viena probl\u0113mas da\u013ca ir t\u0101, ka, ja j\u016bs palaid\u012bsit profileru br\u012bd\u012b, kad beidz\u0101s atmi\u0146as josla, tie\u0161i taj\u0101 br\u012bd\u012b, kad tas notiek, j\u016bs parasti gaid\u0101t ke\u0161atmi\u0146as atgrie\u0161anos, jo t\u0101 ir pilna ar miskasti, ko j\u016bs tikko rad\u012bj\u0101t visiem \u0161iem rind\u0101m. T\u0101p\u0113c katra load vai store oper\u0101cija k\u013c\u016bst l\u0113na, jo t\u0101s izraisa ke\u0161atmi\u0146as tr\u016bkumus - visa ke\u0161atmi\u0146a k\u013c\u016bst l\u0113na, gaidot, kad no t\u0101s izvest\u012bs miskasti. T\u0101p\u0113c profilers par\u0101d\u012bs tikai siltus nejau\u0161us trok\u0161\u0146us, kas izsisti pa visu ciklu - neb\u016bs nek\u0101das atsevi\u0161\u0137as karstas instrukcijas vai vietas kod\u0101. Tikai troksnis. Un, ja j\u016bs paskat\u012bsieties uz GC cikliem, tie visi b\u016bs Young Generation un supers \u0101tri - mikrosk\u0113nas vai milisekundes maksimums. Jo visa \u0161\u012b atmi\u0146a mirst nekav\u0113joties. J\u016bs sadal\u0101t miljardiem gigabaitu, un tas tos nogrie\u017e, un nogrie\u017e un v\u0113lreiz nogrie\u017e. Viss tas notiek \u013coti \u0101tri. Rezult\u0101t\u0101 ir l\u0113ti GC cikli, silts troksnis vis\u0101 cikl\u0101, bet m\u0113s v\u0113lamies ieg\u016bt 5-reizes pa\u0101trin\u0101jumu. \u0160aj\u0101 br\u012bd\u012b kaut kas j\u0101sakr\u0101jas galv\u0101 un j\u0101skaidroj\u0101s: \"k\u0101p\u0113c t\u0101?!\". Atmi\u0146as joslas p\u0101rsnieg\u0161ana nepar\u0101d\u0101s klasiskaj\u0101 debugg\u0113r\u012b, ir j\u0101palaid\u012bs aparat\u016bras veiktsp\u0113jas skait\u012bt\u0101ju debuggers un j\u0101paskat\u0101s uz to tie\u0161i. Un, ja ne tie\u0161i, to var aizdom\u0101ties no \u0161iem trim simptomiem. Tre\u0161ais simptoms - tas ir, kad j\u016bs skat\u0101ties, ko sadal\u0101t, pras\u0101t profileram, un vi\u0146\u0161 atbild: \"J\u016bs izdar\u012bj\u0101t miljardu rindu, bet GC str\u0101d\u0101ja par br\u012bvu\". Tikl\u012bdz tas notiek, j\u016bs saprotat, ka esat rad\u012bjis p\u0101r\u0101k daudz objektu un izt\u0113r\u0113jis visu atmi\u0146as joslu. Ir veids, k\u0101 to izprast, bet tas nav ac\u012bmredzams.\u00a0<\/p>\n<p><\/p>\n<p>Datu strukt\u016bras probl\u0113ma: tuk\u0161a strukt\u016bra, kas sl\u0113pjas aiz visa notieko\u0161\u0101, ir p\u0101r\u0101k liela, t\u0101 aiz\u0146em 2.7G disk\u0101, t\u0101d\u0113\u013c \u0161\u012bs lietas kop\u0113\u0161ana ir \u013coti nev\u0113lama \u2013 v\u0113l\u0113tos to iel\u0101d\u0113t tie\u0161i no t\u012bkla bajtu bufera re\u0123istros, lai nevajadz\u0113tu piecas reizes rakst\u012bt un las\u012bt atpaka\u013c un uz priek\u0161u. Diem\u017e\u0113l Java p\u0113c noklus\u0113juma nesniedz t\u0101du bibliot\u0113ku sav\u0101 JDK komplekt\u0101. Bet tas ta\u010du ir triv\u0101li, vai ne? Paties\u012bb\u0101 tas ir 5-10 koda rindi\u0146as, kas tiks izmantotas, lai \u012bstenotu savu buferiz\u0113to rindi\u0146u iel\u0101d\u0113t\u0101ju, kas atk\u0101rto virk\u0146u klases uzved\u012bbu, b\u016bt\u012bb\u0101 kalpojot k\u0101 apvalks ap zem\u0101k eso\u0161o bajtu buferi. Rezult\u0101t\u0101 izr\u0101d\u0101s, ka tu str\u0101d\u0101 gandr\u012bz it k\u0101 ar virkn\u0113m, bet paties\u012bb\u0101 tur p\u0101rvietojas r\u0101d\u012bt\u0101ji uz buferi, un nevis neapstr\u0101d\u0101ti bajti tiek kop\u0113ti, un t\u0101d\u0113j\u0101di tiek atk\u0101rtoti izmantoti tie pa\u0161i buferi atkal un atkal, un oper\u0113t\u0101jsist\u0113ma labpr\u0101t uz\u0146emas lietas, kam t\u0101 ir paredz\u0113ta, piem\u0113ram, sl\u0113ptu dubulto buferiz\u0113\u0161anu \u0161iem bajtu buferiem, un tu vairs neizn\u012bcini bezgal\u012bgu nevajadz\u012bgu datu pl\u016bsmu. Starp citu, j\u016bs ta\u010du saprotat, ka str\u0101d\u0101jot ar GC garant\u0113ts, ka katra atmi\u0146as pie\u0161\u0137ir\u0161ana neb\u016bs redzama procesoram p\u0113c p\u0113d\u0113j\u0101 GC cikla? T\u0101d\u0113\u013c, tas viss nek\u0101 nevar b\u016bt ke\u0161\u0101, un t\u0101l\u0101k notiek 100%-\u012bgi garant\u0113ts nepareizais trieciens. Str\u0101d\u0101jot ar r\u0101d\u012bt\u0101ju, x86 piek\u013c\u016b\u0161ana re\u0123istram no atmi\u0146as aiz\u0146em 1-2 takts, un tikl\u012bdz tas notiek, tu maks\u0101, maks\u0101, maks\u0101, jo visa atmi\u0146a ir <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Cache_inclusion_policy\">NINE ke\u0161os<\/a><\/noindex> \u2013 un tie\u0161i tas ir atmi\u0146as pie\u0161\u0137ir\u0161anas izmaksas. Paties\u0101s izmaksas.<\/p>\n<p><\/p>\n<p>Citiem v\u0101rdiem sakot, datu strukt\u016bras ir t\u0101s, ko visgr\u016bt\u0101k main\u012bt. Un tikl\u012bdz j\u016bs saprotat, ka esat izv\u0113l\u0113jies nepareizu datu strukt\u016bru, kas v\u0113l\u0101k saboj\u0101s veiktsp\u0113ju, parasti j\u0101pavada b\u016btiska darba apjoms, bet, ja to neizdar\u012bsiet, t\u0101l\u0101k b\u016bs v\u0113l slikt\u0101k. Pirmk\u0101rt, ir j\u0101dom\u0101 par datu strukt\u016br\u0101m, tas ir svar\u012bgi. Galven\u0101s izmaksas \u0161eit ir saist\u012btas ar liel\u0101m datu strukt\u016br\u0101m, kuras s\u0101k izmantot stil\u0101 \"es kop\u0113ju datu strukt\u016bru X datu strukt\u016br\u0101 Y, jo Y man lab\u0101k pat\u012bk p\u0113c formas\". Bet kop\u0113\u0161anas oper\u0101cija (kura \u0161\u0137iet l\u0113ta) paties\u012bb\u0101 pat\u0113r\u0113 atmi\u0146as joslu, un tie\u0161i \u0161eit sl\u0113pjas viss zaud\u0113tais izpildes laiks. Ja man ir milz\u012bga JSON rinda un es v\u0113los to p\u0101rv\u0113rst par struktur\u0113tu DOM koku no POJO vai kaut k\u0101 taml\u012bdz\u012bga, \u0161\u012bs rindas pars\u0113\u0161anas oper\u0101cija un POJO veido\u0161ana, un p\u0113c tam jauna piek\u013cuve POJO v\u0113l\u0101kies rad\u012bs nevajadz\u012bgas izmaksas \u2013 tas nav l\u0113ti. Ieskaitot gad\u012bjumus, ja j\u016bs darbosies ar POJO daudz bie\u017e\u0101k nek\u0101 ar rindu. Pirmaj\u0101 br\u012bd\u012b var\u0113tu izm\u0113\u0123in\u0101t izsist rindu un izvilkt tikai nepiecie\u0161amo, nep\u0101rv\u0113r\u0161ot to par nek\u0101diem POJO. Ja viss tas notiek ce\u013c\u0101, kur\u0101 nepiecie\u0161ama maksim\u0101la veiktsp\u0113ja, nek\u0101dus POJO \u2013 ir vaja\u0123s tie\u0161i \u0146emties ar rindu.<\/p>\n<p><\/p>\n<h1 id=\"zachem-sozdavat-svoy-yazyk-programmirovaniya\">K\u0101p\u0113c rad\u012bt savu programm\u0113\u0161anas valodu<\/h1>\n<p><\/p>\n<p><strong>Andrej<\/strong>: J\u016bs teic\u0101t, ka, lai apzin\u0101tos izmaksu modeli, j\u0101pieraksta sava maz\u0101 valoda...<\/p>\n<p><\/p>\n<p><strong>Kliffs<\/strong>: Nevis valoda, bet kompilators. Valoda un kompilators ir da\u017e\u0101das lietas. Galven\u0101 at\u0161\u0137ir\u012bba \u2013 j\u016bsu pr\u0101t\u0101.\u00a0<\/p>\n<p><\/p>\n<p><strong>Andrej<\/strong>: Starp citu, cik zinu, j\u016bs eksperiment\u0113jat ar savu valodu izveidi. K\u0101p\u0113c?<\/p>\n<p><\/p>\n<p><strong>Kliffs<\/strong>: T\u0101p\u0113c, ka varu! Es esmu pussezon\u0101, t\u0101p\u0113c tas ir mans hobijs. Visu m\u016b\u017eu es esmu \u012bstenojis sve\u0161as valodas. Un esmu ar\u012b daudz str\u0101d\u0101jis pie koda stila. Un v\u0113l t\u0101p\u0113c, ka redzu probl\u0113mas cit\u0101s valod\u0101s. Redzu, ka ir lab\u0101ki veidi, k\u0101 veikt ierastas lietas. Un es tos izmantotu. Man ir apnikusi redz\u0113t probl\u0113mas sev\u012b, Java, Python, jebkur\u0101 cit\u0101 valod\u0101. Es \u0161obr\u012bd rakstu uz React Native, JavaScript un Elm k\u0101 hobiju, kas nav par pensiju, bet par akt\u012bvu darbu. Un ar\u012b uz Python rakstu un, visticam\u0101k, turpin\u0101\u0161u str\u0101d\u0101t pie ma\u0161\u012bnm\u0101c\u012b\u0161an\u0101s Java aizmugur\u0113m. Ir daudz popul\u0101ru valodu, un katrai ir interesantas iez\u012bmes. Katrs ir labs kaut k\u0101d\u0101 veid\u0101, un var izm\u0113\u0123in\u0101t apvienot visas \u0161\u012bs funkcijas. T\u0101p\u0113c es nodarbojos ar interesantu lietu izp\u0113ti, valodas uzved\u012bbu, cen\u0161oties izdom\u0101t sapr\u0101t\u012bgu semantiku. Un pagaid\u0101m man tas padodas! \u0160obr\u012bd es c\u012bnos ar atmi\u0146as semantiku, jo gribu, lai t\u0101 b\u016btu k\u0101 C un Java, un ieg\u016bt sp\u0113c\u012bgu atmi\u0146as modeli un atmi\u0146as semantiku iel\u0101d\u0113m un veikal\u0101. Taj\u0101 pa\u0161\u0101 laik\u0101 ieg\u016bt autom\u0101tisku tipu izsl\u0113g\u0161anu k\u0101 Haskell. L\u016bk, es cen\u0161os sajaukt Haskell-l\u012bdz\u012bgu tipu izsl\u0113g\u0161anu ar atmi\u0146u, kas darbojas k\u0101 C un Java. Ar to es esmu nodarbojies p\u0113d\u0113j\u0101s 2-3 m\u0113ne\u0161us, piem\u0113ram.<\/p>\n<p><\/p>\n<p><strong>Andrej<\/strong>: Ja j\u016bs veidojat valodu, kas \u0146em lab\u0101k\u0101s aspekts no cit\u0101m valod\u0101m, vai esat dom\u0101jis par to, ka k\u0101ds var\u0113tu izdar\u012bt pret\u0113jo: \u0146emt j\u016bsu idejas un izmantot t\u0101s pie sevis?<\/p>\n<p><\/p>\n<p><strong>Kliffs<\/strong>: Tie\u0161i t\u0101 rodas jaunas valodas! K\u0101p\u0113c Java ir l\u012bdz\u012bga C? T\u0101p\u0113c, ka C bija laba sintakse, ko visi saprata, un Java iedvesmoj\u0101s no \u0161\u012bs sintakses, pievienojot tam veida dro\u0161\u012bbu, mas\u012bvu robe\u017eu p\u0101rbaudes, GC, un v\u0113l vi\u0146i uzlaboja da\u017eas lietas no C. Vi\u0146i pievienoja savas. Bet vi\u0146i tika sp\u0113c\u012bgi iedvesmoti, vai ne? Visi st\u0101v uz mil\u017eu pleciem, kas bija pirms tevis \u2013 tie\u0161i t\u0101 notiek progress.<\/p>\n<p><\/p>\n<p><strong>Andrej<\/strong>: K\u0101 es saprotu, j\u016bsu valoda b\u016bs dro\u0161a attiec\u012bb\u0101 uz atmi\u0146as izmanto\u0161anu. Vai j\u016bs dom\u0101j\u0101t \u012bstenot kaut ko l\u012bdz\u012bgu borrow checker no Rust? Vai j\u016bs to skat\u012bj\u0101ties, k\u0101 jums patika?<\/p>\n<p><\/p>\n<p><strong>Kliffs<\/strong>: Nu, es rakstu C jau veselu m\u016b\u017e\u012bbu, ar visiem \u0161iem malloc un free, un manu\u0101li p\u0101rvaldu dz\u012bves ciklu. Zin\u0101t, 90-95% manu\u0101li p\u0101rvald\u012bt\u0101 cikla ir ar vien\u0101du strukt\u016bru. Un tas ir \u013coti, \u013coti s\u0101p\u012bgi to dar\u012bt manu\u0101li. Es v\u0113l\u0113tos, lai kompilators vienk\u0101r\u0161i pateiktu, kas tur notiek un ko tu esi sasniedzis ar sav\u0101m darb\u012bb\u0101m. Da\u017e\u0101m liet\u0101m borrow checker to dara autom\u0101tiski. V\u0113l tam ir j\u0101sp\u0113j autom\u0101tiski izvest inform\u0101ciju, visam j\u0101b\u016bt saprotamam un pat nevajag mani slodz\u012bt ar to sapratni. Tam b\u016btu j\u0101veic vismaz lok\u0101la aizb\u0113g\u0161anas anal\u012bze, un tikai tad, ja tas neizdodas, b\u016btu j\u0101pievieno tipa anot\u0101cijas, kas apraksta dz\u012bves ciklu \u2013 un \u0161\u0101da sh\u0113ma ir daudz sare\u017e\u0123\u012bt\u0101ka nek\u0101 borrow checker vai jebkur\u0161 cits eso\u0161ais atmi\u0146as p\u0101rbaud\u012bt\u0101js. Izv\u0113le starp \u201eviss ir labi\u201d un \u201ees neko nesaprotu\u201d \u2013 n\u0113, tam j\u0101b\u016bt kaut kam lab\u0101kam.\u00a0<br \/>\nT\u0101tad, k\u0101 cilv\u0113ks, kur\u0161 ir uzrakst\u012bjis daudz C koda, uzskatu, ka autom\u0101tisk\u0101s dz\u012bves cikla p\u0101rvald\u012bbas atbalsts ir vissvar\u012bg\u0101k\u0101 lieta. Un mani ar\u012b kaitina, cik daudz atmi\u0146as izmanto Java, un galven\u0101 s\u016bdz\u012bba ir par GC. Pie atmi\u0146as pie\u0161\u0137ir\u0161anas Java gad\u012bjum\u0101 tev atmi\u0146a, kas bija lok\u0101la p\u0113d\u0113j\u0101 GC cikl\u0101, netiks atgriezta. Valod\u0101s ar prec\u012bz\u0101ku atmi\u0146as p\u0101rvald\u012bbu tas nav t\u0101. Ja izsaucat malloc, tu t\u016bl\u012bt\u0113jo sa\u0146em atmi\u0146u, kas parasti tikko tika izmantota. Parasti tu veic k\u0101das pagaidu darb\u012bbas ar atmi\u0146u un t\u016bl\u012bt to atgriez atpaka\u013c. Un t\u0101 uzreiz atgrie\u017eas malloc basein\u0101, un n\u0101kamaj\u0101 malloc cikl\u0101 to atkal izvelk atpaka\u013c. T\u0101p\u0113c re\u0101lais atmi\u0146as pat\u0113ri\u0146\u0161 samazin\u0101s l\u012bdz dz\u012bv\u0101 objektu kopumam konkr\u0113t\u0101 br\u012bd\u012b plus k\u013c\u016bm\u0113m. Un, ja tev nav tek\u0161\u0137u nepiedien\u012bgos veidos, liel\u0101k\u0101 da\u013ca atmi\u0146as nos\u0113d\u012bsies ke\u0161os un procesor\u0101, un tas darbosies \u0101tri. Bet tas prasa daudz roku darba ar atmi\u0146as p\u0101rvald\u012bbu, izmantojot malloc un free, kas j\u0101sauc pareizaj\u0101 sec\u012bb\u0101, pareiz\u0101 viet\u0101. Rust sp\u0113j ar to tikt gal\u0101 pareizi, un daudzos gad\u012bjumos pat nodro\u0161ina augst\u0101ku veiktsp\u0113ju, jo atmi\u0146as pat\u0113ri\u0146\u0161 tiek samazin\u0101ts tikai l\u012bdz pa\u0161reiz\u0113j\u0101m apr\u0113\u0137iniem \u2013 at\u0161\u0137ir\u012bb\u0101 no gaid\u012b\u0161anas n\u0101kamajam GC ciklam, kas atbr\u012bvos atmi\u0146u. Beig\u0101s m\u0113s ieguv\u0101m \u013coti interesantu veidu, k\u0101 uzlabot veiktsp\u0113ju. Un diezgan jaud\u012bgu \u2013 t\u0101 teikt, es nodarbojos ar \u0161\u0101d\u0101m liet\u0101m datu apstr\u0101d\u0113 finan\u0161u tehnolo\u0123iju jom\u0101, un tas \u013c\u0101va ieg\u016bt pa\u0101trin\u0101jumu apm\u0113ram piecas reizes. Tas ir diezgan noz\u012bm\u012bgs pa\u0101trin\u0101jums, it \u012bpa\u0161i pasaul\u0113, kur procesori neveicas \u0101tr\u0101k, un m\u0113s joproj\u0101m gaid\u0101m uzlabojumus.<\/p>\n<p><\/p>\n<h1 id=\"karera-performans-inzhenera\">Veiktsp\u0113jas in\u017eeniera karjera<\/h1>\n<p><\/p>\n<p><strong>Andrej<\/strong>: V\u0113l\u0113tos ar\u012b pajaut\u0101t par karjeru kopum\u0101. J\u016bs k\u013cuv\u0101t slavens, str\u0101d\u0101jot pie JIT HotSpot, p\u0113c tam p\u0101rc\u0113l\u0101ties uz Azul \u2013 un t\u0101 ir ar\u012b JVM komp\u0101nija. Bet j\u016bs jau vair\u0101k nodarboj\u0101ties ar aparat\u016bru, nevis programmat\u016bru. Un p\u0113c tam p\u0113k\u0161\u0146i p\u0101rg\u0101j\u0101t uz Big Data un Machine Learning, p\u0113c tam uz kr\u0101p\u0161anas atkl\u0101\u0161anu. K\u0101 tas notika? Tas ir \u013coti at\u0161\u0137ir\u012bgi izstr\u0101des jomas.<\/p>\n<p><\/p>\n<p><strong>Kliffs<\/strong>: Esmu jau diezgan ilgi nodarbojies ar programm\u0113\u0161anu un esmu p\u0101rz\u012bm\u0113jis uz \u013coti da\u017e\u0101d\u0101m aktivit\u0101t\u0113m. Un, kad cilv\u0113ki saka: \u00abO, tu ta\u010du esi tas, kur\u0161 izstr\u0101d\u0101ja JIT Java!\u00bb, tas vienm\u0113r ir smiekl\u012bgi. Bet pirms tam es str\u0101d\u0101ju pie PostScript klona \u2013 valodas, kuru Apple k\u0101dreiz izmantoja saviem l\u0101zerprinteriem. Un v\u0113l pirms tam es veicu Forth valodas ievie\u0161anu. Dom\u0101ju, kop\u0113j\u0101 t\u0113ma man ir r\u012bku izstr\u0101de. Visa dz\u012bve esmu veidojis r\u012bkus, ar kuriem citi cilv\u0113ki raksta savas for\u0161\u0101s programmas. Bet es esmu str\u0101d\u0101jis ar\u012b pie oper\u0113t\u0101jsist\u0113m\u0101m, vad\u012bt\u0101jiem, kodola l\u012bme\u0146a atk\u013c\u016bdo\u0161anas r\u012bkiem, oper\u0113t\u0101jsist\u0113mu izstr\u0101des valod\u0101m, kas s\u0101k\u0101s trivi\u0101li, bet laika gait\u0101 k\u013cuva arvien sare\u017e\u0123\u012bt\u0101kas. Bet galven\u0101 t\u0113ma tom\u0113r ir r\u012bku izstr\u0101de. Liela da\u013ca manas dz\u012bves ir pag\u0101jusi starp Azul un Sun, un t\u0101 bija par Java. Bet, kad es s\u0101ku nodarboties ar Big Data un Ma\u0161\u012bnm\u0101c\u012b\u0161anos, es atkal uzlik\u0161u savu svin\u012bgo cepuri un teicu: \u00abAk, tagad mums ir netrivi\u0101la probl\u0113ma, un \u0161eit notiek vesela s\u0113rija interesantu lietu un cilv\u0113ku, kuri kaut ko dara\u00bb. Tas ir lielisks ce\u013c\u0161 att\u012bst\u012bbai, pa kuru ir v\u0113rts iet. <\/p>\n<p><\/p>\n<p>J\u0101, es \u013coti m\u012blu izklied\u0113t\u0101s apr\u0113\u0137in\u0101\u0161anas. Mana pirm\u0101 darba pieredze bija studentu gados, programm\u0113jot C valod\u0101 k\u0101d\u0101 rekl\u0101mas projekt\u0101. Tas bija izklied\u0113ts apr\u0113\u0137ins uz Zilog Z80 mikrosh\u0113m\u0101m, kuras v\u0101c datus analogam optiskajam teksta atpaz\u012b\u0161anai, ko nodro\u0161in\u0101ja \u012bsts analo\u0123ais analizators. Tas bija aizraujo\u0161s un pavisam neparasts temats. Tom\u0113r bija probl\u0113mas, k\u0101da da\u013ca netika pareizi atpaz\u012bta, t\u0101p\u0113c bija nepiecie\u0161ams izvilkt att\u0113lu un par\u0101d\u012bt to cilv\u0113kam, kur\u0161 jau bija las\u012bjis ac\u012bm un pazi\u0146ot, kas tur ir rakst\u012bts, un t\u0101p\u0113c bija darbi ar datiem, un \u0161iem darbiem bija sava valoda. Bija b\u0101ka, kas visu to apstr\u0101d\u0101ja \u2013 paral\u0113li str\u0101d\u0101jo\u0161\u0101s Z80 mikrosh\u0113mas ar palaistiem vt100 termin\u0101liem \u2013 pa vienam uz cilv\u0113ku, un bija paral\u0113lo programm\u0113\u0161anas modelis uz Z80. Noteikta kop\u012bga atmi\u0146as da\u013ca, ko dal\u012bja visas Z80 \u0161aj\u0101 \u201ezvaigznes\u201d konfigur\u0101cij\u0101; dal\u012bj\u0101s ar\u012b b\u0101ka, un puse RAM tika dal\u012bta iek\u0161\u0113j\u0101 t\u012bkl\u0101, un otra puse bija priv\u0101ta vai dev\u0101s uz kaut ko citu. Cie\u0161i sare\u017e\u0123\u012bta paral\u0113la izklied\u0113ta sist\u0113ma ar dal\u012btu... da\u013c\u0113ji dal\u012btu atmi\u0146u. Kad tas bija... Vairs neatceros, kaut kur asto\u0146desmito gadu vid\u016b. Pietiekami sen.\u00a0<br \/>\nJ\u0101, uzskat\u012bsim, ka 30 gadi ir pietiekami ilgi. Uzdevumi, kas saist\u012bti ar izklied\u0113t\u0101m apr\u0113\u0137in\u0101\u0161an\u0101m, ir past\u0101v\u0113ju\u0161i pietiekami ilgi, cilv\u0113ki jau sen c\u012bn\u0101s ar <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>-klasteriem. \u0160\u0101di klasteri izskat\u0101s k\u0101\u2026 Piem\u0113ram: ir Ethernet, un tavs \u0101trais x86 ir pievienots \u0161im Ethernet, un tagad tu v\u0113lies ieg\u016bt viltoto kop\u012bgo atmi\u0146u, jo neviens todien nevar\u0113ja nodarboties ar sadal\u012bto apr\u0113\u0137inu kod\u0113\u0161anu, tas bija p\u0101r\u0101k sare\u017e\u0123\u012bti, un t\u0101d\u0113\u013c bija viltota kop\u012bg\u0101 atmi\u0146a ar atmi\u0146as lapu aizsardz\u012bbu uz x86, un ja tu rakst\u012bji \u0161aj\u0101 lap\u0101, tad m\u0113s pazi\u0146oj\u0101m citiem procesoriem, ka, ja vi\u0146i piek\u013c\u016bst tai pa\u0161ai kop\u012bgajai atmi\u0146ai, t\u0101 j\u0101iel\u0101d\u0113 no tevis, un t\u0101d\u0113j\u0101di rad\u0101s kaut kas l\u012bdz\u012bgs ke\u0161u saska\u0146o\u0161anas protokolam un programmat\u016brai tam. Interesanta koncepcija. Paties\u0101 probl\u0113ma, protams, bija citur. Viss tas darboj\u0101s, bet tu \u0101tri sask\u0101r\u0101s ar veiktsp\u0113jas probl\u0113m\u0101m, jo neviens nesaprata veiktsp\u0113jas modeli pietiekami labi \u2013 k\u0101di ir piek\u013cuves mode\u013ci uz atmi\u0146u, k\u0101 pan\u0101kt, lai mezgli nemit\u012bgi nesazin\u0101tos sav\u0101 starp\u0101, un t\u0101 t\u0101l\u0101k. <\/p>\n<p><\/p>\n<p>H2O man ir rad\u012bjusi \u0161\u0101du ideju: pa\u0161i izstr\u0101d\u0101t\u0101ji ir atbild\u012bgi par to, lai noteiktu, kur ir sl\u0113p\u0161an\u0101s paral\u0113lisms un kur t\u0101 nav. Es izdom\u0101ju t\u0101du kod\u0113\u0161anas modeli, ka ir viegli un vienk\u0101r\u0161i rakst\u012bt augstas veiktsp\u0113jas kodu. Ta\u010du uzrakst\u012bt l\u0113ni str\u0101d\u0101jo\u0161u kodu ir gr\u016bti, tas izskat\u012bsies slikti. Ir j\u0101pieliek lielas p\u016bles, lai uzrakst\u012btu l\u0113nu kodu; b\u016bs j\u0101pielieto nestandarta metodes. L\u0113ns kods ir redzams jau pirmaj\u0101 mirkl\u012b. T\u0101d\u0113\u013c parasti tiek rakst\u012bts kods, kas str\u0101d\u0101 \u0101tri, bet jums j\u0101tiek gal\u0101 ar to, kas j\u0101dara kop\u012bgas atmi\u0146as gad\u012bjum\u0101. Tas viss ir saist\u012bts ar lieliem mas\u012bviem, un uzved\u012bba tajos ir l\u012bdz\u012bga nevolat\u012bviem lieliem mas\u012bviem paral\u0113laj\u0101 Java. Iedom\u0101jieties, ka divi pavedieni raksta paral\u0113laj\u0101 mas\u012bv\u0101, viens no tiem uzvar, bet otrs, attiec\u012bgi, zaud\u0113, un j\u016bs nezin\u0101t, kur\u0161 no vi\u0146iem ir kur\u0161. Ja tie nav volat\u012bvi, sec\u012bba var b\u016bt jebk\u0101da \u2013 un tas tie\u0161\u0101m darbojas labi. Cilv\u0113kiem ir svar\u012bgi oper\u0101ciju sec\u012bba, vi\u0146i pareizi izvieto volat\u012bvos un pareizaj\u0101s viet\u0101s sagaida veiktsp\u0113jas probl\u0113mas, kas saist\u012btas ar atmi\u0146u. Sav\u0101d\u0101k vi\u0146i vienk\u0101r\u0161i rakst\u012btu kodu k\u0101 ciklus no 1 l\u012bdz N, kur N ir da\u017ei triljoni, cerot, ka visi sare\u017e\u0123\u012btie gad\u012bjumi autom\u0101tiski k\u013c\u016bs paral\u0113li \u2013 un tur tas nedarbojas. Bet H2O nav ne Java, ne Scala, to var uzskat\u012bt par \u201eJava m\u012bnuss m\u012bnuss\u201d, ja gribas. Tas ir \u013coti saprotams programm\u0113\u0161anas stils, un tas ir l\u012bdz\u012bgs vienk\u0101r\u0161a koda rakst\u012b\u0161anai C vai Java ar cikliem un mas\u012bviem. Bet taj\u0101 pa\u0161\u0101 laik\u0101 atmi\u0146u var apstr\u0101d\u0101t terabaitiem. Es v\u0113l joproj\u0101m izmantoju H2O. Laiku pa laikam to izmantoju da\u017e\u0101dos projektos \u2013 un tas joproj\u0101m ir \u0101tr\u0101kais risin\u0101jums, kas desmitiem rei\u017eu apsteidz konkurentus. Ja j\u016bs veicat Big Data ar kolonnveida datiem, ir \u013coti gr\u016bti p\u0101rsp\u0113t H2O.<\/p>\n<p><\/p>\n<h1 id=\"tehnicheskie-chellenzhi\">Tehniskie izaicin\u0101jumi<\/h1>\n<p><\/p>\n<p><strong>Andrej<\/strong>: K\u0101ds ir bijis visliel\u0101kais izaicin\u0101jums j\u016bsu karjer\u0101?<\/p>\n<p><\/p>\n<p><strong>Kliffs<\/strong>: Vai m\u0113s apsprie\u017eam tehnisko vai ne tehnisko jaut\u0101jumu? Es teiktu, ka liel\u0101kie izaicin\u0101jumi ir tehniskie.\u00a0<br \/>\nRun\u0101jot par tehniskajiem izaicin\u0101jumiem. Es tos vienk\u0101r\u0161i p\u0101rvar\u0113ju. Pat nezinu, kur\u0161 no tiem bija visliel\u0101kais, ta\u010du bija vair\u0101ki diezgan interesanti, kas pras\u012bja diezgan daudz laika un ment\u0101l\u0101s c\u012b\u0146as. Kad es devos uz Sun, biju p\u0101rliecin\u0101ts, ka izveido\u0161u \u0101tru kompilatoru, bet daudzie seniori, pieminot to, teica, ka man nekas nesan\u0101ks. Bet es iz\u0161\u0137\u012bros doties \u0161o ce\u013cu, uzrakst\u012bju kompilatoru l\u012bdz re\u0123istru pie\u0161\u0137ir\u0161anas l\u012bmenim, un tas bija diezgan \u0101trs. Tas bija tikpat \u0101trs k\u0101 m\u016bsdienu C1, bet taj\u0101 laik\u0101 re\u0123istru pie\u0161\u0137ir\u0161ana bija daudz l\u0113n\u0101ka, un, raugoties atpaka\u013c, t\u0101 bija liela datu strukt\u016bras probl\u0113ma. Man vajadz\u0113ja to, lai uzrakst\u012btu grafisko re\u0123istru pie\u0161\u0137ir\u0161anu, un es nesapratu dilemmu starp koda izteiksm\u012bbu un \u0101trumu, kas past\u0101v\u0113ja taj\u0101 laik\u0101 un bija \u013coti svar\u012bga. Izr\u0101d\u012bj\u0101s, ka datu strukt\u016bra parasti p\u0101rsniedz ke\u0161atmi\u0146as izm\u0113ru x86 procesoros taj\u0101 laik\u0101, un t\u0101p\u0113c, ja es s\u0101kotn\u0113ji pie\u0146\u0113m\u0113ju, ka re\u0123istru pie\u0161\u0137ir\u0161ana pras\u012bs 5-10 procentus no visa j\u012bt\u0113\u0161anas laika, tad realit\u0101t\u0113 tas izr\u0101d\u012bj\u0101s 50 procenti. <\/p>\n<p><\/p>\n<p>Laiks g\u0101ja, kompilators k\u013cuva arvien skaidr\u0101ks un produkt\u012bv\u0101ks, p\u0101rst\u0101ja \u0123ener\u0113t \u0161ausmino\u0161u kodu liel\u0101kaj\u0101 da\u013c\u0101 gad\u012bjumu, un veiktsp\u0113ja arvien vair\u0101k s\u0101ka l\u012bdzin\u0101ties tam, ko sniedz C kompilators. Ja, protams, tu neraksti kaut k\u0101du mu\u013c\u0137\u012bbu, ko pat C nevar pa\u0101trin\u0101t. Ja tu raksti kodu k\u0101 C, tu ar\u012b sa\u0146em rezult\u0101tu, kas ir produkt\u012bvs k\u0101 C liel\u0101kaj\u0101 da\u013c\u0101 gad\u012bjumu. Un jo t\u0101l\u0101k, jo bie\u017e\u0101k kods izr\u0101d\u012bj\u0101s asimptotiski atbilsto\u0161s C l\u012bmenim, re\u0123istru pie\u0161\u0137ir\u0161ana s\u0101ka izskat\u012bties k\u0101 kaut kas pabeigts... neatkar\u012bgi no t\u0101, vai tavs kods darbojas \u0101tri vai l\u0113ni. Es turpin\u0101ju str\u0101d\u0101t pie re\u0123istru pie\u0161\u0137ir\u0161anas, lai t\u0101 nodro\u0161in\u0101tu lab\u0101kas pie\u0161\u0137ir\u0161anas. T\u0101 k\u013cuva l\u0113n\u0101ka un l\u0113n\u0101ka, bet sniedza arvien lab\u0101kus rezult\u0101tus taj\u0101s situ\u0101cij\u0101s, kur vair\u0101k nevienam neizdev\u0101s. Es var\u0113ju ienirt re\u0123istru pie\u0161\u0137ir\u0161an\u0101, pavad\u012bt tur m\u0113nesi darb\u0101, un p\u0113k\u0161\u0146i viss kods s\u0101ka darboties par 5% \u0101tr\u0101k. Tas notika vair\u0101kk\u0101rt, un re\u0123istru pie\u0161\u0137ir\u0161ana k\u013cuva par kaut ko l\u012bdz\u012bgu m\u0101kslas darba statusam \u2013 visi to m\u012bl\u0113ja vai ienida, un akad\u0113misk\u0101s pasaules p\u0101rst\u0101vji uzdeva jaut\u0101jumus par to, \u00abk\u0101p\u0113c viss tiek dar\u012bts tie\u0161i t\u0101\u00bb. <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Register_allocation#Linear_Scan\">lin\u0101ra sken\u0113\u0161ana<\/a><\/noindex>, un k\u0101da ir at\u0161\u0137ir\u012bba. Atbilde ir vien\u0101da: grafu kr\u0101so\u0161anas b\u0101zes alokators plus \u013coti r\u016bp\u012bga saskarne ar buferkodu ir uzvaras instruments, lab\u0101k\u0101 kombin\u0101cija, ko neviens nevar sakaut. Un tas ir diezgan neuztverams moments. Viss p\u0101r\u0113jais, ko dara kompilators \u2013 ir diezgan paz\u012bstamas lietas, lai gan t\u0101s ar\u012b ir att\u012bst\u012btas l\u012bdz m\u0101kslas l\u012bmenim. Es vienm\u0113r veicu lietas, kas vajadz\u0113ja p\u0101rv\u0113rst kompilatoru par m\u0101kslas darbu. Bet nekas no t\u0101 nebija nekas \u0101rk\u0101rt\u0113js \u2013 iz\u0146emot re\u0123istru alokatoru. Triks ir taj\u0101, ka ir j\u0101b\u016bt r\u016bp\u012bgam <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Register_allocation\">nogriezt<\/a><\/noindex> zem slodzes, un, ja tas notiek (es varu izskaidrot detaliz\u0113t\u0101k, ja tas ir interesanti), tas noz\u012bm\u0113, ka var izvietot agres\u012bv\u0101k, nerisk\u0113jot p\u0101rsniegt snieguma grafika salau\u0161anas punktu. Tajos laikos bija daudz pilna m\u0113roga kompilatoru, kas bija piel\u0101goti ar vis\u0101diem uzlabojumiem un zvani\u0146iem, kuru sast\u0101v\u0101 bija re\u0123istru alokatori, bet neviens t\u0101 vairs nesp\u0113ja. <\/p>\n<p><\/p>\n<p>Probl\u0113ma ir t\u0101da, ka, ja tu pievieno metode, kas tiek inline'ota, palielinot un palielinot inline zonas, izmantoto v\u0113rt\u012bbu skaits moment\u0101ni p\u0101rsniedz re\u0123istru skaitu, un ir j\u0101notiek spillam. Kritiskais l\u012bmenis parasti rodas, kad alokators padodas, un viens labs kandid\u0101ts uz spilla maks\u0101 vair\u0101k nek\u0101 cits, tu spilli kaut k\u0101das piln\u012bgi trakas lietas. Inline'\u0113\u0161anas v\u0113rt\u012bba ir t\u0101da, ka tu zaud\u0113 da\u013cu overhead, overhead uz izsaukumu un saglab\u0101\u0161anu, tu vari redz\u0113t v\u0113rt\u012bbas iek\u0161\u0101 un vari t\u0101s t\u0101l\u0101k optimiz\u0113t. Inline'\u0113\u0161anas cena ir t\u0101da, ka rodas liels dz\u012bv\u0101s v\u0113rt\u012bbu skaits, un, ja tavs re\u0123istru alokators izspie\u017e vair\u0101k, nek\u0101 nepiecie\u0161ams, tu moment\u0101ni zaud\u0113. T\u0101d\u0113\u013c liel\u0101kajai da\u013cai alokatoru ir probl\u0113ma: kad inline'\u0113\u0161ana p\u0101rsniedz k\u0101du robe\u017eu, s\u0101k spilties viss, un veiktsp\u0113ju var norakst\u012bt pod\u0101. Tie, kas realiz\u0113 kompilatoru, pievieno kaut k\u0101das heuristikas: piem\u0113ram, lai aptur\u0113tu inline'\u0113\u0161anu, s\u0101kot no k\u0101da pietiekami liel\u0101 izm\u0113ra, jo alok\u0101cijas visu saboj\u0101s. T\u0101 rodas veiktsp\u0113jas grafika salauzums \u2013 tu inline'\u0113, inline'\u0113, veiktsp\u0113ja pamaz\u0101m pieaug \u2013 un tad bum! \u2013 t\u0101 kr\u012bt uz leju strauji, jo tu esi inline'\u0113jis p\u0101r\u0101k daudz. T\u0101 viss ar\u012b str\u0101d\u0101ja l\u012bdz Java par\u0101d\u012b\u0161anai. Java prasa daudz vair\u0101k inline'\u0113\u0161anas, t\u0101p\u0113c man bija j\u0101padara mans alokators daudz agres\u012bv\u0101ks, lai tas izl\u012bdzin\u0101tos, nevis kristu, un, ja tu esi p\u0101r\u0101k daudz inline'\u0113jis \u2013 tas s\u0101k spilties, bet tad t\u0101pat pien\u0101k br\u012bdis \"nav vair\u0101k spilla\". Tas ir interesants nov\u0113rojums un tas man ien\u0101ca pr\u0101t\u0101 tie\u0161i no nekurienes, neviennoz\u012bm\u012bgs, bet labi atmaks\u0101jies. Es piev\u0113rsos agres\u012bvai inline'\u0113\u0161anai un tas noveda mani t\u0101d\u0101s viet\u0101s, kur Java un C veiktsp\u0113ja ir blakus. Tie\u0161\u0101m tuvu \u2013 es varu rakst\u012bt Java kodu, kas b\u016bs iev\u0113rojami \u0101tr\u0101ks par C kodu un taml\u012bdz\u012bgi, bet vid\u0113ji, lielaj\u0101 att\u0113l\u0101, tie ir aptuveni sal\u012bdzin\u0101mi. Dom\u0101ju, da\u013ca no \u0161\u012b nopelna ir re\u0123istru alokators, kas \u013cauj man inline'ot maksim\u0101li bezgaum\u012bgi. Es vienk\u0101r\u0161i inline'\u0113ju visu, ko redzu. Jaut\u0101jums ir, vai alokators darbojas labi, vai izn\u0101k sapr\u0101t\u012bgs kods. Tas bija liels izaicin\u0101jums: saprast visu to un likt tam str\u0101d\u0101t.<\/p>\n<p><\/p>\n<h1 id=\"nemnogo-pro-allokaciyu-registrov-i-mnogoyadernost\">Nedaudz par re\u0123istru pie\u0161\u0137ir\u0161anu un daudzprocesoru skait\u013co\u0161anu<\/h1>\n<p><\/p>\n<p><strong>Vladimirs<\/strong>: Probl\u0113mas, piem\u0113ram, re\u0123istru alok\u0101cija, \u0161\u0137iet k\u0101 k\u0101da m\u016b\u017e\u012bga t\u0113ma. Interesanti, vai bija t\u0101, ka k\u0101da ideja izskat\u012bj\u0101s sol\u012bga, bet tad praktiski izg\u0101z\u0101s?<\/p>\n<p><\/p>\n<p><strong>Kliffs<\/strong>: Protams! Re\u0123istru alok\u0101cija ir joma, kur\u0101, lai atrisin\u0101tu NP-gr\u016bt\u012bbu uzdevumu, tu m\u0113\u0123ini atrast k\u0101das heuristikas. Un tu nekad nesp\u0113si pan\u0101kt ide\u0101lu risin\u0101jumu, vai ne? Tas vienk\u0101r\u0161i ir neiesp\u0113jami. Skatieties, Ahead of Time kompil\u0101cija \u2013 t\u0101 ar\u012b darboj\u0101s slikti. \u0160eit runa ir par k\u0101diem vid\u0113jiem gad\u012bjumiem. Par tipisku veiktsp\u0113ju, t\u0101p\u0113c var doties un izm\u0113r\u012bt kaut ko, ko tu uzskati par labu tipisku veiktsp\u0113ju \u2013 galu gal\u0101 tu ta\u010du str\u0101d\u0101 pie t\u0101s uzlabo\u0161anas! Re\u0123istru alok\u0101cija ir t\u0113ma, kas piln\u012bb\u0101 velt\u012bta veiktsp\u0113jai. Tikl\u012bdz tev ir pirmais prototips, kas str\u0101d\u0101 un nokr\u0101so, kas nepiecie\u0161ams, s\u0101kas darbs pie veiktsp\u0113jas. Nepiecie\u0161ams iem\u0101c\u012bties labi m\u0113r\u012bt. K\u0101p\u0113c tas ir svar\u012bgi? Ja ir skaidri dati, var skat\u012bties uz da\u017e\u0101d\u0101m teritorij\u0101m un redz\u0113t: ah, tas \u0161eit pal\u012bdz\u0113ja, bet tur viss saboj\u0101j\u0101s! Par\u0101d\u0101s da\u017eas labas idejas, tu pievieno jaunu heuristiku un p\u0113k\u0161\u0146i viss vid\u0113ji s\u0101k darboties nedaudz lab\u0101k. Vai ar\u012b nes\u0101k. Man bija daudz gad\u012bjumu, kad m\u0113s c\u012bn\u012bj\u0101mies par piec\u0101m procent\u0113m veiktsp\u0113jas, kas at\u0161\u0137\u012bra m\u016bsu izstr\u0101di no iepriek\u0161\u0113j\u0101 alokatora. Un katr\u0101 reiz\u0113 tas izskat\u0101s t\u0101: kaut kur vinn\u0113ja, kaut kur zaud\u0113ja. Ja tev ir labi veiktsp\u0113jas anal\u012bzes r\u012bki, var atrast zaud\u0113ju\u0161\u0101s idejas un saprast, k\u0101p\u0113c t\u0101s zaud\u0113. Varb\u016bt ir v\u0113rts atst\u0101t visu pa vecam, bet varb\u016bt nopietni piev\u0113rsties smalkai regul\u0113\u0161anai, vai doties un salabot kaut ko citu. Tas ir vesels komplekss! Es izdar\u012bju \u0161o for\u0161o haku, bet man nepiecie\u0161ams ar\u012b \u0161is, un \u0161is, un \u0161is \u2013 un to kop\u0113j\u0101 kombin\u0101cija nodro\u0161ina k\u0101dus uzlabojumus. Bet vienas idejas var neizdoties. T\u0101 ir NP-gr\u016bt\u012bbu uzdevumu veiktsp\u0113jas darba daba.<\/p>\n<p><\/p>\n<p><strong>Vladimirs<\/strong>: Veidojas saj\u016bta, ka t\u0101das lietas k\u0101 kr\u0101so\u0161ana alokatoros \u2013 ir jau atrisin\u0101ta probl\u0113ma. Nu, jums t\u0101 \u0161\u0137iet atrisin\u0101ta, sprie\u017eot p\u0113c t\u0101, ko j\u016bs st\u0101st\u0101t, vai tad visp\u0101r vajag\u2026<\/p>\n<p><\/p>\n<p><strong>Kliffs<\/strong>: T\u0101 nav atrisin\u0101ta k\u0101 t\u0101da. Tev tas j\u0101p\u0101rv\u0113r\u0161 par \u201eatrisin\u0101tu\u201d. Ir smagas probl\u0113mas, un t\u0101s ir j\u0101risina. Kad tas ir izdar\u012bts, pien\u0101k laiks str\u0101d\u0101t pie veiktsp\u0113jas. Uz \u0161o darbu j\u0101attiecas atbilsto\u0161i - veikt testus, v\u0101kt metriku, izskaidrot situ\u0101cijas, kad, atgrie\u017eoties pie iepriek\u0161\u0113j\u0101s versijas, tavs vecais hack atkal s\u0101ka darboties (vai otr\u0101di, p\u0101rst\u0101ja). Un nevajag atk\u0101pties, kam\u0113r kaut ko nepan\u0101k. K\u0101 jau teicu, ja for\u0161as idejas, kas neizdev\u0101s, bet ideju re\u0123istra alok\u0101cijas jom\u0101 ir aptuveni bezgal\u012bgi. Var, piem\u0113ram, las\u012bt zin\u0101tniskos izdevumus. Lai gan \u0161obr\u012bd \u0161\u012b joma virz\u0101s daudz l\u0113n\u0101k un ir k\u013cuvusi skaidr\u0101ka nek\u0101 sav\u0101s jaun\u012bbas dien\u0101s. Tom\u0113r \u0161aj\u0101 jom\u0101 str\u0101d\u0101 vesela bezgal\u012bba cilv\u0113ku, un visas vi\u0146u idejas ir v\u0113rts izm\u0113\u0123in\u0101t, visas gaida savu br\u012bdi. Un tu nevari pateikt, cik labi t\u0101s ir, ja nem\u0113\u0123ini. Cik labi t\u0101s integr\u0113jas ar visu p\u0101r\u0113jo tav\u0101 alokator\u0101, jo alokators veic daudzas lietas, un da\u017eas idejas tav\u0101 konkr\u0113taj\u0101 alokator\u0101 var nedarboties, bet cit\u0101 alokator\u0101 \u2013 bez probl\u0113m\u0101m. Galvenais veids, k\u0101 uzvar\u0113t alokatoram, ir izvilkt l\u0113nos elementus \u0101rpus galven\u0101 ce\u013ca un piespiedu k\u0101rt\u0101 sadal\u012bt pa l\u0113no ce\u013cu mal\u0101m. T\u0101p\u0113c, ja tu gribi palaist GC, iet pa l\u0113no ce\u013cu, deoptimiz\u0113t, izmest iz\u0146\u0113mumu, viss \u0161\u0101d\u0101 gar\u0101 - tu zini, ka \u0161\u012bs lietas ir sal\u012bdzino\u0161i retas. Un t\u0101s tie\u0161\u0101m ir reti, esmu p\u0101rbaud\u012bjis. Tu veic papildu darbu, un pateicoties tam paz\u016bd daudz ierobe\u017eojumu uz \u0161iem l\u0113najiem ce\u013ciem, bet tas nav \u013coti svar\u012bgi, jo tie ir l\u0113ni un pa tiem reti p\u0101rvietojas. Piem\u0113ram, nulles r\u0101d\u012bt\u0101js - tas nekad nenotiek, vai ne? Ir j\u0101b\u016bt vair\u0101k\u0101m ce\u013ca variant\u0113m da\u017e\u0101d\u0101m liet\u0101m, bet t\u0101m nevajadz\u0113tu sajaukties galvenaj\u0101.\u00a0<\/p>\n<p><\/p>\n<p><strong>Vladimirs<\/strong>: Ko tu dom\u0101 par daudzkodolu, kad kodolu ir t\u016bksto\u0161iem? Vai t\u0101 ir noder\u012bga lieta?<\/p>\n<p><\/p>\n<p><strong>Kliffs<\/strong>: GPU pan\u0101kumi par\u0101da, ka t\u0101 ir diezgan noder\u012bga!<\/p>\n<p><\/p>\n<p><strong>Vladimirs<\/strong>: Tie ir diezgan specializ\u0113ti. Bet ko par visp\u0101r\u012bg\u0101s lieto\u0161anas procesoriem?<\/p>\n<p><\/p>\n<p><strong>Kliffs<\/strong>: Nu, t\u0101 bija Azul biznesa modelis. Atbilde n\u0101ca v\u0113l taj\u0101 \u0113ras laik\u0101, kad cilv\u0113ki \u013coti m\u012bl\u0113ja prognoz\u0113jamu veiktsp\u0113ju. Taj\u0101 laik\u0101 bija gr\u016bti rakst\u012bt paral\u0113lo kodu. H2O kod\u0113\u0161anas modelis labi piel\u0101gojas, bet tas nav visp\u0101r\u0113jas lieto\u0161anas modelis. Dr\u012bz\u0101k tas ir nedaudz visp\u0101r\u012bg\u0101ks nek\u0101, izmantojot GPU. M\u0113s run\u0101jam par \u0161\u0101da veida izstr\u0101des gr\u016bt\u012bb\u0101m vai par t\u0101s izmanto\u0161anas sare\u017e\u0123\u012bt\u012bbu? Piem\u0113ram, interesants m\u0101c\u012bbu stunda, ko man deva Azul, diezgan neskaidrs: mazi ke\u0161i - tas ir norm\u0101li.\u00a0<\/p>\n<p><\/p>\n<h1 id=\"samyy-bolshoy-chellenzh-v-zhizni\">Liel\u0101kais izaicin\u0101jums dz\u012bv\u0113<\/h1>\n<p><\/p>\n<p><strong>Vladimirs<\/strong>: K\u0101 ir ar netehniskiem izaicin\u0101jumiem?<\/p>\n<p><\/p>\n<p><strong>Kliffs<\/strong>: Liel\u0101kais izaicin\u0101jums bija nenotikties\u2026 laipni un labi pret cilv\u0113kiem. Un k\u0101 sekas, es past\u0101v\u012bgi non\u0101cu \u013coti konfliktos situ\u0101cij\u0101s. Taj\u0101s, kur\u0101s es zin\u0101ju, ka viss norit nepareizi, bet nezin\u0101ju, k\u0101 virz\u012bties uz priek\u0161u \u0161o probl\u0113mu risin\u0101\u0161an\u0101 un nesp\u0113ju ar t\u0101m tikt gal\u0101. Daudzas ilgas probl\u0113mas, kas ilga desmitiem gadu, rad\u0101s tie\u0161i \u0161\u0101d\u0101 veid\u0101. Tas, ka Java ir kompilatori C1 un C2 \u2013 ir tie\u0161a \u0161\u012b sekas. Tas, ka Java desmit gadu garum\u0101 nebija daudzl\u012bme\u0146u kompil\u0101cijas \u2013 ar\u012b ir tie\u0161a sekas. Ac\u012bmredzami, ka mums \u0161\u0101da sist\u0113ma bija nepiecie\u0161ama, bet nav skaidrs, k\u0101p\u0113c t\u0101s nebija. Man bija probl\u0113mas ar vienu in\u017eenieri\u2026 vai in\u017eenieru grupu. Pirms daudziem gadiem, kad es s\u0101ku str\u0101d\u0101t Sun, es biju\u2026 Labi, ne tikai toreiz, man visp\u0101r vienm\u0113r ir savs viedoklis. Un es uzskat\u012bju, ka var vienk\u0101r\u0161i pa\u0146emt \u0161o savu paties\u012bbu un izteikt to tie\u0161i. Turkl\u0101t, es biju \u0161ok\u0113jo\u0161i pareizs liel\u0101ko da\u013cu laika. Un, ja tev \u0161\u0101ds pieeja nepat\u012bk\u2026 jo \u012bpa\u0161i, ja tu ac\u012bmredzami k\u013c\u016bdies un dari mu\u013c\u0137\u012bbas\u2026 Visp\u0101r, nedaudzi cilv\u0113ki var\u0113ja paciest \u0161\u0101du komunik\u0101cijas formu. Tom\u0113r da\u017ei var\u0113ja, piem\u0113ram, es. Es visu savu dz\u012bvi esmu b\u016bv\u0113jis uz meritokr\u0101tiskiem principiem. Ja tu man par\u0101d\u012bsi kaut ko nepareizu, es t\u016bl\u012bt pagriez\u012b\u0161os un teik\u0161u: tu teici mu\u013c\u0137\u012bbas. To darot, protams, atvainojos un visu t\u0101du, atz\u012b\u0161u nopelnu, ja t\u0101di visp\u0101r past\u0101v, un veicu citas pareizas darb\u012bbas. No otras puses, es esmu \u0161ok\u0113jo\u0161i pareizs \u0161ok\u0113jo\u0161i liel\u0101 procent\u0101 kop\u0113j\u0101 laika. Un tas nevis ir \u013coti labi str\u0101d\u0101 attiec\u012bb\u0101s ar cilv\u0113kiem. Es nemaz nem\u0113\u0123inu b\u016bt laipns, bet nost\u0101d\u012bju jaut\u0101jumu uz papl\u0101tes. \u201e\u0160is nekad nestr\u0101d\u0101s, jo viens, divi un tr\u012bs.\u201d Un vi\u0146i t\u0101di: \u201eAk!\u201d Bija ar\u012b citi sekas, kuras, iesp\u0113jams, lab\u0101k b\u016btu izlai\u017eu: piem\u0113ram, t\u0101di, kas noveda pie \u0161\u0137ir\u0161an\u0101s ar sievu un desmit gadu depresijas p\u0113c tam.<\/p>\n<p><\/p>\n<p>Izaicin\u0101jums ir c\u012b\u0146a ar cilv\u0113kiem, ar vi\u0146u uztveri par to, ko tu vari vai nevari dar\u012bt, kas ir svar\u012bgi un kas nav. Ir biju\u0161i daudzi izaicin\u0101jumi par kod\u0113\u0161anas stilu. Es joproj\u0101m rakstu daudz kodu, un tajos laikos man pat n\u0101c\u0101s pal\u0113nin\u0101t tempu, jo es veicu p\u0101r\u0101k daudz paral\u0113lu uzdevumu un neizdar\u012bju tos labi, nevis koncentr\u0113jos uz vienu. Atgrie\u017eoties pag\u0101tn\u0113, es uzrakst\u012bju pusi no Java JIT komandas koda, C2 komandas. N\u0101kamais \u0101tr\u0101kais kod\u0113t\u0101js rakst\u012bja uz pusi l\u0113n\u0101k, n\u0101kamais \u2013 v\u0113l uz pusi l\u0113n\u0101k, un tas bija eksponenci\u0101ls kritums. Sept\u012btais cilv\u0113ks \u0161aj\u0101 rind\u0101 bija \u013coti, \u013coti l\u0113ns \u2013 t\u0101 vienm\u0113r ir! Es str\u0101d\u0101ju ar daudz kodu. Es skat\u012bjos, kur\u0161 ko raksta, bez iz\u0146\u0113mumiem, es skat\u012bjos vi\u0146u kodu, veicu p\u0101rskatus par katru no vi\u0146iem un joproj\u0101m turpin\u0101ju rakst\u012bt vair\u0101k nek\u0101 k\u0101ds no vi\u0146iem. Ar cilv\u0113kiem \u0161\u0101da pieeja ne vienm\u0113r darboj\u0101s labi. Da\u017ei to nepatika. Un kad vi\u0146i ar to nesp\u0113ja tikt gal\u0101, s\u0101k\u0101s vis\u0101da veida s\u016bdz\u012bbas. Piem\u0113ram, reiz man tika teikts p\u0101rtraukt rakst\u012bt kodu, jo es rakstu p\u0101r\u0101k daudz kodu, un tas apdraud komandu, un viss tas man izklaus\u012bj\u0101s k\u0101 joks: \u010dalis, ja visa p\u0101r\u0113j\u0101 komanda izzud\u012bs un es turpin\u0101\u0161u rakst\u012bt kodu, tu zaud\u0113si tikai pusi komandas. No otras puses, ja es turpin\u0101\u0161u rakst\u012bt kodu un tu zaud\u0113si pusi komandas \u2013 tas izklaus\u0101s p\u0113c \u013coti sliktas p\u0101rvald\u012bbas. Es nekad par to daudz nedom\u0101ju, nekad par to nerun\u0101ju, bet tas tom\u0113r bija kaut kur man\u0101 pr\u0101t\u0101. Apzi\u0146\u0101 ri\u0146\u0137oja doma: 'J\u016bs ta\u010du jokojat?'. L\u012bdz ar to, visliel\u0101k\u0101 probl\u0113ma biju es un manas attiec\u012bbas ar cilv\u0113kiem. Tagad es saprotu sevi daudz lab\u0101k, es ilgi biju komandas vad\u012bt\u0101js programm\u0113t\u0101jiem, un tagad es taisni saku cilv\u0113kiem: zini, es esmu t\u0101ds, k\u0101ds es esmu, un jums b\u016bs j\u0101ar\u012b ar mani \u2013 vai ir labi, ja es \u0161eit past\u0101vu? Un kad vi\u0146i ar to s\u0101ka tikt gal\u0101, viss s\u0101ka darboties. Es nevienam neesmu ne slikts, ne labs, man nav nek\u0101du sliktu nodomu vai egoistisku tieksmju, tas vienk\u0101r\u0161i ir mans b\u016bt\u012bba, un ar to kaut k\u0101 j\u0101dz\u012bvo.<\/p>\n<p><\/p>\n<p><strong>Andrej<\/strong>Pavisam nesen visi s\u0101ka run\u0101t par pa\u0161apzi\u0146u introvertiem un visp\u0101r par m\u012bkstaj\u0101m prasm\u0113m. Ko par to var teikt?<\/p>\n<p><\/p>\n<p><strong>Kliffs<\/strong>: J\u0101, tas bija izpratne un m\u0101c\u012bba, ko es guvu no \u0161\u0137ir\u0161an\u0101s ar sievu. Ko es guvu no \u0161\u0137ir\u0161an\u0101s \u2013 t\u0101 ir izpratne par sevi. T\u0101 es s\u0101ku saprast citus cilv\u0113kus. Saprast, k\u0101 darbojas \u0161\u012b mijiedarb\u012bba. Tas izsauca atkl\u0101jumus viens p\u0113c otra. Par\u0101d\u012bj\u0101s apzi\u0146a, kas es esmu, un kas esmu. Ko es daru: vai es esmu noraiz\u0113jies par uzdevumu, vai izvairos no konflikta, vai kaut kas cits \u2013 un \u0161\u0101ds pa\u0161apzi\u0146as l\u012bmenis tie\u0161\u0101m pal\u012bdz tur\u0113t sevi rok\u0101s. P\u0113c tam viss iet daudz viegl\u0101k. Viens punkts, ko es esmu atkl\u0101jis ne tikai sev, bet ar\u012b citiem programm\u0113t\u0101jiem \u2013 nesp\u0113ja verbiliz\u0113t domas, kad esi emocion\u0101l\u0101 stresa st\u0101vokl\u012b. Piem\u0113ram, tu s\u0113di un kod\u0113, esi pl\u016bsm\u0101, un tad pie tevis pien\u0101k un s\u0101k kliegt hist\u0113rij\u0101, ka kaut kas ir sal\u016bzis, un tagad tiks pielietoti ekstr\u0113mi pas\u0101kumi. Un tu nesp\u0113j neko pateikt, jo esi emocion\u0101l\u0101 stresa st\u0101vokl\u012b. Ieg\u016bt\u0101 zin\u0101\u0161an\u0101s \u013cauj sagatavoties \u0161im mirklim, izdz\u012bvot to un p\u0101riet uz atk\u0101p\u0161an\u0101s pl\u0101nu, p\u0113c kura var dar\u012bt kaut ko. T\u0101tad, j\u0101, kad tu s\u0101k saprast, k\u0101 viss tas darbojas \u2013 tas ir milz\u012bgs notikums, kas maina dz\u012bvi.\u00a0<br \/>\nEs pats neizdev\u0101s atrast pareizos v\u0101rdus, bet atcer\u0113jos darb\u012bbu sec\u012bbu. J\u0113ga ir t\u0101da, ka \u0161\u012b reakcija ir tikpat fiziska, cik verb\u0101la, un tev ir nepiecie\u0161ama telpa. T\u0101du telpu, zen\u0101. Tie\u0161i to ir nepiecie\u0161ams izskaidrot, un tad uzreiz atk\u0101pties \u2013 t\u012bri fiziski atk\u0101pties. Kad es klus\u0113ju ar v\u0101rdiem, es varu apstr\u0101d\u0101t situ\u0101ciju emocion\u0101laj\u0101 da\u013c\u0101. P\u0113c tam, kad adrenal\u012bns non\u0101k smadzen\u0113s, tu p\u0101rej uz <\/p>\n<p><\/p>\n<p>Un t\u0101d\u0113\u013c ir nepiecie\u0161ama verb\u0101l\u0101 telpa. Vienk\u0101r\u0161i br\u012bva telpa. Ja visp\u0101r kaut ko teikt, tad var tie\u0161i to apgalvot, un p\u0113c tam doties un patie\u0161\u0101m atrast sev \"telpu\": doties pastaig\u0101 pa parku, iesl\u0113gties du\u0161\u0101 \u2013 nav noz\u012bmes. Galvenais ir uz laiku atsl\u0113gties no t\u0101s situ\u0101cijas. Tikko tu pat uz da\u017e\u0101m sekund\u0113m atsl\u0113dzies, atgrie\u017eas kontrole, tu s\u0101k dom\u0101t skaidri. \"Labi, es neesmu idiots, es nedaru mu\u013c\u0137\u012bgas lietas, es esmu diezgan noder\u012bgs cilv\u0113ks.\" Tikl\u012bdz tu sp\u0113j p\u0101rliecin\u0101t pats sevi, ir laiks p\u0101riet uz n\u0101kamo posmu: saprast, kas noticis. Tevi uzbruka, uzbrukums n\u0101ca no negaid\u012btas vietas, t\u0101 bija negod\u012bga izsist\u012bba. Tas ir slikti. N\u0101kamais solis \u2013 saprast, k\u0101p\u0113c uzbruc\u0113jam tas bija nepiecie\u0161ams. Paties\u012bb\u0101, k\u0101p\u0113c? Varb\u016bt t\u0101p\u0113c, ka vi\u0146\u0161 pats ir dusm\u012bgs? K\u0101p\u0113c vi\u0146\u0161 ir dusm\u012bgs? Piem\u0113ram, t\u0101p\u0113c, ka vi\u0146\u0161 pats ir k\u013c\u016bd\u012bjies un nevar uz\u0146emties atbild\u012bbu? \u0160\u0101d\u0101 veid\u0101 ir j\u0101piev\u0113r\u0161as visai situ\u0101cijai. Bet tam ir nepiecie\u0161ama manevr\u0113\u0161anas telpa, verb\u0101l\u0101 telpa. Pirmais solis \u2013 p\u0101rtraukt verb\u0101lo kontaktu. Aiziet no v\u0101rdu apsprie\u0161anas. Atcelt to, aiziet prom, cik \u0101tri vien iesp\u0113jams. Ja tas ir telefona saruna \u2013 vienk\u0101r\u0161i noliec klausuli \u2013 \u0161\u012b ir prasme, kuru es guvu no sarun\u0101m ar biju\u0161o sievu. Ja saruna nenoved pie nekas laba, vienk\u0101r\u0161i saki \"uz redz\u0113\u0161anos\" un noliec klausuli. No otras puses: \"bla-bla-bla\", tu atbildi: \"aha, uz redz\u0113\u0161anos!\" un noliec klausuli. Vienk\u0101r\u0161i p\u0101rtrauc sarunu. P\u0113c piec\u0101m min\u016bt\u0113m, kad tev atgrie\u017eas sp\u0113ja skaidri dom\u0101t, tu esi nedaudz atdzisis, k\u013c\u016bst iesp\u0113jams visu p\u0101rdom\u0101t, kas visp\u0101r notika un kas notiks t\u0101l\u0101k. Un s\u0101kt formul\u0113t p\u0101rdom\u0101tu atbildi, nevis vienk\u0101r\u0161i rea\u0123\u0113t uz emocij\u0101m. Man\u0101 pa\u0161a apzi\u0146as att\u012bst\u012bb\u0101 tie\u0161i tas, ka emocion\u0101l\u0101 stresa gad\u012bjum\u0101 es nevaru run\u0101t, ir bijis atkl\u0101jums. Iziet no \u0161\u012bs st\u0101vok\u013ca, apdom\u0101t un pl\u0101not, k\u0101 atbild\u0113t un kompens\u0113t probl\u0113mas \u2013 \u0161ie ir pareizi so\u013ci gad\u012bjum\u0101, ja nevar run\u0101t. Vienk\u0101r\u0161\u0101kais veids \u2013 aizb\u0113gt no situ\u0101cijas, kur\u0101 izpau\u017eas emocion\u0101lais stress un vienk\u0101r\u0161i p\u0101rtraukt piedal\u012bties \u0161aj\u0101 stres\u0101. P\u0113c tam tu atg\u016bsti sp\u0113ju dom\u0101t, kad tu vari dom\u0101t, par\u0101d\u0101s iesp\u0113ja run\u0101t, un t\u0101 t\u0101l\u0101k.<\/p>\n<p><\/p>\n<p>Starp citu, pret\u0113j\u0101s puses advok\u0101ts ties\u0101 m\u0113\u0123ina dar\u012bt to ar tevi \u2013 tagad jau ir skaidrs, k\u0101p\u0113c. Jo vi\u0146am ir iesp\u0113ja tevi apspiest l\u012bdz t\u0101dai pak\u0101pei, ka tu pat nevari izrun\u0101t savu v\u0101rdu, piem\u0113ram. Tie\u0161\u0101 noz\u012bm\u0113, tu nesp\u0113ji run\u0101t. Ja tas notiek ar tevi un ja tu zini, ka non\u0101ksi viet\u0101, kur plos\u0101s verb\u0101las c\u012b\u0146as, piem\u0113ram, ties\u0101, tu vari atn\u0101kt ar savu juristu. Jurists aizst\u0101v\u0113s tevi un p\u0101rtrauks verb\u0101lo uzbrukumu, un to izdar\u012bs pavisam likum\u012bgi, un tev atgriez\u012bsies zaud\u0113tais zen telpas saj\u016bta. Piem\u0113ram, man da\u017ereiz bija nepiecie\u0161ams piezvan\u012bt \u0123imenei, tiesnesis pret to attiec\u0101s diezgan draudz\u012bgi, bet pret\u0113j\u0101s puses advok\u0101ts kliedza un kliedza uz mani, es pat v\u0101rdu nevar\u0113ju ievietot. \u0160\u0101d\u0101s situ\u0101cij\u0101s man vislab\u0101k str\u0101d\u0101 starpnieka izmanto\u0161ana. Starpnieks p\u0101rtrauc visu \u0161o spiedienu, kas tev nep\u0101rtraukti pl\u016bst virs\u016b, tu atrod nepiecie\u0161amo zen telpas saj\u016btu, kop\u0101 ar to atgrie\u017eas sp\u0113ja run\u0101t. Tas ir vesela zin\u0101\u0161anu joma, kur\u0101 j\u0101apg\u016bst daudz, daudz j\u0101atkl\u0101j sev\u012b, un viss tas p\u0101rv\u0113r\u0161as augsta l\u012bme\u0146a strat\u0113\u0123iskos risin\u0101jumos, kas ir da\u017e\u0101di atkar\u012bb\u0101 no cilv\u0113ka. Da\u017eiem cilv\u0113kiem nav augst\u0101k min\u0113to probl\u0113mu, parasti t\u0101s nav cilv\u0113kiem, kas profesion\u0101li nodarbojas ar p\u0101rdo\u0161anu. Visi \u0161ie cilv\u0113ki, kas pelna iztiku ar v\u0101rdiem \u2013 paz\u012bstami dzied\u0101t\u0101ji, dzejnieki, reli\u0123iskie darbinieki un politi\u0137i, vi\u0146iem vienm\u0113r ir ko teikt. Vi\u0146iem nav \u0161\u0101du probl\u0113mu, bet man t\u0101s ir.<\/p>\n<p><\/p>\n<p><strong>Andrej<\/strong>: Tas bija\u2026 negaid\u012bti. Lieliski, m\u0113s jau esam diezgan daudz run\u0101ju\u0161i un ir laiks nosl\u0113gt \u0161o interviju. M\u0113s noteikti tiksimies konferenc\u0113 un var\u0113sim turpin\u0101t \u0161o dialogu. Tiksimies Hydra!<\/p>\n<p><\/p>\n<blockquote><p>Turpin\u0101t sarunu ar Klifu var\u0113s konferenc\u0113 Hydra 2019, kas notiks 11.-12. j\u016blij\u0101 2019. gad\u0101 Sanktp\u0113terburg\u0101. Vi\u0146\u0161 ierad\u012bsies ar zi\u0146ojumu <noindex><a rel=\"nofollow\" href=\"https:\/\/hydraconf.com\/2019\/talks\/2jix5mst7iduyp9linqhfj\/?utm_source=habr&amp;utm_medium=45871\">\u00abThe Azul Hardware Transactional Memory experience\u00bb<\/a><\/noindex>. Bi\u013cetes var ieg\u0101d\u0101ties <noindex><a rel=\"nofollow\" href=\"https:\/\/hydraconf.ru\/?utm_source=habr&amp;utm_medium=458718\">. Tas \u013cauj izveidot savu person\u012bgo pasauli, padarot to pieejamu savienojumam no jebkuras pasaules malas. Tiem, kas to dara pirmo reizi, ir lielisks<\/a><\/noindex>.<\/p><\/blockquote>\n<p>Avots: <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.5 - 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\/lv\/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.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"lv_LV\" \/>\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\/lv\/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\udd47Liels intervija ar Klifu Kliku \u2014 JIT kompil\u0101cijas t\u0113vu Java | ProHoster","description":"Klifs Kliks \u2014.","canonical_url":"https:\/\/prohoster.info\/lv\/blog\/administrirovanie\/bolshoe-intervyu-s-kliffom-klikom-ottsom-jit-kompilyatsii-v-java","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"lv_LV","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\/lv\/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\/lv\/wp-json\/wp\/v2\/posts\/35851","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/comments?post=35851"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts\/35851\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/media?parent=35851"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/categories?post=35851"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/tags?post=35851"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}