{"id":16337,"date":"2023-07-04T14:38:03","date_gmt":"2023-07-04T12:38:03","guid":{"rendered":"https:\/\/vived.io\/?p=16337"},"modified":"2023-07-04T14:38:07","modified_gmt":"2023-07-04T12:38:07","slug":"streamgather-duzy-skok-w-rozwoju-stream-api-jvm-weekly-vol-141","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/streamgather-duzy-skok-w-rozwoju-stream-api-jvm-weekly-vol-141\/","title":{"rendered":"Stream::gather, du\u017cy skok w rozwoju Stream API &#8211; JVM Weekly vol. 141"},"content":{"rendered":"\n<h2 id=\"1-vector-api-jeszcze-nie-wyszlo-z-inkubatora-a-juz-znajduje-zastosowania\" data-num=1>1. Vector API jeszcze nie wysz\u0142o z Inkubatora, a ju\u017c znajduje zastosowania<\/h2>\n\n\n\n<p>Vector API jest moj\u0105 ulubion\u0105 ofiar\u0105 \u017cart\u00f3w, ze wzgl\u0119du na fakt, \u017ce pozostaje ono w wiecznej inkubacji wraz z kolejnymi wydaniami JDK, w oczekiwaniu na stabilizacj\u0119 API projektu Valhalla. Dla wielu projekt\u00f3w czekanie to jest wyj\u0105tkowo niezno\u015bne, poniewa\u017c Vector API przynie\u015b\u0107 ma umo\u017cliwi\u0107 \u015bwiadome korzystanie z SIMD, b\u0119d\u0105cego skr\u00f3tem od Single Instruction, Multiple Data (pojedyncza instrukcja, wiele danych). Jako, \u017ce moja mama jest nauczycielk\u0105, moj\u0105 ulubion\u0105 analogi\u0105 jest pedagog, kt\u00f3ry musi zaznaczy\u0107 ten sam test dla ca\u0142ej klasy. SIMD to oznaczanie wszystkich test\u00f3w w tym samym czasie dla tego samego pytania, zamiast oznaczania ka\u017cdego testu jeden po drugim, co znacznie przyspiesza proces oznaczania. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"690\" height=\"362\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image.png\" alt=\"\" class=\"wp-image-16338\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image.png 690w, https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image-300x157.png 300w\" sizes=\"auto, (max-width: 690px) 100vw, 690px\" \/><figcaption class=\"wp-element-caption\">I tak, wiem \u017ce to troch\u0119 analogia jak wyja\u015bnianie monad za pomoc\u0105 burrito, ale my\u015bl\u0119, \u017ce zaraz zrobi si\u0119 pro\u015bciej.<\/figcaption><\/figure><\/div>\n\n\n<p>Dlatego te\u017c niekt\u00f3re projekty dreptaj\u0105 n\u00f3\u017ckami szybciej ni\u017c inne. Kojarzycie Lucene? Nawet je\u015bli nie, to na pewno na waszym radarze pojawi\u0142y si\u0119 kiedy\u015b projekty na niej oparte &#8211; Apache Solr i ElasticSearch. Lucene to bowiem napisany w Javie silnik wyszukiwarki, wi\u0119c projekt, dla kt\u00f3rego zmiany przynoszone przez Vector API s\u0105 niezwykle \u0142akomym k\u0105skiem. <\/p>\n\n\n\n<p>Jak opisano w publikacji <a href=\"https:\/\/www.elastic.co\/blog\/accelerating-vector-search-simd-instructions\">Accelerating vector search with SIMD instructions<\/a>, opublikowanej na blogu Elastica, Lucene osi\u0105gn\u0119\u0142a w\u0142a\u015bnie znacz\u0105cy post\u0119p w zakresie wydajno\u015bci Vector API. Operacja wyszukiwania wektorowego, kluczowa dla znajdowania podobie\u0144stwa mi\u0119dzy dwoma wektorami, tradycyjnie wykorzystywa\u0142a implementacje skalarne &#8211; czyli w oparciu o dzia\u0142ania matematyczne, kt\u00f3re s\u0105 wykonywane na pojedynczych liczbach, takie jak dodawanie, odejmowanie, mno\u017cenie i dzielenie. Ju\u017c pewnie widzicie gdzie to wszystko prowadzi &#8211; adopcja Vector API umo\u017cliwi\u0142a wykorzystanie operacji SIMD, \u015bwietnie nadaj\u0105cych si\u0119 do dzia\u0142a\u0144 na wektorach. Do tej pory kompilator C2 ju\u017c wprawdzie samodzielnie pr\u00f3bowa\u0142 optymalizowa\u0107 poszczeg\u00f3lne fragmenty kodu, ale dopiero teraz programista mo\u017ce sam wskaza\u0107 miejsca do optymalizacji. Efektem jest znaczna poprawa wydajno\u015bci, odnotowana w testach por\u00f3wnawczych wyszukiwania wektorowego. Nazwa Vector API zobowi\u0105zuje.<\/p>\n\n\n\n<p>Przyj\u0119cie Vector API przez Lucene, pomimo jego inkubacyjnego statusu, oznacza kompromis mi\u0119dzy wykorzystaniem potencjalnych korzy\u015bci z \u015bwie\u017cutkiego API, a kosztami utrzymania zale\u017cno\u015bci na nieostatecznym projekcie, kt\u00f3ry mo\u017ce jeszcze ulec zmianie. Mimo to, Vector API przynosi na tyle dobre efekty, \u017ce zdecydowano si\u0119 na utrzymywanie dw\u00f3ch wersji projektu &#8211; jednej opartej o star\u0105 implementacj\u0119 i drug\u0105 wspart\u0105 o Vector API. Zmiany te zostan\u0105 uwzgl\u0119dnione ju\u017c w Elasticsearch 8.9.0, a tempo to jeszcze bardziej podkre\u015bla jak bardzo zale\u017cy tw\u00f3rcom na ich wprowadzeniu. Elastic te\u017c jest teraz chyba pierwszym znanym projektem, kt\u00f3ry zdecydowa\u0142 si\u0119 na u\u017cycie inkubowanego API w swojej wersji produkcyjnej.<\/p>\n\n\n\n<h2 id=\"2-jak-wyglada-rozwiniecie-streams-api-zaproponowane-przez-tworce-akki\" data-num=2>2. Jak wygl\u0105da rozwini\u0119cie Streams API zaproponowane przez tw\u00f3rc\u0119 Akki?<\/h2>\n\n\n\n<p>Co si\u0119 stanie kiedy by\u0142y Tech Lead Akki, Viktor Klang, zaproponuje zmiany w Stream API? Wygl\u0105da na to, \u017ce dostajemy bardzo przemy\u015blan\u0105 propozycje kierunku, w kt\u00f3rym chyba najlepiej zaadoptowana w ostatniej dekadzie nowo\u015b\u0107 w j\u0119zyku mo\u017ce by\u0107 rozwijana.<\/p>\n\n\n\n<p>Chocia\u017c istniej\u0105cy interfejs Stream API oferuje ju\u017c bogaty zestaw operacji procesuj\u0105cych (jak <code>.map<\/code>, <code>.filter<\/code> ), istnia\u0142a potrzeba rozszerzenia go i takie jak <code>fixedWindow(2)<\/code> czy <code>scan((sum, next) -&gt; sum + next)<\/code>. Propozycja Viktora wynika z powtarzaj\u0105cych si\u0119 pr\u00f3\u015bb o dodanie takich dodatkowych operacji do Stream API w Javie 8, kt\u00f3rych nie mo\u017cna by\u0142o spe\u0142ni\u0107, poniewa\u017c ich u\u017cycie by\u0142o zbyt w\u0105skie, aby umie\u015bci\u0107 je w podstawowym Stream API. Na ten moment nie istnieje jednak opcja, \u017ceby kto\u015b samodzielnie stworzy\u0142 sobie w\u0142asn\u0105 operacje procesuj\u0105c\u0105, jak to ma miejsce w przypadku interfejsu <code>Stream::collect<\/code>, w zwi\u0105zku z czym czasem okazuje si\u0119, \u017ce osi\u0105gni\u0119cie niekt\u00f3rych efekt\u00f3w jest zaskakuj\u0105co trudne.. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image-5.png\" alt=\"\" class=\"wp-image-16354\" width=\"375\" height=\"375\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image-5.png 500w, https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image-5-300x300.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image-5-150x150.png 150w\" sizes=\"auto, (max-width: 375px) 100vw, 375px\" \/><figcaption class=\"wp-element-caption\">Dla kolegi pytam.<\/figcaption><\/figure><\/div>\n\n\n<p>Nowy interfejs <code>Stream::gather<\/code> s\u0142u\u017cy\u0142by do tworzenia w\u0142asnych operacja po\u015brednia, zdolna do obs\u0142ugi wielu ich rodzaju. Viktor przeprowadzi\u0142 bowiem w swoim dokumencie <a href=\"https:\/\/cr.openjdk.org\/~vklang\/Gatherers.html\">Gathering the streams<\/a> wnikliw\u0105 klasyfikacje r\u00f3\u017cnego rodzaju przypadk\u00f3w u\u017cycia nowego API, opisuj\u0105cych r\u00f3\u017cne rodzaje operacji strumieniowych, takich jak operacje po\u015brednie, operacje przyrostowe, operacje stanowe, bezstanowe&#8230; ca\u0142o\u015b\u0107 naprawd\u0119 dobrze opisuje wspomniany ju\u017c <a href=\"https:\/\/cr.openjdk.org\/~vklang\/Gatherers.html\">oryginalny dokument<\/a>. Gatherer, bo tak nazwany zosta\u0142 nowy interfejs, w swojej budowie bardzo przypomina dobrze znanego Collectora, na kt\u00f3rym zreszt\u0105 zosta\u0142 oparty. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/** @param &lt;T&gt; the element type\n *  @param &lt;A&gt; the (mutable) intermediate accumulation type\n *  @param &lt;R&gt; the (probably immutable) final accumulation type\n *\/\ninterface Gatherer&lt;T,A,R&gt; {\n    Supplier&lt;A&gt; supplier();\n    BiConsumer&lt;A, T&gt; accumulator();\n    BinaryOperator&lt;A&gt; combiner();\n    Function&lt;A, R&gt; finisher();\n}\n<\/code><\/pre>\n\n\n\n<p>Gatherer zosta\u0142 zaprojektowany, aby zapewni\u0107 mo\u017cliwo\u015b\u0107 kompozycji i reu\u017cywalno\u015bci poszczeg\u00f3lnych stworzonych z jego pomoc\u0105 komponent\u00f3w. Jako przyk\u0142ad mo\u017ce pos\u0142u\u017cy\u0107 implementacja znanego <code>map<\/code> na wsp\u00f3lnej abstrakcji:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public final static &lt;T,R&gt; Gatherer&lt;T, ?, R&gt; map(Function&lt;? super T, ? extends R&gt; mapper) {\n    return Gatherer.of(\n        () -&gt; (Void)null,\n        (nothing, element, downstream) -&gt;\n            downstream.flush(mapper.apply(element)),\n        (l,r) -&gt; l,\n        (nothing, downstream) -&gt; {}\n    );\n}\n<\/code><\/pre>\n\n\n\n<p>Polecam zapozna\u0107 si\u0119 nie <a href=\"https:\/\/cr.openjdk.org\/~vklang\/Gatherers.html\">tylko z proposalem<\/a>, ale r\u00f3wnie\u017c <a href=\"https:\/\/mail.openjdk.org\/pipermail\/core-libs-dev\/2023-June\/108655.html\">komentarzami, kt\u00f3re wywo\u0142a\u0142 w w\u0105tku mailowym<\/a>. Og\u00f3lnie reakcje s\u0105 do\u015b\u0107 entuzjastyczne, cho\u0107 pojawiaj\u0105 si\u0119 te\u017c zarzuty m\u00f3wi\u0105ce o pewnym skomplikowaniu propozycji. Wygl\u0105da jednak na to, \u017ce kt\u00f3ra\u015b z przysz\u0142ych iteracji ma szanse trafi\u0107 do JDK, co powinno pozytywnie wp\u0142yn\u0105\u0107 na mo\u017cliwo\u015b\u0107 rozszerzania Stream API.<\/p>\n\n\n\n<h2 id=\"3-google-chce-zaproponowac-nowy-sposob-dystrybucji-aplikacji-java\" data-num=3>3. Google chce zaproponowa\u0107 nowy spos\u00f3b dystrybucji aplikacji Java<\/h2>\n\n\n\n<p>Ostatnimi tygodniami spo\u0142eczno\u015b\u0107 Redditowa pr\u00f3bowa\u0142a dokona\u0107 buntu przed wprowadzeniem op\u0142at za u\u017cycie API, przez co wiele spo\u0142eczno\u015bci pozostawa\u0142o na d\u0142ugi czas zamkni\u0119tymi. Zabrzmi nieco coehlhowsko, ale w takich momentach (kiedy go nie ma) u\u015bwiadomi\u0107 sobie mo\u017cna, jak przydatnym narz\u0119dziem jest Reddit. O ile bowiem \u015bledzenie nowo\u015bci w miar\u0119 na bie\u017c\u0105co bywa czasoch\u0142onne, ale jest raczej do\u015b\u0107 proste, o tyle spo\u0142eczno\u015b\u0107 portalu przynosi niekt\u00f3rym tematom znacznie szerszy kontekst, a dodatkowo potrafi wyci\u0105gn\u0105\u0107 na wierzch tematy, kt\u00f3re w momencie publikacji przesz\u0142y pod radarem (przynajmniej pod moim). Tak wygl\u0105da sprawa z Hermetic Java, nowym podej\u015bciem do dystrybucji aplikacji zaprezentowanym przez <a href=\"https:\/\/twitter.com\/jiangli_zhou\">Jiangli Zhou<\/a> z Google jeszcze w lutym. Dzi\u0119ki Redditowi dosta\u0142em jednak od losu drug\u0105 szans\u0119 i mo\u017cecie zapozna\u0107 si\u0119 z t\u0105 naprawd\u0119 interesuj\u0105c\u0105 koncepcj\u0105.<\/p>\n\n\n\n<p>Na <a href=\"https:\/\/cr.openjdk.org\/~jiangli\/hermetic_java.pdf\">podstawie prezentacji z proposalem<\/a> i <a href=\"https:\/\/mail.openjdk.org\/pipermail\/leyden-dev\/2023-February\/000106.html\">w\u0105tku mailowego<\/a> wynika, \u017ce Hermetic Java jest rozwi\u0105zaniem s\u0142u\u017c\u0105cym do tworzenia samodzielnych i wysokowydajnych obraz\u00f3w wykonywalnych Java. Jego g\u0142\u00f3wnym celem jest rozwi\u0105zanie problem\u00f3w zwi\u0105zanych z pakowaniem i wdra\u017caniem aplikacji Java, a zw\u0142aszcza ich p\u00f3\u017aniejszej dystrybucji.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"584\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image-1-1024x584.png\" alt=\"\" class=\"wp-image-16341\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image-1-1024x584.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image-1-300x171.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image-1-768x438.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image-1.png 1474w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Hermetic Java to bowiem narz\u0119dzie do tworzenia samodzielnych plik\u00f3w wykonywalnych aplikacji JVM-owych. Wprowadza koncept obrazu wykonywalnego, kt\u00f3ry \u0142\u0105czy instrukcje uruchamiaj\u0105ce, JDK runtime i JAR. Obraz sam ten sk\u0142ada si\u0119 z sekcji ELF (b\u0119d\u0105cego Java Launcherem), sekcji JDK dla modu\u0142\u00f3w i archiwum Class Data Sharing (CDS) oraz sekcji JAR dla aplikacji i zasob\u00f3w. Dodatkowo umo\u017cliwia dynamiczne \u0142adowanie zewn\u0119trznych klas w razie potrzeby, ale te\u017c wspiera\u0107 kod ahead-of-time. Propozycja ma inkorporowa\u0107 ostatnie gor\u0105ce nowo\u015bci w \u015bwiecie JVM, inspiruj\u0105c si\u0119 takimi inicjatywami jak GraalVM, Project Leyden, AWS Lambda SnapStart i Checkpoint-Restore in Userspace (CRaC).<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image-3.png\" alt=\"\" class=\"wp-image-16346\" width=\"680\" height=\"206\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image-3.png 907w, https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image-3-300x91.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image-3-768x233.png 768w\" sizes=\"auto, (max-width: 680px) 100vw, 680px\" \/><figcaption class=\"wp-element-caption\">To tak jakby kto\u015b chcia\u0142 zagra\u0107 w JVM Bingo<\/figcaption><\/figure><\/div>\n\n\n<p>Patrz\u0105c na zalety, Hermetic Java eliminuje potrzeb\u0119 posiadania zewn\u0119trznych plik\u00f3w \u015brodowiska uruchomieniowego JDK i nie wymaga okre\u015blania konkretnej wersji JDK do wdro\u017cenia. Dzi\u0119ki temu obraz ten jest kompatybilny z r\u00f3\u017cnymi \u015brodowiskami i upraszcza wdra\u017canie aplikacji. Tworzeniem obraz\u00f3w Hermetic Java zajmowa\u0107 si\u0119 ma <code>singlejar<\/code>, czyli narz\u0119dzie ju\u017c w tej chwili u\u017cywane w ramach build toola Bazel. Format obrazu jest niezale\u017cny od platformy i obs\u0142uguje zar\u00f3wno linkowanie dynamiczne, jak i statyczne.<\/p>\n\n\n\n<p>Na powierzchni Hermetic Java i GraalVM mog\u0105 wygl\u0105da\u0107 podobnie, ale nie dajcie si\u0119 zwie\u015b\u0107 pozorom. Hermetic Java i GraalVM to dwa r\u00f3\u017cne podej\u015bcia do kompilowania i pakowania aplikacji Java do wdro\u017cenia. GraalVM wykorzystuje narz\u0119dzie <code>native-image<\/code> do kompilowania aplikacji AoT i opiera si\u0119 na SubstratVM, alternatywnej maszynie wirtualnej. Dodatkowo, GraalVM bazuje na za\u0142o\u017ceniu &#8222;zamkni\u0119tego \u015bwiata&#8221; (braku mo\u017cliwo\u015bci dostarczenia dodatkowych klas z ClassPath), co pozwala mu na zaawansowane optymalizacje. Z drugiej strony, Hermetic Java koncentruje si\u0119 na tworzeniu samodzielnego statycznego obrazu, kt\u00f3ry sam w sobie posiada wszystkie niezb\u0119dne elementy do uruchomienia aplikacji. Takie podej\u015bcie eliminuje potrzeb\u0119 stosowania zewn\u0119trznego \u015brodowiska uruchomieniowego, eliminuje problemy zwi\u0105zane z wersj\u0105 JDK i mo\u017ce dzia\u0142a\u0107 na r\u00f3\u017cnych platformach. W przeciwie\u0144stwie do GraalVM, Hermetic Java zachowuje kompatybilno\u015b\u0107 z OpenJDK i Hotspot VM, umo\u017cliwiaj\u0105c integracj\u0119 z istniej\u0105cymi i przysz\u0142ymi funkcjami tych \u015brodowisk. Bardziej ni\u017c do obraz\u00f3w GraalVM por\u00f3wna\u0142bym je wi\u0119c do mixu UberJara z obrazem Dockerowym.<\/p>\n\n\n\n<p>Czekam w zwi\u0105zku z tym na obiecanego JEP-a &#8211; zaprezentowane rozwi\u0105zanie mo\u017ce by\u0107 interesuj\u0105cym rozwi\u0105zaniem dla projekt\u00f3w, kt\u00f3re nie s\u0105 w stanie (lub nie maj\u0105 potrzeby) przej\u015b\u0107 na GraalVM.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image-4-1024x421.png\" alt=\"\" class=\"wp-image-16349\" width=\"768\" height=\"316\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image-4-1024x421.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image-4-300x123.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image-4-768x316.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image-4.png 1173w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><figcaption class=\"wp-element-caption\">No i oczywi\u015bcie na pierwsze demo &#8211; jestem w stanie si\u0119 za\u0142o\u017cy\u0107, \u017ce jedn\u0105 z pierwszych tak zapakowanych rzeczy b\u0119dzie Minecraft. To zawsze jest Minecraft.<\/figcaption><\/figure><\/div>","protected":false},"excerpt":{"rendered":"<p>Dzisiaj to co tygryski lubi\u0105 najbardziej &#8211; trzy tematy, i ka\u017cdy z nich bardzo mocno technologiczny. Porozmawiamy wi\u0119c o Vector API, propozycji zmian w Stream API i Hermetycznej Javie.<\/p>\n","protected":false},"author":10,"featured_media":16361,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[259,1],"tags":[],"class_list":["post-16337","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jvm-pl","category-no-category"],"acf":{"estimated_reading_time":"7","feature_image_blog":false,"weekly_summary":true,"push_notification_image":"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/JVM-Weekly-1200x628_V2.png","feature_image_visible":false},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Stream::gather, du\u017cy skok w rozwoju Stream API - JVM Weekly vol. 141 - Vived<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vived.io\/pl\/streamgather-duzy-skok-w-rozwoju-stream-api-jvm-weekly-vol-141\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Stream::gather, du\u017cy skok w rozwoju Stream API - JVM Weekly vol. 141 - Vived\" \/>\n<meta property=\"og:description\" content=\"Dzisiaj to co tygryski lubi\u0105 najbardziej - trzy tematy, i ka\u017cdy z nich bardzo mocno technologiczny. Porozmawiamy wi\u0119c o Vector API, propozycji zmian w Stream API i Hermetycznej Javie.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/streamgather-duzy-skok-w-rozwoju-stream-api-jvm-weekly-vol-141\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2023-07-04T12:38:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-07-04T12:38:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/JVM-Weekly-1200x628_V2.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Artur Skowro\u0144ski\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/vived.io\/pl\/streamgather-duzy-skok-w-rozwoju-stream-api-jvm-weekly-vol-141\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/streamgather-duzy-skok-w-rozwoju-stream-api-jvm-weekly-vol-141\/\"},\"author\":{\"name\":\"Artur Skowro\u0144ski\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\"},\"headline\":\"Stream::gather, du\u017cy skok w rozwoju Stream API &#8211; JVM Weekly vol. 141\",\"datePublished\":\"2023-07-04T12:38:03+00:00\",\"dateModified\":\"2023-07-04T12:38:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/streamgather-duzy-skok-w-rozwoju-stream-api-jvm-weekly-vol-141\/\"},\"wordCount\":1478,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/streamgather-duzy-skok-w-rozwoju-stream-api-jvm-weekly-vol-141\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/JVM-Weekly-1200x628_V2.png\",\"articleSection\":[\"JVM\",\"No category\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/streamgather-duzy-skok-w-rozwoju-stream-api-jvm-weekly-vol-141\/\",\"url\":\"https:\/\/vived.io\/pl\/streamgather-duzy-skok-w-rozwoju-stream-api-jvm-weekly-vol-141\/\",\"name\":\"Stream::gather, du\u017cy skok w rozwoju Stream API - JVM Weekly vol. 141 - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/streamgather-duzy-skok-w-rozwoju-stream-api-jvm-weekly-vol-141\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/streamgather-duzy-skok-w-rozwoju-stream-api-jvm-weekly-vol-141\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/JVM-Weekly-1200x628_V2.png\",\"datePublished\":\"2023-07-04T12:38:03+00:00\",\"dateModified\":\"2023-07-04T12:38:07+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/streamgather-duzy-skok-w-rozwoju-stream-api-jvm-weekly-vol-141\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/streamgather-duzy-skok-w-rozwoju-stream-api-jvm-weekly-vol-141\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/streamgather-duzy-skok-w-rozwoju-stream-api-jvm-weekly-vol-141\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/JVM-Weekly-1200x628_V2.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/JVM-Weekly-1200x628_V2.png\",\"width\":1200,\"height\":628},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/streamgather-duzy-skok-w-rozwoju-stream-api-jvm-weekly-vol-141\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Stream::gather, du\u017cy skok w rozwoju Stream API &#8211; JVM Weekly vol. 141\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/vived.io\/pl\/#website\",\"url\":\"https:\/\/vived.io\/pl\/\",\"name\":\"Vived\",\"description\":\"platform empowering IT people and technology companies to synergic growth\",\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/vived.io\/pl\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/vived.io\/pl\/#organization\",\"name\":\"Vived\",\"url\":\"https:\/\/vived.io\/pl\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png\",\"width\":136,\"height\":45,\"caption\":\"Vived\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\",\"name\":\"Artur Skowro\u0144ski\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g\",\"caption\":\"Artur Skowro\u0144ski\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Stream::gather, du\u017cy skok w rozwoju Stream API - JVM Weekly vol. 141 - Vived","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vived.io\/pl\/streamgather-duzy-skok-w-rozwoju-stream-api-jvm-weekly-vol-141\/","og_locale":"pl_PL","og_type":"article","og_title":"Stream::gather, du\u017cy skok w rozwoju Stream API - JVM Weekly vol. 141 - Vived","og_description":"Dzisiaj to co tygryski lubi\u0105 najbardziej - trzy tematy, i ka\u017cdy z nich bardzo mocno technologiczny. Porozmawiamy wi\u0119c o Vector API, propozycji zmian w Stream API i Hermetycznej Javie.","og_url":"https:\/\/vived.io\/pl\/streamgather-duzy-skok-w-rozwoju-stream-api-jvm-weekly-vol-141\/","og_site_name":"Vived","article_published_time":"2023-07-04T12:38:03+00:00","article_modified_time":"2023-07-04T12:38:07+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/JVM-Weekly-1200x628_V2.png","type":"image\/png"}],"author":"Artur Skowro\u0144ski","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/vived.io\/pl\/streamgather-duzy-skok-w-rozwoju-stream-api-jvm-weekly-vol-141\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/streamgather-duzy-skok-w-rozwoju-stream-api-jvm-weekly-vol-141\/"},"author":{"name":"Artur Skowro\u0144ski","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3"},"headline":"Stream::gather, du\u017cy skok w rozwoju Stream API &#8211; JVM Weekly vol. 141","datePublished":"2023-07-04T12:38:03+00:00","dateModified":"2023-07-04T12:38:07+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/streamgather-duzy-skok-w-rozwoju-stream-api-jvm-weekly-vol-141\/"},"wordCount":1478,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/streamgather-duzy-skok-w-rozwoju-stream-api-jvm-weekly-vol-141\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/JVM-Weekly-1200x628_V2.png","articleSection":["JVM","No category"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/streamgather-duzy-skok-w-rozwoju-stream-api-jvm-weekly-vol-141\/","url":"https:\/\/vived.io\/pl\/streamgather-duzy-skok-w-rozwoju-stream-api-jvm-weekly-vol-141\/","name":"Stream::gather, du\u017cy skok w rozwoju Stream API - JVM Weekly vol. 141 - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/streamgather-duzy-skok-w-rozwoju-stream-api-jvm-weekly-vol-141\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/streamgather-duzy-skok-w-rozwoju-stream-api-jvm-weekly-vol-141\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/JVM-Weekly-1200x628_V2.png","datePublished":"2023-07-04T12:38:03+00:00","dateModified":"2023-07-04T12:38:07+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/streamgather-duzy-skok-w-rozwoju-stream-api-jvm-weekly-vol-141\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/streamgather-duzy-skok-w-rozwoju-stream-api-jvm-weekly-vol-141\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/streamgather-duzy-skok-w-rozwoju-stream-api-jvm-weekly-vol-141\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/JVM-Weekly-1200x628_V2.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/JVM-Weekly-1200x628_V2.png","width":1200,"height":628},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/streamgather-duzy-skok-w-rozwoju-stream-api-jvm-weekly-vol-141\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"Stream::gather, du\u017cy skok w rozwoju Stream API &#8211; JVM Weekly vol. 141"}]},{"@type":"WebSite","@id":"https:\/\/vived.io\/pl\/#website","url":"https:\/\/vived.io\/pl\/","name":"Vived","description":"platform empowering IT people and technology companies to synergic growth","publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vived.io\/pl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/vived.io\/pl\/#organization","name":"Vived","url":"https:\/\/vived.io\/pl\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/","url":"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png","width":136,"height":45,"caption":"Vived"},"image":{"@id":"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3","name":"Artur Skowro\u0144ski","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g","caption":"Artur Skowro\u0144ski"}}]}},"blocks_vived":[{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">1. Vector API jeszcze nie wysz\u0142o z Inkubatora, a ju\u017c znajduje zastosowania<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">1. Vector API jeszcze nie wysz\u0142o z Inkubatora, a ju\u017c znajduje zastosowania<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Vector API jest moj\u0105 ulubion\u0105 ofiar\u0105 \u017cart\u00f3w, ze wzgl\u0119du na fakt, \u017ce pozostaje ono w wiecznej inkubacji wraz z kolejnymi wydaniami JDK, w oczekiwaniu na stabilizacj\u0119 API projektu Valhalla. Dla wielu projekt\u00f3w czekanie to jest wyj\u0105tkowo niezno\u015bne, poniewa\u017c Vector API przynie\u015b\u0107 ma umo\u017cliwi\u0107 \u015bwiadome korzystanie z SIMD, b\u0119d\u0105cego skr\u00f3tem od Single Instruction, Multiple Data (pojedyncza instrukcja, wiele danych). Jako, \u017ce moja mama jest nauczycielk\u0105, moj\u0105 ulubion\u0105 analogi\u0105 jest pedagog, kt\u00f3ry musi zaznaczy\u0107 ten sam test dla ca\u0142ej klasy. SIMD to oznaczanie wszystkich test\u00f3w w tym samym czasie dla tego samego pytania, zamiast oznaczania ka\u017cdego testu jeden po drugim, co znacznie przyspiesza proces oznaczania. <\/p>\n","innerContent":["\n<p>Vector API jest moj\u0105 ulubion\u0105 ofiar\u0105 \u017cart\u00f3w, ze wzgl\u0119du na fakt, \u017ce pozostaje ono w wiecznej inkubacji wraz z kolejnymi wydaniami JDK, w oczekiwaniu na stabilizacj\u0119 API projektu Valhalla. Dla wielu projekt\u00f3w czekanie to jest wyj\u0105tkowo niezno\u015bne, poniewa\u017c Vector API przynie\u015b\u0107 ma umo\u017cliwi\u0107 \u015bwiadome korzystanie z SIMD, b\u0119d\u0105cego skr\u00f3tem od Single Instruction, Multiple Data (pojedyncza instrukcja, wiele danych). Jako, \u017ce moja mama jest nauczycielk\u0105, moj\u0105 ulubion\u0105 analogi\u0105 jest pedagog, kt\u00f3ry musi zaznaczy\u0107 ten sam test dla ca\u0142ej klasy. SIMD to oznaczanie wszystkich test\u00f3w w tym samym czasie dla tego samego pytania, zamiast oznaczania ka\u017cdego testu jeden po drugim, co znacznie przyspiesza proces oznaczania. <\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16338,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image.png\" alt=\"\" class=\"wp-image-16338\"\/><figcaption class=\"wp-element-caption\">I tak, wiem \u017ce to troch\u0119 analogia jak wyja\u015bnianie monad za pomoc\u0105 burrito, ale my\u015bl\u0119, \u017ce zaraz zrobi si\u0119 pro\u015bciej.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image.png\" alt=\"\" class=\"wp-image-16338\"\/><figcaption class=\"wp-element-caption\">I tak, wiem \u017ce to troch\u0119 analogia jak wyja\u015bnianie monad za pomoc\u0105 burrito, ale my\u015bl\u0119, \u017ce zaraz zrobi si\u0119 pro\u015bciej.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dlatego te\u017c niekt\u00f3re projekty dreptaj\u0105 n\u00f3\u017ckami szybciej ni\u017c inne. Kojarzycie Lucene? Nawet je\u015bli nie, to na pewno na waszym radarze pojawi\u0142y si\u0119 kiedy\u015b projekty na niej oparte - Apache Solr i ElasticSearch. Lucene to bowiem napisany w Javie silnik wyszukiwarki, wi\u0119c projekt, dla kt\u00f3rego zmiany przynoszone przez Vector API s\u0105 niezwykle \u0142akomym k\u0105skiem. <\/p>\n","innerContent":["\n<p>Dlatego te\u017c niekt\u00f3re projekty dreptaj\u0105 n\u00f3\u017ckami szybciej ni\u017c inne. Kojarzycie Lucene? Nawet je\u015bli nie, to na pewno na waszym radarze pojawi\u0142y si\u0119 kiedy\u015b projekty na niej oparte - Apache Solr i ElasticSearch. Lucene to bowiem napisany w Javie silnik wyszukiwarki, wi\u0119c projekt, dla kt\u00f3rego zmiany przynoszone przez Vector API s\u0105 niezwykle \u0142akomym k\u0105skiem. <\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jak opisano w publikacji <a href=\"https:\/\/www.elastic.co\/blog\/accelerating-vector-search-simd-instructions\">Accelerating vector search with SIMD instructions<\/a>, opublikowanej na blogu Elastica, Lucene osi\u0105gn\u0119\u0142a w\u0142a\u015bnie znacz\u0105cy post\u0119p w zakresie wydajno\u015bci Vector API. Operacja wyszukiwania wektorowego, kluczowa dla znajdowania podobie\u0144stwa mi\u0119dzy dwoma wektorami, tradycyjnie wykorzystywa\u0142a implementacje skalarne - czyli w oparciu o dzia\u0142ania matematyczne, kt\u00f3re s\u0105 wykonywane na pojedynczych liczbach, takie jak dodawanie, odejmowanie, mno\u017cenie i dzielenie. Ju\u017c pewnie widzicie gdzie to wszystko prowadzi - adopcja Vector API umo\u017cliwi\u0142a wykorzystanie operacji SIMD, \u015bwietnie nadaj\u0105cych si\u0119 do dzia\u0142a\u0144 na wektorach. Do tej pory kompilator C2 ju\u017c wprawdzie samodzielnie pr\u00f3bowa\u0142 optymalizowa\u0107 poszczeg\u00f3lne fragmenty kodu, ale dopiero teraz programista mo\u017ce sam wskaza\u0107 miejsca do optymalizacji. Efektem jest znaczna poprawa wydajno\u015bci, odnotowana w testach por\u00f3wnawczych wyszukiwania wektorowego. Nazwa Vector API zobowi\u0105zuje.<\/p>\n","innerContent":["\n<p>Jak opisano w publikacji <a href=\"https:\/\/www.elastic.co\/blog\/accelerating-vector-search-simd-instructions\">Accelerating vector search with SIMD instructions<\/a>, opublikowanej na blogu Elastica, Lucene osi\u0105gn\u0119\u0142a w\u0142a\u015bnie znacz\u0105cy post\u0119p w zakresie wydajno\u015bci Vector API. Operacja wyszukiwania wektorowego, kluczowa dla znajdowania podobie\u0144stwa mi\u0119dzy dwoma wektorami, tradycyjnie wykorzystywa\u0142a implementacje skalarne - czyli w oparciu o dzia\u0142ania matematyczne, kt\u00f3re s\u0105 wykonywane na pojedynczych liczbach, takie jak dodawanie, odejmowanie, mno\u017cenie i dzielenie. Ju\u017c pewnie widzicie gdzie to wszystko prowadzi - adopcja Vector API umo\u017cliwi\u0142a wykorzystanie operacji SIMD, \u015bwietnie nadaj\u0105cych si\u0119 do dzia\u0142a\u0144 na wektorach. Do tej pory kompilator C2 ju\u017c wprawdzie samodzielnie pr\u00f3bowa\u0142 optymalizowa\u0107 poszczeg\u00f3lne fragmenty kodu, ale dopiero teraz programista mo\u017ce sam wskaza\u0107 miejsca do optymalizacji. Efektem jest znaczna poprawa wydajno\u015bci, odnotowana w testach por\u00f3wnawczych wyszukiwania wektorowego. Nazwa Vector API zobowi\u0105zuje.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Przyj\u0119cie Vector API przez Lucene, pomimo jego inkubacyjnego statusu, oznacza kompromis mi\u0119dzy wykorzystaniem potencjalnych korzy\u015bci z \u015bwie\u017cutkiego API, a kosztami utrzymania zale\u017cno\u015bci na nieostatecznym projekcie, kt\u00f3ry mo\u017ce jeszcze ulec zmianie. Mimo to, Vector API przynosi na tyle dobre efekty, \u017ce zdecydowano si\u0119 na utrzymywanie dw\u00f3ch wersji projektu - jednej opartej o star\u0105 implementacj\u0119 i drug\u0105 wspart\u0105 o Vector API. Zmiany te zostan\u0105 uwzgl\u0119dnione ju\u017c w Elasticsearch 8.9.0, a tempo to jeszcze bardziej podkre\u015bla jak bardzo zale\u017cy tw\u00f3rcom na ich wprowadzeniu. Elastic te\u017c jest teraz chyba pierwszym znanym projektem, kt\u00f3ry zdecydowa\u0142 si\u0119 na u\u017cycie inkubowanego API w swojej wersji produkcyjnej.<\/p>\n","innerContent":["\n<p>Przyj\u0119cie Vector API przez Lucene, pomimo jego inkubacyjnego statusu, oznacza kompromis mi\u0119dzy wykorzystaniem potencjalnych korzy\u015bci z \u015bwie\u017cutkiego API, a kosztami utrzymania zale\u017cno\u015bci na nieostatecznym projekcie, kt\u00f3ry mo\u017ce jeszcze ulec zmianie. Mimo to, Vector API przynosi na tyle dobre efekty, \u017ce zdecydowano si\u0119 na utrzymywanie dw\u00f3ch wersji projektu - jednej opartej o star\u0105 implementacj\u0119 i drug\u0105 wspart\u0105 o Vector API. Zmiany te zostan\u0105 uwzgl\u0119dnione ju\u017c w Elasticsearch 8.9.0, a tempo to jeszcze bardziej podkre\u015bla jak bardzo zale\u017cy tw\u00f3rcom na ich wprowadzeniu. Elastic te\u017c jest teraz chyba pierwszym znanym projektem, kt\u00f3ry zdecydowa\u0142 si\u0119 na u\u017cycie inkubowanego API w swojej wersji produkcyjnej.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">2. Jak wygl\u0105da rozwini\u0119cie Streams API zaproponowane przez tw\u00f3rc\u0119 Akki?<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">2. Jak wygl\u0105da rozwini\u0119cie Streams API zaproponowane przez tw\u00f3rc\u0119 Akki?<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Co si\u0119 stanie kiedy by\u0142y Tech Lead Akki, Viktor Klang, zaproponuje zmiany w Stream API? Wygl\u0105da na to, \u017ce dostajemy bardzo przemy\u015blan\u0105 propozycje kierunku, w kt\u00f3rym chyba najlepiej zaadoptowana w ostatniej dekadzie nowo\u015b\u0107 w j\u0119zyku mo\u017ce by\u0107 rozwijana.<\/p>\n","innerContent":["\n<p>Co si\u0119 stanie kiedy by\u0142y Tech Lead Akki, Viktor Klang, zaproponuje zmiany w Stream API? Wygl\u0105da na to, \u017ce dostajemy bardzo przemy\u015blan\u0105 propozycje kierunku, w kt\u00f3rym chyba najlepiej zaadoptowana w ostatniej dekadzie nowo\u015b\u0107 w j\u0119zyku mo\u017ce by\u0107 rozwijana.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Chocia\u017c istniej\u0105cy interfejs Stream API oferuje ju\u017c bogaty zestaw operacji procesuj\u0105cych (jak <code>.map<\/code>, <code>.filter<\/code> ), istnia\u0142a potrzeba rozszerzenia go i takie jak <code>fixedWindow(2)<\/code> czy <code>scan((sum, next) -> sum + next)<\/code>. Propozycja Viktora wynika z powtarzaj\u0105cych si\u0119 pr\u00f3\u015bb o dodanie takich dodatkowych operacji do Stream API w Javie 8, kt\u00f3rych nie mo\u017cna by\u0142o spe\u0142ni\u0107, poniewa\u017c ich u\u017cycie by\u0142o zbyt w\u0105skie, aby umie\u015bci\u0107 je w podstawowym Stream API. Na ten moment nie istnieje jednak opcja, \u017ceby kto\u015b samodzielnie stworzy\u0142 sobie w\u0142asn\u0105 operacje procesuj\u0105c\u0105, jak to ma miejsce w przypadku interfejsu <code>Stream::collect<\/code>, w zwi\u0105zku z czym czasem okazuje si\u0119, \u017ce osi\u0105gni\u0119cie niekt\u00f3rych efekt\u00f3w jest zaskakuj\u0105co trudne.. <\/p>\n","innerContent":["\n<p>Chocia\u017c istniej\u0105cy interfejs Stream API oferuje ju\u017c bogaty zestaw operacji procesuj\u0105cych (jak <code>.map<\/code>, <code>.filter<\/code> ), istnia\u0142a potrzeba rozszerzenia go i takie jak <code>fixedWindow(2)<\/code> czy <code>scan((sum, next) -> sum + next)<\/code>. Propozycja Viktora wynika z powtarzaj\u0105cych si\u0119 pr\u00f3\u015bb o dodanie takich dodatkowych operacji do Stream API w Javie 8, kt\u00f3rych nie mo\u017cna by\u0142o spe\u0142ni\u0107, poniewa\u017c ich u\u017cycie by\u0142o zbyt w\u0105skie, aby umie\u015bci\u0107 je w podstawowym Stream API. Na ten moment nie istnieje jednak opcja, \u017ceby kto\u015b samodzielnie stworzy\u0142 sobie w\u0142asn\u0105 operacje procesuj\u0105c\u0105, jak to ma miejsce w przypadku interfejsu <code>Stream::collect<\/code>, w zwi\u0105zku z czym czasem okazuje si\u0119, \u017ce osi\u0105gni\u0119cie niekt\u00f3rych efekt\u00f3w jest zaskakuj\u0105co trudne.. <\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16354,"width":375,"height":375,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image-5.png\" alt=\"\" class=\"wp-image-16354\" width=\"375\" height=\"375\"\/><figcaption class=\"wp-element-caption\">Dla kolegi pytam.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image-5.png\" alt=\"\" class=\"wp-image-16354\" width=\"375\" height=\"375\"\/><figcaption class=\"wp-element-caption\">Dla kolegi pytam.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Nowy interfejs <code>Stream::gather<\/code> s\u0142u\u017cy\u0142by do tworzenia w\u0142asnych operacja po\u015brednia, zdolna do obs\u0142ugi wielu ich rodzaju. Viktor przeprowadzi\u0142 bowiem w swoim dokumencie <a href=\"https:\/\/cr.openjdk.org\/~vklang\/Gatherers.html\">Gathering the streams<\/a> wnikliw\u0105 klasyfikacje r\u00f3\u017cnego rodzaju przypadk\u00f3w u\u017cycia nowego API, opisuj\u0105cych r\u00f3\u017cne rodzaje operacji strumieniowych, takich jak operacje po\u015brednie, operacje przyrostowe, operacje stanowe, bezstanowe... ca\u0142o\u015b\u0107 naprawd\u0119 dobrze opisuje wspomniany ju\u017c <a href=\"https:\/\/cr.openjdk.org\/~vklang\/Gatherers.html\">oryginalny dokument<\/a>. Gatherer, bo tak nazwany zosta\u0142 nowy interfejs, w swojej budowie bardzo przypomina dobrze znanego Collectora, na kt\u00f3rym zreszt\u0105 zosta\u0142 oparty. <\/p>\n","innerContent":["\n<p>Nowy interfejs <code>Stream::gather<\/code> s\u0142u\u017cy\u0142by do tworzenia w\u0142asnych operacja po\u015brednia, zdolna do obs\u0142ugi wielu ich rodzaju. Viktor przeprowadzi\u0142 bowiem w swoim dokumencie <a href=\"https:\/\/cr.openjdk.org\/~vklang\/Gatherers.html\">Gathering the streams<\/a> wnikliw\u0105 klasyfikacje r\u00f3\u017cnego rodzaju przypadk\u00f3w u\u017cycia nowego API, opisuj\u0105cych r\u00f3\u017cne rodzaje operacji strumieniowych, takich jak operacje po\u015brednie, operacje przyrostowe, operacje stanowe, bezstanowe... ca\u0142o\u015b\u0107 naprawd\u0119 dobrze opisuje wspomniany ju\u017c <a href=\"https:\/\/cr.openjdk.org\/~vklang\/Gatherers.html\">oryginalny dokument<\/a>. Gatherer, bo tak nazwany zosta\u0142 nowy interfejs, w swojej budowie bardzo przypomina dobrze znanego Collectora, na kt\u00f3rym zreszt\u0105 zosta\u0142 oparty. <\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>\/** @param &lt;T&gt; the element type\n *  @param &lt;A&gt; the (mutable) intermediate accumulation type\n *  @param &lt;R&gt; the (probably immutable) final accumulation type\n *\/\ninterface Gatherer&lt;T,A,R&gt; {\n    Supplier&lt;A&gt; supplier();\n    BiConsumer&lt;A, T&gt; accumulator();\n    BinaryOperator&lt;A&gt; combiner();\n    Function&lt;A, R&gt; finisher();\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>\/** @param &lt;T&gt; the element type\n *  @param &lt;A&gt; the (mutable) intermediate accumulation type\n *  @param &lt;R&gt; the (probably immutable) final accumulation type\n *\/\ninterface Gatherer&lt;T,A,R&gt; {\n    Supplier&lt;A&gt; supplier();\n    BiConsumer&lt;A, T&gt; accumulator();\n    BinaryOperator&lt;A&gt; combiner();\n    Function&lt;A, R&gt; finisher();\n}\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Gatherer zosta\u0142 zaprojektowany, aby zapewni\u0107 mo\u017cliwo\u015b\u0107 kompozycji i reu\u017cywalno\u015bci poszczeg\u00f3lnych stworzonych z jego pomoc\u0105 komponent\u00f3w. Jako przyk\u0142ad mo\u017ce pos\u0142u\u017cy\u0107 implementacja znanego <code>map<\/code> na wsp\u00f3lnej abstrakcji:<\/p>\n","innerContent":["\n<p>Gatherer zosta\u0142 zaprojektowany, aby zapewni\u0107 mo\u017cliwo\u015b\u0107 kompozycji i reu\u017cywalno\u015bci poszczeg\u00f3lnych stworzonych z jego pomoc\u0105 komponent\u00f3w. Jako przyk\u0142ad mo\u017ce pos\u0142u\u017cy\u0107 implementacja znanego <code>map<\/code> na wsp\u00f3lnej abstrakcji:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>public final static &lt;T,R&gt; Gatherer&lt;T, ?, R&gt; map(Function&lt;? super T, ? extends R&gt; mapper) {\n    return Gatherer.of(\n        () -&gt; (Void)null,\n        (nothing, element, downstream) -&gt;\n            downstream.flush(mapper.apply(element)),\n        (l,r) -&gt; l,\n        (nothing, downstream) -&gt; {}\n    );\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>public final static &lt;T,R&gt; Gatherer&lt;T, ?, R&gt; map(Function&lt;? super T, ? extends R&gt; mapper) {\n    return Gatherer.of(\n        () -&gt; (Void)null,\n        (nothing, element, downstream) -&gt;\n            downstream.flush(mapper.apply(element)),\n        (l,r) -&gt; l,\n        (nothing, downstream) -&gt; {}\n    );\n}\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Polecam zapozna\u0107 si\u0119 nie <a href=\"https:\/\/cr.openjdk.org\/~vklang\/Gatherers.html\">tylko z proposalem<\/a>, ale r\u00f3wnie\u017c <a href=\"https:\/\/mail.openjdk.org\/pipermail\/core-libs-dev\/2023-June\/108655.html\">komentarzami, kt\u00f3re wywo\u0142a\u0142 w w\u0105tku mailowym<\/a>. Og\u00f3lnie reakcje s\u0105 do\u015b\u0107 entuzjastyczne, cho\u0107 pojawiaj\u0105 si\u0119 te\u017c zarzuty m\u00f3wi\u0105ce o pewnym skomplikowaniu propozycji. Wygl\u0105da jednak na to, \u017ce kt\u00f3ra\u015b z przysz\u0142ych iteracji ma szanse trafi\u0107 do JDK, co powinno pozytywnie wp\u0142yn\u0105\u0107 na mo\u017cliwo\u015b\u0107 rozszerzania Stream API.<\/p>\n","innerContent":["\n<p>Polecam zapozna\u0107 si\u0119 nie <a href=\"https:\/\/cr.openjdk.org\/~vklang\/Gatherers.html\">tylko z proposalem<\/a>, ale r\u00f3wnie\u017c <a href=\"https:\/\/mail.openjdk.org\/pipermail\/core-libs-dev\/2023-June\/108655.html\">komentarzami, kt\u00f3re wywo\u0142a\u0142 w w\u0105tku mailowym<\/a>. Og\u00f3lnie reakcje s\u0105 do\u015b\u0107 entuzjastyczne, cho\u0107 pojawiaj\u0105 si\u0119 te\u017c zarzuty m\u00f3wi\u0105ce o pewnym skomplikowaniu propozycji. Wygl\u0105da jednak na to, \u017ce kt\u00f3ra\u015b z przysz\u0142ych iteracji ma szanse trafi\u0107 do JDK, co powinno pozytywnie wp\u0142yn\u0105\u0107 na mo\u017cliwo\u015b\u0107 rozszerzania Stream API.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">3. Google chce zaproponowa\u0107 nowy spos\u00f3b dystrybucji aplikacji Java<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">3. Google chce zaproponowa\u0107 nowy spos\u00f3b dystrybucji aplikacji Java<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Ostatnimi tygodniami spo\u0142eczno\u015b\u0107 Redditowa pr\u00f3bowa\u0142a dokona\u0107 buntu przed wprowadzeniem op\u0142at za u\u017cycie API, przez co wiele spo\u0142eczno\u015bci pozostawa\u0142o na d\u0142ugi czas zamkni\u0119tymi. Zabrzmi nieco coehlhowsko, ale w takich momentach (kiedy go nie ma) u\u015bwiadomi\u0107 sobie mo\u017cna, jak przydatnym narz\u0119dziem jest Reddit. O ile bowiem \u015bledzenie nowo\u015bci w miar\u0119 na bie\u017c\u0105co bywa czasoch\u0142onne, ale jest raczej do\u015b\u0107 proste, o tyle spo\u0142eczno\u015b\u0107 portalu przynosi niekt\u00f3rym tematom znacznie szerszy kontekst, a dodatkowo potrafi wyci\u0105gn\u0105\u0107 na wierzch tematy, kt\u00f3re w momencie publikacji przesz\u0142y pod radarem (przynajmniej pod moim). Tak wygl\u0105da sprawa z Hermetic Java, nowym podej\u015bciem do dystrybucji aplikacji zaprezentowanym przez <a href=\"https:\/\/twitter.com\/jiangli_zhou\">Jiangli Zhou<\/a> z Google jeszcze w lutym. Dzi\u0119ki Redditowi dosta\u0142em jednak od losu drug\u0105 szans\u0119 i mo\u017cecie zapozna\u0107 si\u0119 z t\u0105 naprawd\u0119 interesuj\u0105c\u0105 koncepcj\u0105.<\/p>\n","innerContent":["\n<p>Ostatnimi tygodniami spo\u0142eczno\u015b\u0107 Redditowa pr\u00f3bowa\u0142a dokona\u0107 buntu przed wprowadzeniem op\u0142at za u\u017cycie API, przez co wiele spo\u0142eczno\u015bci pozostawa\u0142o na d\u0142ugi czas zamkni\u0119tymi. Zabrzmi nieco coehlhowsko, ale w takich momentach (kiedy go nie ma) u\u015bwiadomi\u0107 sobie mo\u017cna, jak przydatnym narz\u0119dziem jest Reddit. O ile bowiem \u015bledzenie nowo\u015bci w miar\u0119 na bie\u017c\u0105co bywa czasoch\u0142onne, ale jest raczej do\u015b\u0107 proste, o tyle spo\u0142eczno\u015b\u0107 portalu przynosi niekt\u00f3rym tematom znacznie szerszy kontekst, a dodatkowo potrafi wyci\u0105gn\u0105\u0107 na wierzch tematy, kt\u00f3re w momencie publikacji przesz\u0142y pod radarem (przynajmniej pod moim). Tak wygl\u0105da sprawa z Hermetic Java, nowym podej\u015bciem do dystrybucji aplikacji zaprezentowanym przez <a href=\"https:\/\/twitter.com\/jiangli_zhou\">Jiangli Zhou<\/a> z Google jeszcze w lutym. Dzi\u0119ki Redditowi dosta\u0142em jednak od losu drug\u0105 szans\u0119 i mo\u017cecie zapozna\u0107 si\u0119 z t\u0105 naprawd\u0119 interesuj\u0105c\u0105 koncepcj\u0105.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Na <a href=\"https:\/\/cr.openjdk.org\/~jiangli\/hermetic_java.pdf\">podstawie prezentacji z proposalem<\/a> i <a href=\"https:\/\/mail.openjdk.org\/pipermail\/leyden-dev\/2023-February\/000106.html\">w\u0105tku mailowego<\/a> wynika, \u017ce Hermetic Java jest rozwi\u0105zaniem s\u0142u\u017c\u0105cym do tworzenia samodzielnych i wysokowydajnych obraz\u00f3w wykonywalnych Java. Jego g\u0142\u00f3wnym celem jest rozwi\u0105zanie problem\u00f3w zwi\u0105zanych z pakowaniem i wdra\u017caniem aplikacji Java, a zw\u0142aszcza ich p\u00f3\u017aniejszej dystrybucji.<\/p>\n","innerContent":["\n<p>Na <a href=\"https:\/\/cr.openjdk.org\/~jiangli\/hermetic_java.pdf\">podstawie prezentacji z proposalem<\/a> i <a href=\"https:\/\/mail.openjdk.org\/pipermail\/leyden-dev\/2023-February\/000106.html\">w\u0105tku mailowego<\/a> wynika, \u017ce Hermetic Java jest rozwi\u0105zaniem s\u0142u\u017c\u0105cym do tworzenia samodzielnych i wysokowydajnych obraz\u00f3w wykonywalnych Java. Jego g\u0142\u00f3wnym celem jest rozwi\u0105zanie problem\u00f3w zwi\u0105zanych z pakowaniem i wdra\u017caniem aplikacji Java, a zw\u0142aszcza ich p\u00f3\u017aniejszej dystrybucji.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"id":16341,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image-1-1024x584.png\" alt=\"\" class=\"wp-image-16341\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image-1-1024x584.png\" alt=\"\" class=\"wp-image-16341\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Hermetic Java to bowiem narz\u0119dzie do tworzenia samodzielnych plik\u00f3w wykonywalnych aplikacji JVM-owych. Wprowadza koncept obrazu wykonywalnego, kt\u00f3ry \u0142\u0105czy instrukcje uruchamiaj\u0105ce, JDK runtime i JAR. Obraz sam ten sk\u0142ada si\u0119 z sekcji ELF (b\u0119d\u0105cego Java Launcherem), sekcji JDK dla modu\u0142\u00f3w i archiwum Class Data Sharing (CDS) oraz sekcji JAR dla aplikacji i zasob\u00f3w. Dodatkowo umo\u017cliwia dynamiczne \u0142adowanie zewn\u0119trznych klas w razie potrzeby, ale te\u017c wspiera\u0107 kod ahead-of-time. Propozycja ma inkorporowa\u0107 ostatnie gor\u0105ce nowo\u015bci w \u015bwiecie JVM, inspiruj\u0105c si\u0119 takimi inicjatywami jak GraalVM, Project Leyden, AWS Lambda SnapStart i Checkpoint-Restore in Userspace (CRaC).<\/p>\n","innerContent":["\n<p>Hermetic Java to bowiem narz\u0119dzie do tworzenia samodzielnych plik\u00f3w wykonywalnych aplikacji JVM-owych. Wprowadza koncept obrazu wykonywalnego, kt\u00f3ry \u0142\u0105czy instrukcje uruchamiaj\u0105ce, JDK runtime i JAR. Obraz sam ten sk\u0142ada si\u0119 z sekcji ELF (b\u0119d\u0105cego Java Launcherem), sekcji JDK dla modu\u0142\u00f3w i archiwum Class Data Sharing (CDS) oraz sekcji JAR dla aplikacji i zasob\u00f3w. Dodatkowo umo\u017cliwia dynamiczne \u0142adowanie zewn\u0119trznych klas w razie potrzeby, ale te\u017c wspiera\u0107 kod ahead-of-time. Propozycja ma inkorporowa\u0107 ostatnie gor\u0105ce nowo\u015bci w \u015bwiecie JVM, inspiruj\u0105c si\u0119 takimi inicjatywami jak GraalVM, Project Leyden, AWS Lambda SnapStart i Checkpoint-Restore in Userspace (CRaC).<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16346,"width":680,"height":206,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image-3.png\" alt=\"\" class=\"wp-image-16346\" width=\"680\" height=\"206\"\/><figcaption class=\"wp-element-caption\">To tak jakby kto\u015b chcia\u0142 zagra\u0107 w JVM Bingo<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image-3.png\" alt=\"\" class=\"wp-image-16346\" width=\"680\" height=\"206\"\/><figcaption class=\"wp-element-caption\">To tak jakby kto\u015b chcia\u0142 zagra\u0107 w JVM Bingo<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Patrz\u0105c na zalety, Hermetic Java eliminuje potrzeb\u0119 posiadania zewn\u0119trznych plik\u00f3w \u015brodowiska uruchomieniowego JDK i nie wymaga okre\u015blania konkretnej wersji JDK do wdro\u017cenia. Dzi\u0119ki temu obraz ten jest kompatybilny z r\u00f3\u017cnymi \u015brodowiskami i upraszcza wdra\u017canie aplikacji. Tworzeniem obraz\u00f3w Hermetic Java zajmowa\u0107 si\u0119 ma <code>singlejar<\/code>, czyli narz\u0119dzie ju\u017c w tej chwili u\u017cywane w ramach build toola Bazel. Format obrazu jest niezale\u017cny od platformy i obs\u0142uguje zar\u00f3wno linkowanie dynamiczne, jak i statyczne.<\/p>\n","innerContent":["\n<p>Patrz\u0105c na zalety, Hermetic Java eliminuje potrzeb\u0119 posiadania zewn\u0119trznych plik\u00f3w \u015brodowiska uruchomieniowego JDK i nie wymaga okre\u015blania konkretnej wersji JDK do wdro\u017cenia. Dzi\u0119ki temu obraz ten jest kompatybilny z r\u00f3\u017cnymi \u015brodowiskami i upraszcza wdra\u017canie aplikacji. Tworzeniem obraz\u00f3w Hermetic Java zajmowa\u0107 si\u0119 ma <code>singlejar<\/code>, czyli narz\u0119dzie ju\u017c w tej chwili u\u017cywane w ramach build toola Bazel. Format obrazu jest niezale\u017cny od platformy i obs\u0142uguje zar\u00f3wno linkowanie dynamiczne, jak i statyczne.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Na powierzchni Hermetic Java i GraalVM mog\u0105 wygl\u0105da\u0107 podobnie, ale nie dajcie si\u0119 zwie\u015b\u0107 pozorom. Hermetic Java i GraalVM to dwa r\u00f3\u017cne podej\u015bcia do kompilowania i pakowania aplikacji Java do wdro\u017cenia. GraalVM wykorzystuje narz\u0119dzie <code>native-image<\/code> do kompilowania aplikacji AoT i opiera si\u0119 na SubstratVM, alternatywnej maszynie wirtualnej. Dodatkowo, GraalVM bazuje na za\u0142o\u017ceniu \"zamkni\u0119tego \u015bwiata\" (braku mo\u017cliwo\u015bci dostarczenia dodatkowych klas z ClassPath), co pozwala mu na zaawansowane optymalizacje. Z drugiej strony, Hermetic Java koncentruje si\u0119 na tworzeniu samodzielnego statycznego obrazu, kt\u00f3ry sam w sobie posiada wszystkie niezb\u0119dne elementy do uruchomienia aplikacji. Takie podej\u015bcie eliminuje potrzeb\u0119 stosowania zewn\u0119trznego \u015brodowiska uruchomieniowego, eliminuje problemy zwi\u0105zane z wersj\u0105 JDK i mo\u017ce dzia\u0142a\u0107 na r\u00f3\u017cnych platformach. W przeciwie\u0144stwie do GraalVM, Hermetic Java zachowuje kompatybilno\u015b\u0107 z OpenJDK i Hotspot VM, umo\u017cliwiaj\u0105c integracj\u0119 z istniej\u0105cymi i przysz\u0142ymi funkcjami tych \u015brodowisk. Bardziej ni\u017c do obraz\u00f3w GraalVM por\u00f3wna\u0142bym je wi\u0119c do mixu UberJara z obrazem Dockerowym.<\/p>\n","innerContent":["\n<p>Na powierzchni Hermetic Java i GraalVM mog\u0105 wygl\u0105da\u0107 podobnie, ale nie dajcie si\u0119 zwie\u015b\u0107 pozorom. Hermetic Java i GraalVM to dwa r\u00f3\u017cne podej\u015bcia do kompilowania i pakowania aplikacji Java do wdro\u017cenia. GraalVM wykorzystuje narz\u0119dzie <code>native-image<\/code> do kompilowania aplikacji AoT i opiera si\u0119 na SubstratVM, alternatywnej maszynie wirtualnej. Dodatkowo, GraalVM bazuje na za\u0142o\u017ceniu \"zamkni\u0119tego \u015bwiata\" (braku mo\u017cliwo\u015bci dostarczenia dodatkowych klas z ClassPath), co pozwala mu na zaawansowane optymalizacje. Z drugiej strony, Hermetic Java koncentruje si\u0119 na tworzeniu samodzielnego statycznego obrazu, kt\u00f3ry sam w sobie posiada wszystkie niezb\u0119dne elementy do uruchomienia aplikacji. Takie podej\u015bcie eliminuje potrzeb\u0119 stosowania zewn\u0119trznego \u015brodowiska uruchomieniowego, eliminuje problemy zwi\u0105zane z wersj\u0105 JDK i mo\u017ce dzia\u0142a\u0107 na r\u00f3\u017cnych platformach. W przeciwie\u0144stwie do GraalVM, Hermetic Java zachowuje kompatybilno\u015b\u0107 z OpenJDK i Hotspot VM, umo\u017cliwiaj\u0105c integracj\u0119 z istniej\u0105cymi i przysz\u0142ymi funkcjami tych \u015brodowisk. Bardziej ni\u017c do obraz\u00f3w GraalVM por\u00f3wna\u0142bym je wi\u0119c do mixu UberJara z obrazem Dockerowym.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Czekam w zwi\u0105zku z tym na obiecanego JEP-a - zaprezentowane rozwi\u0105zanie mo\u017ce by\u0107 interesuj\u0105cym rozwi\u0105zaniem dla projekt\u00f3w, kt\u00f3re nie s\u0105 w stanie (lub nie maj\u0105 potrzeby) przej\u015b\u0107 na GraalVM.<\/p>\n","innerContent":["\n<p>Czekam w zwi\u0105zku z tym na obiecanego JEP-a - zaprezentowane rozwi\u0105zanie mo\u017ce by\u0107 interesuj\u0105cym rozwi\u0105zaniem dla projekt\u00f3w, kt\u00f3re nie s\u0105 w stanie (lub nie maj\u0105 potrzeby) przej\u015b\u0107 na GraalVM.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16349,"width":768,"height":316,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image-4-1024x421.png\" alt=\"\" class=\"wp-image-16349\" width=\"768\" height=\"316\"\/><figcaption class=\"wp-element-caption\">No i oczywi\u015bcie na pierwsze demo - jestem w stanie si\u0119 za\u0142o\u017cy\u0107, \u017ce jedn\u0105 z pierwszych tak zapakowanych rzeczy b\u0119dzie Minecraft. To zawsze jest Minecraft.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/07\/image-4-1024x421.png\" alt=\"\" class=\"wp-image-16349\" width=\"768\" height=\"316\"\/><figcaption class=\"wp-element-caption\">No i oczywi\u015bcie na pierwsze demo - jestem w stanie si\u0119 za\u0142o\u017cy\u0107, \u017ce jedn\u0105 z pierwszych tak zapakowanych rzeczy b\u0119dzie Minecraft. To zawsze jest Minecraft.<\/figcaption><\/figure>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/16337","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/comments?post=16337"}],"version-history":[{"count":12,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/16337\/revisions"}],"predecessor-version":[{"id":16365,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/16337\/revisions\/16365"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/16361"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=16337"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=16337"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=16337"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}