{"id":16538,"date":"2023-08-01T16:07:56","date_gmt":"2023-08-01T14:07:56","guid":{"rendered":"https:\/\/vived.io\/?p=16538"},"modified":"2023-08-01T16:08:00","modified_gmt":"2023-08-01T14:08:00","slug":"nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-i-stabilizacja-ffm-api-jvm-weekly-vol-144","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-i-stabilizacja-ffm-api-jvm-weekly-vol-144\/","title":{"rendered":"Nowe JEP-y: Computed Constants, nowe podej\u015bcie do Ahead-of-Time i stabilizacja FFM API &#8211; JVM Weekly vol. 144"},"content":{"rendered":"\n<h2 id=\"1-nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-stabilizacja-i-ffm-api\" data-num=1>1. Nowe JEP-y: Computed Constants, nowe podej\u015bcie do Ahead-of-Time &amp; stabilizacja i FFM API<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/8310626\">JEP draft: Foreign Function &amp; Memory API<\/a><\/h3>\n\n\n\n<p>Zaczniemy od czego\u015b do\u015b\u0107 oczywistego, ale w dalszym ci\u0105gu interesuj\u0105cego.<\/p>\n\n\n\n<p>JDK 21 przynosi stabilizacje wielu d\u0142ugo oczekiwanych API, ale z jednym do\u015b\u0107 istotnym wyj\u0105tkiem &#8211; Foreign Function &amp; Memory API. Ta kluczowa funkcjonalnos\u0107 Panamy uka\u017ce si\u0119 wy\u0142\u0105cznie jako Preview, ju\u017c trzecie. Wszystko wskazuje jednak, \u017ce r\u00f3wnie\u017c ostatniego &#8211; w ostatnich dniach opublikowany i zaktualizowany zosta\u0142 JEP Draft zawieraj\u0105cy ju\u017c specyfikacje finalnej wersji tego API. Wszystko wskazuje wi\u0119c na to, \u017ce kt\u00f3ra\u015b z najbli\u017cszych wersji Javy (mo\u017ce ju\u017c JDK 22) pozwoli nam na wygodne Sam JEP za\u015b skupia si\u0119 na finalizacji interfejsu API FFM poprzez wprowadzenie serii ulepsze\u0144, takich jak wprowadzenie atrybutu manifestu <code>Enable-Native-Access<\/code>, umo\u017cliwiaj\u0105cego plikom JAR dost\u0119p do wybranych metod bez wymagania konkretnych flag. Dodatkowe ulepszenia obejmuj\u0105 tworzenie deskryptor\u00f3w funkcji C, bardziej zaawansowane wsparcie dla natywnych tablic o zmiennym rozmiarze oraz wsparcie dla wielu zestaw\u00f3w znak\u00f3w w natywnych stringach.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/8312611\">JEP draft: Computed Constants<\/a><\/h3>\n\n\n\n<p>Programi\u015bci Java staj\u0105 przed dylematem mi\u0119dzy niezmienno\u015bci\u0105 a elastyczno\u015bci\u0105 inicjalizacji, szczeg\u00f3lnie w zarz\u0105dzaniu polami <code>final<\/code>. Java wymaga bowiem, aby ta by\u0142a inicjalizowana w konstruktorze:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class DeepThought {\n    final int theAnswer;\n\n    public DeepThought() {\n        value = ultimateQuestion();     \n    }\n\n    private int ultimateQuestion() {\n        \/\/ Expensive computation here\n        return 42;\n    }\n<\/code><\/pre>\n\n\n\n<p>Oczywi\u015bcie istniej\u0105 strategie takie jak <strong>class-holder idiom<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class DeepThought {\n    private static class AnswerHolder {\n        static final int theAnswer = ultimateQuestion();\n\n        private static int ultimateQuestion() {\n            \/\/ Expensive computation here\n            return 42;\n        }\n    }\n\n    public DeepThought() {\n    }\n\n    public int getTheAnswer() {\n        return AnswerHolder.theAnswer;\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>czy (w nieco bardziej skomplikowanych przypadkach) znany cho\u0107by z Effective Java, paskudny <strong>double-checked locking<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class DeepThought {\n    private static class AnswerHolder {\n        static final int theAnswer = ultimateQuestion();\n\n        private static int ultimateQuestion() {\n            \/\/ Expensive computation here, takes 7.5 million years\n            return 42;\n        }\n    }\n\n    public int getTheAnswer() {\n        return AnswerHolder.theAnswer;\n    }\n}\n\nclass LazySingleton {\n    private static volatile LazySingleton instance;\n    private final DeepThought deepThought;\n\n    private LazySingleton() {\n        deepThought = new DeepThought();\n    }\n\n    public static LazySingleton getInstance() {\n        if (instance == null) {\n            synchronized (LazySingleton.class) {\n                if (instance == null) {\n                    instance = new LazySingleton();\n                }\n            }\n        }\n        return instance;\n    }\n\n    public int getTheAnswer() {\n        return deepThought.getTheAnswer();\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>cho\u0107 u\u017cyteczne, maj\u0105 wady, takie jak dodatkowa z\u0142o\u017cono\u015b\u0107 po\u0142\u0105czona z utrat\u0105 mo\u017cliwo\u015bci \u0142atwej optymalizacji w czasie wykonywania. W przeciwie\u0144stwie do j\u0119zyk\u00f3w takich jak C# (z jego typem <code>Lazy&lt;T&gt;<\/code>):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class DeepThought {\n    private static readonly Lazy&lt;int&gt; theAnswer = new Lazy&lt;int&gt;(() =&gt; UltimateQuestion());\n\n    private static int UltimateQuestion() {\n        \/\/ Expensive computation here\n        return 42;\n    }\n    \n    static int getTheAnswer() {\n        return theAnswer.get();\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>czy Kotlin (kt\u00f3ry <code>lazy<\/code> dla &#8222;leniwej&#8221; inicjalizacji):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class DeepThought {\n    val theAnswer: Int by lazy { ultimateQuestion() }\n\n    private fun ultimateQuestion(): Int {\n        \/\/ Expensive computation here\n        return 42\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>\u015bcis\u0142e wymogi Javy dotycz\u0105ce inicjalizacji p\u00f3l oznaczonych jako <code>final<\/code> stwarzaj\u0105 wyzwania w odroczeniu inicjalizacji sta\u0142ych, zmuszaj\u0105c programist\u00f3w do obchodzenia ogranicze\u0144 j\u0119zyka .<\/p>\n\n\n\n<p><a href=\"https:\/\/openjdk.org\/jeps\/8312611\">JEP draft: Computed Constants<\/a> wprowadza koncept Computed Constants, maj\u0105cych na celu zniwelowanie tej luki poprzez dostarczenie funkcji podobnej do konstrukcji znalezionych w j\u0119zykach takich jak C# i Kotlin. Sta\u0142e Obliczeniowe (nawet zgrabne t\u0142umaczenie) s\u0105 niemutowalne i s\u0105 gwarantuj\u0105 inicjalizowane co najwy\u017cej raz, oferuj\u0105c korzy\u015bci p\u00f3l oznaczonych jako <code>final<\/code>, ale z wi\u0119ksz\u0105 elastyczno\u015bci\u0105 w czasie inicjalizacji.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class DeepThought {\n    private static final ComputedConstant&lt;Int&gt; theAnswer =\n            ComputedConstant.of(() -&gt; ultimateQuestion());\n\n    static int ultimateQuestion() {\n        \/\/ Expensive computation here\n        \/\/    (evaluation made before the first access)\n        return 42\n    }\n    \n    static int getTheAnswer() {\n        return theAnswer.get();\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>Jak widzicie, rozwi\u0105zanie jest ca\u0142kiem eleganckie i \u0142adnie wpasowuje si\u0119 w ostatnie konwencje j\u0119zyka, takie jak Scoped Values. Wspominany ju\u017c oryginalny JEP zawiera te\u017c przyk\u0142ad dla kolekcji.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<div class=\"embed-responsive embed-responsive-16by9\"><iframe loading=\"lazy\" title=\"Epic Rap Battle: Nerd vs. Geek\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/2Tvy_Pbe5NA?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<\/div><figcaption class=\"wp-element-caption\">A teraz test Nerda &#8211; ile w powy\u017cszych przyk\u0142adach trwa\u0142o &#8222;Expensive computation&#8221;? Podpowied\u017a w miniaturce tego posta \ud83d\ude04<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/8313278\">JEP draft: Ahead of Time Compilation for the Java Virtual Machine<\/a><\/h3>\n\n\n\n<p>A na koniec chyba moje ulubione mi\u0119siwo, wracamy bowiem do uwielbianego przeze mnie tematu szybszego startu JVM.<\/p>\n\n\n\n<p>Aplikacje i biblioteki Java s\u0105 obecnie wykonywane w modelu trzystopniowym, najpierw w Interpreterze, nast\u0119pnie jako skompilowany kod C1, a potem jako skompilowany kod C2. Proces ten jest bardzo dynamiczny, obejmuj\u0105cy wiele iteracji cykli optymalizacji i deoptymalizacji w trakcie \u017cycia kodu. Dodatkowo oznacza to, \u017ce rozgrzewanie kodu (gdzie w runtime odbywa si\u0119 kompilacji wysoce zoptymalizowanej wersji) mo\u017ce zaj\u0105\u0107 du\u017co czasu.<\/p>\n\n\n\n<p>Dobrym przyk\u0142adem jest kompilator Graal, kt\u00f3ry (jak pewnie niewiele os\u00f3b ju\u017c pami\u0119ta) by\u0142 dost\u0119pnym zamiennikiem dla C2 przed Java 17, gdzie w spektakularny spos\u00f3b si\u0119 go pozbyto. Powody by\u0142y ca\u0142kiem logiczne: etap uruchamiania kompilatora negatywnie wp\u0142yn\u0105\u0142 na ca\u0142\u0105 aplikacj\u0119, poniewa\u017c sam Graal musia\u0142 zosta\u0107 skompilowany, zanim m\u00f3g\u0142 dzia\u0142a\u0107 z rozs\u0105dn\u0105 pr\u0119dko\u015bci\u0105, co zniwelowa\u0142o mo\u017cliwe zyski z wydajno\u015bci. Dodatkowo proces deoptymalizacji, kt\u00f3ry wyst\u0119puje, gdy skompilowany kod C2 napotyka b\u0142\u0119dn\u0105 hipotez\u0119, mo\u017ce by\u0107 kosztowny, poniewa\u017c wariant profiluj\u0105cy C1 musi zosta\u0107 ponownie skompilowany, tylko po to, by zosta\u0107 ponownie odrzucony, gdy C2 skompiluje t\u0119 sam\u0105 metod\u0119. Istniej\u0105ce alternatywy, jak wspomniany GraalVM i Native Image, operuj\u0105 za\u015b na tak zwanym &#8222;za\u0142o\u017ceniu zamkni\u0119tego \u015bwiata&#8221;, kt\u00f3re nie pozwala na dynamiczne doczytywanie kolejnych klas w runtime. Wymuszaj\u0105 wi\u0119c spore zmiany w stosunku do typowym wykonywaniem aplikacji Java przez JVM.<\/p>\n\n\n\n<p>Dobre rozwi\u0105zanie to posiadanie trwa\u0142ego wariantu metody skompilowanej Ahead-of-Time C1, dzi\u0119ki czemu mo\u017cna pomin\u0105\u0107 Interpreter i C1, tak \u017ce przy uruchamianiu wykonanie zaczyna si\u0119 od prekompilowanego kodu C1, a nast\u0119pnie natychmiast przechodzi do kompilacji C2. Proponowane w <a href=\"https:\/\/openjdk.org\/jeps\/8313278\">JEP draft: Ahead of Time Compilation for the Java Virtual Machine<\/a> rozwi\u0105zanie polega wi\u0119c na wzbogacenie JVM o zdolno\u015b\u0107 do wczytywania aplikacji i bibliotek Java skompilowanych do kodu natywnego przed uruchomieniem. Obejmuje to ca\u0142kowite pomini\u0119cie Interpretera, umo\u017cliwiaj\u0105c kompilacj\u0119 kodu Java, standardowych bibliotek i dowolnych komponent\u00f3w JVM Ahead-of-Time do natywnego kodu w trybach profilowania lub optymalizacji. Zmiana ta umo\u017cliwia natychmiastowe wykonywanie skompilowanego kodu, przechodzenie od razu do kompilacji C2 oraz zachowanie skompilowanych metod dla bardziej wydajnych proces\u00f3w deoptymalizacji.<\/p>\n\n\n\n<p>Brzmi troch\u0119 jak mix podej\u015bcia CRaC z projektem Leyden, prawda? Ten ostatni jest nawet wspominany w oryginalnym JEP-ie, a korzystaj\u0105c z okazji pozwol\u0119 sobie na ma\u0142y spoiler: Do tematu Leyden wr\u00f3cimy ju\u017c nied\u0142ugo, bo zaledwie wczoraj ukaza\u0142y si\u0119 nowe aktualizacje w temacie i id\u0119 si\u0119 musia\u0142 przez nie przebi\u0107 i przetrawi\u0107, bo to jednak nieco bardziej skomplikowany temat i nie chce Wam dostarczy\u0107 czego\u015b na szybko, niedopieczonego.<\/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\/08\/image-1024x768.png\" alt=\"\" class=\"wp-image-16540\" width=\"768\" height=\"576\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-1024x768.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-300x225.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-768x576.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-1536x1152.png 1536w, https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-2048x1536.png 2048w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><figcaption class=\"wp-element-caption\">W weekend pierwszy raz robi\u0142em steki z grilla, i by\u0142o to dla mnie na tyle stresuj\u0105ce do\u015bwiadczenie, \u017ce dalej trzymaj\u0105 si\u0119 mnie kulinarne nawi\u0105zania.<\/figcaption><\/figure><\/div>\n\n\n<h2 id=\"2-premiera-nowego-intellij-idea-z-ai-assistant\" data-num=2>2. Premiera nowego IntelliJ Idea z AI Assistant<\/h2>\n\n\n\n<p>Pojawi\u0142 si\u0119 nowy IntelliJ i oczywi\u015bcie, jak ka\u017cde narz\u0119dzie w 2023 musia\u0142 doczeka\u0107 si\u0119 wsparcia AI.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"663\" height=\"500\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/download.png\" alt=\"\" class=\"wp-image-16548\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/download.png 663w, https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/download-300x226.png 300w\" sizes=\"auto, (max-width: 663px) 100vw, 663px\" \/><figcaption class=\"wp-element-caption\"><em>It&#8217;s the circle of life; And it moves us all; Through despair and hope; Through faith and love<\/em>&#8230;<\/figcaption><\/figure><\/div>\n\n\n<p>Generatywna sztuczna inteligencja i tak zwane LLM (Large-Language Models) zosta\u0142y zintegrowane z IDE JetBrains, a celem nowego featura ma by\u0107 (oczywi\u015bcie) zwi\u0119kszenie efektywno\u015bci pracy programist\u00f3w. Obejmuje to czat umo\u017cliwiaj\u0105cy tworzenie zapyta\u0144 o kod, automatyczne generowanie dokumentacji, sugestie nazw i generowanie commit message. Funkcje AI s\u0105 dostarczane przez us\u0142ug\u0119 JetBrains AI, kt\u00f3re na ten moment opieraj\u0105 si\u0119 na OpenAI, ale w tw\u00f3rcy obiecali, \u017ce nale\u017cy si\u0119 spodziewa\u0107 wsparcia innych dostawc\u00f3w, a tak\u017ce lokalnych modeli. Niestety, ca\u0142o\u015b\u0107 dost\u0119pna jest tylko dla wybranych u\u017cytkownik\u00f3w. Wszystko powy\u017csze pisze w oparciu o release notes, poniewa\u017c czekam ci\u0105gle na dost\u0119p \ud83e\udd37\u200d\u2642\ufe0f<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/generate_method-1.gif\" alt=\"\" width=\"1069\" height=\"573\"\/><figcaption class=\"wp-element-caption\">Powy\u017cszy screen to cyfrowy odpowiednik lizania cukierka przez papierek.<\/figcaption><\/figure>\n\n\n\n<p>To nie koniec ulepsze\u0144 w IntelliJ IDEA 2023.2. Java doczeka\u0142a si\u0119 rozszerzonej inspekcji i pod\u015bwietlania kodu oraz lepsze wsparcie dla wprowadzonego w JDK 18 tagu <code>@snippet<\/code> w komentarzach Javadoc. Stringi SQL w Java i Kotlin otrzyma\u0142y lepsz\u0105 analiz\u0119 w celu wykrycia niebezpiecznych zapyta\u0144 i potencjalnych podatno\u015bci na ataki typu SQL injection.<\/p>\n\n\n\n<p>Nowa wersja wzmacnia r\u00f3wnie\u017c wsparcie dla Scala 3, wprowadzaj\u0105c usprawnienia takie jak lepsze wykorzystanie enum\u00f3w, dekompilator TASTy, wsparcie w edytorze dla <code>IArray<\/code> oraz lepsze wsparcie dla sk\u0142adni o mniejszej ilo\u015bci nawias\u00f3w. IDE posiada ulepszon\u0105 obs\u0142ug\u0119 katalog\u00f3w oraz usprawnia renderowanie ScalaDoc.<\/p>\n\n\n\n<p>Opr\u00f3cz Asystenta AI i innych wspomnianych funkcji, nadchodz\u0105ca wersja IntelliJ IDEA 2023.2 b\u0119dzie oznacza\u0107 wycofanie kilku wtyczek, takich jak Struts2, Play i Cloud Foundry &#8211; nie b\u0119d\u0105 one ju\u017c aktualizowane. Mnie jako\u015b \u0142ezka si\u0119 w oku zakr\u0119ci\u0142a je\u015bli chodzi o Play Framework, kt\u00f3ry kiedy\u015b uwa\u017cany by\u0142 za now\u0105 jako\u015b\u0107 w \u015bwiecie JVM, a teraz po oddaniu go spo\u0142eczno\u015bci przez Lightbend jest przestarza\u0142y i brakuje mu pe\u0142nej zgodno\u015bci z Java 17, aczkolwiek trzeba doceni\u0107 starania <a href=\"https:\/\/github.com\/mkurz\">Matthiasa Kurza<\/a>, kt\u00f3ry dba o jego utrzymanie <a href=\"https:\/\/opencollective.com\/playframework\">przy wsparciu Open Collective<\/a>. Co ciekawe, wersja ta zako\u0144czy r\u00f3wnie\u017c wsparcie dla Windows 7, wymagaj\u0105c aktualizacji do Windows 10 lub nowszego systemu operacyjnego. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/0JQi8hn.png\" alt=\"\"\/><figcaption class=\"wp-element-caption\">Zabawnie, Windows 8 nie zosta\u0142 nawet wspomniany, jakby ka\u017cdy chcia\u0142 zapomnie\u0107 o tej konkretnej wersji.<\/figcaption><\/figure><\/div>\n\n\n<h2 id=\"3-a-moze-widzimy-sie-na-kotlinconf-24\" data-num=3>3. A mo\u017ce widzimy si\u0119 na KotlinConf &#8217;24?<\/h2>\n\n\n\n<p>A na koniec, jak ju\u017c piszemy o produktach JetBrains, to ju\u017c totalna drobnica.<\/p>\n\n\n\n<p><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2023\/07\/kotlinconf-2024\/\">Zapowiedziano bowiem pi\u0105t\u0105 edycj\u0119 KotlinConf<\/a>, kt\u00f3ra odb\u0119dzie si\u0119 od 22 do 24 maja 2024 roku w Bella Center w Kopenhadze, w Danii.<\/p>\n\n\n\n<p>KotlinConf&#8217;24 rozpocznie si\u0119 dniem warsztat\u00f3w, a nast\u0119pnie przez dwie intensywne dni b\u0119dzie oferowa\u0107 sesje i mo\u017cliwo\u015bci nawi\u0105zywania kontakt\u00f3w i wiele innych atrakcyjnych aktywno\u015bci. Swoimi wra\u017ceniami z zesz\u0142orocznego Keynote dzieli\u0142em si\u0119 na wpisie <a href=\"https:\/\/vived.substack.com\/p\/tldw-opinionated-wrap-up-of-kotlinconf\">TLDW: Opinionated Wrap-up of KotlinConf 2023 Keynote<\/a>, wi\u0119c mo\u017cecie zobaczy\u0107 na ile tego typu impreza jest dla Was interesuj\u0105ca. Pisze o tym, bo radzi\u0142bym si\u0119 pospieszy\u0107 z zakupem &#8211; zar\u00f3wno bilety w promocji super wczesnej, jak i wczesnej ju\u017c zosta\u0142y wyprzedane, a nie min\u0105\u0142 jeszcze tydzie\u0144 od zapowiedzi.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/vivedio_legoland_with_big_computer_monitor_and_old_fashioned_cu_0e674e1b-9907-475c-886e-956a0af48efe.png\" alt=\"\"\/><figcaption class=\"wp-element-caption\">Ja si\u0119 wybieram i zamierzam po\u0142\u0105czy\u0107 wyjazd z wizyt\u0105 w Legolandzie.<\/figcaption><\/figure><\/div>\n\n\n<p>A, i wzmianka jest totalnie bezinteresowna, nie mam z niej \u017cadnej affiliacji &#8211; ale je\u015bli czyta to kto\u015b, kto mo\u017ce mnie pchn\u0105\u0107 w kolejce AI Assistanta, to akurat by\u0142bym wdzi\u0119czny \ud83d\ude04<\/p>\n\n\n\n<p>A jak ju\u017c w temacie Kotlina, to mam dla Was ostatni\u0105 ma\u0142\u0105 informacje: Aby rozwi\u0105za\u0107 zamieszanie i niesp\u00f3jno\u015b\u0107 w nazewnictwie, nazwa produktu \u201eKotlin Multiplatform Mobile\u201d (KMM) jest wycofywana. Od tej pory \u201eKotlin Multiplatform\u201d (KMP) to oficjalna nazwa kotlinowych rozwi\u0105za\u0144 s\u0142u\u017c\u0105cych do wsp\u00f3\u0142dzielenia kodu na r\u00f3\u017cnych platformach, niezale\u017cnie od konkretnej kombinacji platform docelowych. Szczeg\u00f3\u0142y i kontekst tej zmiany znajdziecie w artykule <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2023\/07\/update-on-the-name-of-kotlin-multiplatform\/\">Update on the Name of Kotlin Multiplatform<\/a>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>PS: Odpowied\u017a na pytanie zadane w tek\u015bcie: <strong>Expensive computation<\/strong> trwa\u0142o <a href=\"https:\/\/www.scientificamerican.com\/article\/for-math-fans-a-hitchhikers-guide-to-the-number-42\/\">7.5 miliona lat<\/a> \ud83d\udc01.<\/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\/08\/g5l98l-1-1024x422.gif\" alt=\"\" class=\"wp-image-16546\" width=\"768\" height=\"317\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/g5l98l-1-1024x422.gif 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/g5l98l-1-300x124.gif 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/g5l98l-1-768x317.gif 768w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><figcaption class=\"wp-element-caption\">Ja, przygotowuj\u0105c sample do dzisiejszej edycji. Jestem z nich bardzo dumny i sprawi\u0142y mi mas\u0119 rado\u015bci \ud83d\ude04<\/figcaption><\/figure><\/div>","protected":false},"excerpt":{"rendered":"<p>Dawno nie by\u0142o JEP-\u00f3w, prawda? Te\u017c si\u0119 st\u0119skni\u0142em, tak\u017ce mam dla Was dzisiaj a\u017c trzy. Opr\u00f3cz tego nowy IntelliJ Idea z wbudowanym AI Assistant.<\/p>\n","protected":false},"author":10,"featured_media":16552,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[23],"tags":[],"class_list":["post-16538","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jvm"],"acf":{"estimated_reading_time":"9","feature_image_blog":false,"weekly_summary":true,"push_notification_image":"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/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>Nowe JEP-y: Computed Constants, nowe podej\u015bcie do Ahead-of-Time i stabilizacja FFM API - JVM Weekly vol. 144 - 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\/nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-i-stabilizacja-ffm-api-jvm-weekly-vol-144\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Nowe JEP-y: Computed Constants, nowe podej\u015bcie do Ahead-of-Time i stabilizacja FFM API - JVM Weekly vol. 144 - Vived\" \/>\n<meta property=\"og:description\" content=\"Dawno nie by\u0142o JEP-\u00f3w, prawda? Te\u017c si\u0119 st\u0119skni\u0142em, tak\u017ce mam dla Was dzisiaj a\u017c trzy. Opr\u00f3cz tego nowy IntelliJ Idea z wbudowanym AI Assistant.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-i-stabilizacja-ffm-api-jvm-weekly-vol-144\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2023-08-01T14:07:56+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-01T14:08:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/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\/nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-i-stabilizacja-ffm-api-jvm-weekly-vol-144\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-i-stabilizacja-ffm-api-jvm-weekly-vol-144\/\"},\"author\":{\"name\":\"Artur Skowro\u0144ski\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\"},\"headline\":\"Nowe JEP-y: Computed Constants, nowe podej\u015bcie do Ahead-of-Time i stabilizacja FFM API &#8211; JVM Weekly vol. 144\",\"datePublished\":\"2023-08-01T14:07:56+00:00\",\"dateModified\":\"2023-08-01T14:08:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-i-stabilizacja-ffm-api-jvm-weekly-vol-144\/\"},\"wordCount\":1616,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-i-stabilizacja-ffm-api-jvm-weekly-vol-144\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/JVM-Weekly-1200x628_V2.png\",\"articleSection\":[\"JVM\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-i-stabilizacja-ffm-api-jvm-weekly-vol-144\/\",\"url\":\"https:\/\/vived.io\/pl\/nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-i-stabilizacja-ffm-api-jvm-weekly-vol-144\/\",\"name\":\"Nowe JEP-y: Computed Constants, nowe podej\u015bcie do Ahead-of-Time i stabilizacja FFM API - JVM Weekly vol. 144 - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-i-stabilizacja-ffm-api-jvm-weekly-vol-144\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-i-stabilizacja-ffm-api-jvm-weekly-vol-144\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/JVM-Weekly-1200x628_V2.png\",\"datePublished\":\"2023-08-01T14:07:56+00:00\",\"dateModified\":\"2023-08-01T14:08:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-i-stabilizacja-ffm-api-jvm-weekly-vol-144\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-i-stabilizacja-ffm-api-jvm-weekly-vol-144\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-i-stabilizacja-ffm-api-jvm-weekly-vol-144\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/JVM-Weekly-1200x628_V2.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/JVM-Weekly-1200x628_V2.png\",\"width\":1200,\"height\":628},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-i-stabilizacja-ffm-api-jvm-weekly-vol-144\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Nowe JEP-y: Computed Constants, nowe podej\u015bcie do Ahead-of-Time i stabilizacja FFM API &#8211; JVM Weekly vol. 144\"}]},{\"@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":"Nowe JEP-y: Computed Constants, nowe podej\u015bcie do Ahead-of-Time i stabilizacja FFM API - JVM Weekly vol. 144 - 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\/nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-i-stabilizacja-ffm-api-jvm-weekly-vol-144\/","og_locale":"pl_PL","og_type":"article","og_title":"Nowe JEP-y: Computed Constants, nowe podej\u015bcie do Ahead-of-Time i stabilizacja FFM API - JVM Weekly vol. 144 - Vived","og_description":"Dawno nie by\u0142o JEP-\u00f3w, prawda? Te\u017c si\u0119 st\u0119skni\u0142em, tak\u017ce mam dla Was dzisiaj a\u017c trzy. Opr\u00f3cz tego nowy IntelliJ Idea z wbudowanym AI Assistant.","og_url":"https:\/\/vived.io\/pl\/nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-i-stabilizacja-ffm-api-jvm-weekly-vol-144\/","og_site_name":"Vived","article_published_time":"2023-08-01T14:07:56+00:00","article_modified_time":"2023-08-01T14:08:00+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/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\/nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-i-stabilizacja-ffm-api-jvm-weekly-vol-144\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-i-stabilizacja-ffm-api-jvm-weekly-vol-144\/"},"author":{"name":"Artur Skowro\u0144ski","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3"},"headline":"Nowe JEP-y: Computed Constants, nowe podej\u015bcie do Ahead-of-Time i stabilizacja FFM API &#8211; JVM Weekly vol. 144","datePublished":"2023-08-01T14:07:56+00:00","dateModified":"2023-08-01T14:08:00+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-i-stabilizacja-ffm-api-jvm-weekly-vol-144\/"},"wordCount":1616,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-i-stabilizacja-ffm-api-jvm-weekly-vol-144\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/JVM-Weekly-1200x628_V2.png","articleSection":["JVM"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-i-stabilizacja-ffm-api-jvm-weekly-vol-144\/","url":"https:\/\/vived.io\/pl\/nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-i-stabilizacja-ffm-api-jvm-weekly-vol-144\/","name":"Nowe JEP-y: Computed Constants, nowe podej\u015bcie do Ahead-of-Time i stabilizacja FFM API - JVM Weekly vol. 144 - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-i-stabilizacja-ffm-api-jvm-weekly-vol-144\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-i-stabilizacja-ffm-api-jvm-weekly-vol-144\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/JVM-Weekly-1200x628_V2.png","datePublished":"2023-08-01T14:07:56+00:00","dateModified":"2023-08-01T14:08:00+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-i-stabilizacja-ffm-api-jvm-weekly-vol-144\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-i-stabilizacja-ffm-api-jvm-weekly-vol-144\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-i-stabilizacja-ffm-api-jvm-weekly-vol-144\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/JVM-Weekly-1200x628_V2.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/JVM-Weekly-1200x628_V2.png","width":1200,"height":628},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/nowe-jep-y-computed-constants-nowe-podejscie-do-ahead-of-time-i-stabilizacja-ffm-api-jvm-weekly-vol-144\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"Nowe JEP-y: Computed Constants, nowe podej\u015bcie do Ahead-of-Time i stabilizacja FFM API &#8211; JVM Weekly vol. 144"}]},{"@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. Nowe JEP-y: Computed Constants, nowe podej\u015bcie do Ahead-of-Time &amp; stabilizacja i FFM API<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">1. Nowe JEP-y: Computed Constants, nowe podej\u015bcie do Ahead-of-Time &amp; stabilizacja i FFM API<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/8310626\">JEP draft: Foreign Function &amp; Memory API<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/8310626\">JEP draft: Foreign Function &amp; Memory API<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Zaczniemy od czego\u015b do\u015b\u0107 oczywistego, ale w dalszym ci\u0105gu interesuj\u0105cego.<\/p>\n","innerContent":["\n<p>Zaczniemy od czego\u015b do\u015b\u0107 oczywistego, ale w dalszym ci\u0105gu interesuj\u0105cego.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>JDK 21 przynosi stabilizacje wielu d\u0142ugo oczekiwanych API, ale z jednym do\u015b\u0107 istotnym wyj\u0105tkiem - Foreign Function &amp; Memory API. Ta kluczowa funkcjonalnos\u0107 Panamy uka\u017ce si\u0119 wy\u0142\u0105cznie jako Preview, ju\u017c trzecie. Wszystko wskazuje jednak, \u017ce r\u00f3wnie\u017c ostatniego - w ostatnich dniach opublikowany i zaktualizowany zosta\u0142 JEP Draft zawieraj\u0105cy ju\u017c specyfikacje finalnej wersji tego API. Wszystko wskazuje wi\u0119c na to, \u017ce kt\u00f3ra\u015b z najbli\u017cszych wersji Javy (mo\u017ce ju\u017c JDK 22) pozwoli nam na wygodne Sam JEP za\u015b skupia si\u0119 na finalizacji interfejsu API FFM poprzez wprowadzenie serii ulepsze\u0144, takich jak wprowadzenie atrybutu manifestu <code>Enable-Native-Access<\/code>, umo\u017cliwiaj\u0105cego plikom JAR dost\u0119p do wybranych metod bez wymagania konkretnych flag. Dodatkowe ulepszenia obejmuj\u0105 tworzenie deskryptor\u00f3w funkcji C, bardziej zaawansowane wsparcie dla natywnych tablic o zmiennym rozmiarze oraz wsparcie dla wielu zestaw\u00f3w znak\u00f3w w natywnych stringach.<\/p>\n","innerContent":["\n<p>JDK 21 przynosi stabilizacje wielu d\u0142ugo oczekiwanych API, ale z jednym do\u015b\u0107 istotnym wyj\u0105tkiem - Foreign Function &amp; Memory API. Ta kluczowa funkcjonalnos\u0107 Panamy uka\u017ce si\u0119 wy\u0142\u0105cznie jako Preview, ju\u017c trzecie. Wszystko wskazuje jednak, \u017ce r\u00f3wnie\u017c ostatniego - w ostatnich dniach opublikowany i zaktualizowany zosta\u0142 JEP Draft zawieraj\u0105cy ju\u017c specyfikacje finalnej wersji tego API. Wszystko wskazuje wi\u0119c na to, \u017ce kt\u00f3ra\u015b z najbli\u017cszych wersji Javy (mo\u017ce ju\u017c JDK 22) pozwoli nam na wygodne Sam JEP za\u015b skupia si\u0119 na finalizacji interfejsu API FFM poprzez wprowadzenie serii ulepsze\u0144, takich jak wprowadzenie atrybutu manifestu <code>Enable-Native-Access<\/code>, umo\u017cliwiaj\u0105cego plikom JAR dost\u0119p do wybranych metod bez wymagania konkretnych flag. Dodatkowe ulepszenia obejmuj\u0105 tworzenie deskryptor\u00f3w funkcji C, bardziej zaawansowane wsparcie dla natywnych tablic o zmiennym rozmiarze oraz wsparcie dla wielu zestaw\u00f3w znak\u00f3w w natywnych stringach.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/8312611\">JEP draft: Computed Constants<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/8312611\">JEP draft: Computed Constants<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Programi\u015bci Java staj\u0105 przed dylematem mi\u0119dzy niezmienno\u015bci\u0105 a elastyczno\u015bci\u0105 inicjalizacji, szczeg\u00f3lnie w zarz\u0105dzaniu polami <code>final<\/code>. Java wymaga bowiem, aby ta by\u0142a inicjalizowana w konstruktorze:<\/p>\n","innerContent":["\n<p>Programi\u015bci Java staj\u0105 przed dylematem mi\u0119dzy niezmienno\u015bci\u0105 a elastyczno\u015bci\u0105 inicjalizacji, szczeg\u00f3lnie w zarz\u0105dzaniu polami <code>final<\/code>. Java wymaga bowiem, aby ta by\u0142a inicjalizowana w konstruktorze:<\/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>class DeepThought {\n    final int theAnswer;\n\n    public DeepThought() {\n        value = ultimateQuestion();     \n    }\n\n    private int ultimateQuestion() {\n        \/\/ Expensive computation here\n        return 42;\n    }\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>class DeepThought {\n    final int theAnswer;\n\n    public DeepThought() {\n        value = ultimateQuestion();     \n    }\n\n    private int ultimateQuestion() {\n        \/\/ Expensive computation here\n        return 42;\n    }\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Oczywi\u015bcie istniej\u0105 strategie takie jak <strong>class-holder idiom<\/strong>:<\/p>\n","innerContent":["\n<p>Oczywi\u015bcie istniej\u0105 strategie takie jak <strong>class-holder idiom<\/strong>:<\/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>class DeepThought {\n    private static class AnswerHolder {\n        static final int theAnswer = ultimateQuestion();\n\n        private static int ultimateQuestion() {\n            \/\/ Expensive computation here\n            return 42;\n        }\n    }\n\n    public DeepThought() {\n    }\n\n    public int getTheAnswer() {\n        return AnswerHolder.theAnswer;\n    }\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>class DeepThought {\n    private static class AnswerHolder {\n        static final int theAnswer = ultimateQuestion();\n\n        private static int ultimateQuestion() {\n            \/\/ Expensive computation here\n            return 42;\n        }\n    }\n\n    public DeepThought() {\n    }\n\n    public int getTheAnswer() {\n        return AnswerHolder.theAnswer;\n    }\n}\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>czy (w nieco bardziej skomplikowanych przypadkach) znany cho\u0107by z Effective Java, paskudny <strong>double-checked locking<\/strong>:<\/p>\n","innerContent":["\n<p>czy (w nieco bardziej skomplikowanych przypadkach) znany cho\u0107by z Effective Java, paskudny <strong>double-checked locking<\/strong>:<\/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>class DeepThought {\n    private static class AnswerHolder {\n        static final int theAnswer = ultimateQuestion();\n\n        private static int ultimateQuestion() {\n            \/\/ Expensive computation here, takes 7.5 million years\n            return 42;\n        }\n    }\n\n    public int getTheAnswer() {\n        return AnswerHolder.theAnswer;\n    }\n}\n\nclass LazySingleton {\n    private static volatile LazySingleton instance;\n    private final DeepThought deepThought;\n\n    private LazySingleton() {\n        deepThought = new DeepThought();\n    }\n\n    public static LazySingleton getInstance() {\n        if (instance == null) {\n            synchronized (LazySingleton.class) {\n                if (instance == null) {\n                    instance = new LazySingleton();\n                }\n            }\n        }\n        return instance;\n    }\n\n    public int getTheAnswer() {\n        return deepThought.getTheAnswer();\n    }\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>class DeepThought {\n    private static class AnswerHolder {\n        static final int theAnswer = ultimateQuestion();\n\n        private static int ultimateQuestion() {\n            \/\/ Expensive computation here, takes 7.5 million years\n            return 42;\n        }\n    }\n\n    public int getTheAnswer() {\n        return AnswerHolder.theAnswer;\n    }\n}\n\nclass LazySingleton {\n    private static volatile LazySingleton instance;\n    private final DeepThought deepThought;\n\n    private LazySingleton() {\n        deepThought = new DeepThought();\n    }\n\n    public static LazySingleton getInstance() {\n        if (instance == null) {\n            synchronized (LazySingleton.class) {\n                if (instance == null) {\n                    instance = new LazySingleton();\n                }\n            }\n        }\n        return instance;\n    }\n\n    public int getTheAnswer() {\n        return deepThought.getTheAnswer();\n    }\n}\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>cho\u0107 u\u017cyteczne, maj\u0105 wady, takie jak dodatkowa z\u0142o\u017cono\u015b\u0107 po\u0142\u0105czona z utrat\u0105 mo\u017cliwo\u015bci \u0142atwej optymalizacji w czasie wykonywania. W przeciwie\u0144stwie do j\u0119zyk\u00f3w takich jak C# (z jego typem <code>Lazy&lt;T&gt;<\/code>):<\/p>\n","innerContent":["\n<p>cho\u0107 u\u017cyteczne, maj\u0105 wady, takie jak dodatkowa z\u0142o\u017cono\u015b\u0107 po\u0142\u0105czona z utrat\u0105 mo\u017cliwo\u015bci \u0142atwej optymalizacji w czasie wykonywania. W przeciwie\u0144stwie do j\u0119zyk\u00f3w takich jak C# (z jego typem <code>Lazy&lt;T&gt;<\/code>):<\/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>class DeepThought {\n    private static readonly Lazy&lt;int&gt; theAnswer = new Lazy&lt;int&gt;(() =&gt; UltimateQuestion());\n\n    private static int UltimateQuestion() {\n        \/\/ Expensive computation here\n        return 42;\n    }\n    \n    static int getTheAnswer() {\n        return theAnswer.get();\n    }\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>class DeepThought {\n    private static readonly Lazy&lt;int&gt; theAnswer = new Lazy&lt;int&gt;(() =&gt; UltimateQuestion());\n\n    private static int UltimateQuestion() {\n        \/\/ Expensive computation here\n        return 42;\n    }\n    \n    static int getTheAnswer() {\n        return theAnswer.get();\n    }\n}\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>czy Kotlin (kt\u00f3ry <code>lazy<\/code> dla \"leniwej\" inicjalizacji):<\/p>\n","innerContent":["\n<p>czy Kotlin (kt\u00f3ry <code>lazy<\/code> dla \"leniwej\" inicjalizacji):<\/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>class DeepThought {\n    val theAnswer: Int by lazy { ultimateQuestion() }\n\n    private fun ultimateQuestion(): Int {\n        \/\/ Expensive computation here\n        return 42\n    }\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>class DeepThought {\n    val theAnswer: Int by lazy { ultimateQuestion() }\n\n    private fun ultimateQuestion(): Int {\n        \/\/ Expensive computation here\n        return 42\n    }\n}\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>\u015bcis\u0142e wymogi Javy dotycz\u0105ce inicjalizacji p\u00f3l oznaczonych jako <code>final<\/code> stwarzaj\u0105 wyzwania w odroczeniu inicjalizacji sta\u0142ych, zmuszaj\u0105c programist\u00f3w do obchodzenia ogranicze\u0144 j\u0119zyka .<\/p>\n","innerContent":["\n<p>\u015bcis\u0142e wymogi Javy dotycz\u0105ce inicjalizacji p\u00f3l oznaczonych jako <code>final<\/code> stwarzaj\u0105 wyzwania w odroczeniu inicjalizacji sta\u0142ych, zmuszaj\u0105c programist\u00f3w do obchodzenia ogranicze\u0144 j\u0119zyka .<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><a href=\"https:\/\/openjdk.org\/jeps\/8312611\">JEP draft: Computed Constants<\/a> wprowadza koncept Computed Constants, maj\u0105cych na celu zniwelowanie tej luki poprzez dostarczenie funkcji podobnej do konstrukcji znalezionych w j\u0119zykach takich jak C# i Kotlin. Sta\u0142e Obliczeniowe (nawet zgrabne t\u0142umaczenie) s\u0105 niemutowalne i s\u0105 gwarantuj\u0105 inicjalizowane co najwy\u017cej raz, oferuj\u0105c korzy\u015bci p\u00f3l oznaczonych jako <code>final<\/code>, ale z wi\u0119ksz\u0105 elastyczno\u015bci\u0105 w czasie inicjalizacji.<\/p>\n","innerContent":["\n<p><a href=\"https:\/\/openjdk.org\/jeps\/8312611\">JEP draft: Computed Constants<\/a> wprowadza koncept Computed Constants, maj\u0105cych na celu zniwelowanie tej luki poprzez dostarczenie funkcji podobnej do konstrukcji znalezionych w j\u0119zykach takich jak C# i Kotlin. Sta\u0142e Obliczeniowe (nawet zgrabne t\u0142umaczenie) s\u0105 niemutowalne i s\u0105 gwarantuj\u0105 inicjalizowane co najwy\u017cej raz, oferuj\u0105c korzy\u015bci p\u00f3l oznaczonych jako <code>final<\/code>, ale z wi\u0119ksz\u0105 elastyczno\u015bci\u0105 w czasie inicjalizacji.<\/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>class DeepThought {\n    private static final ComputedConstant&lt;Int&gt; theAnswer =\n            ComputedConstant.of(() -&gt; ultimateQuestion());\n\n    static int ultimateQuestion() {\n        \/\/ Expensive computation here\n        \/\/    (evaluation made before the first access)\n        return 42\n    }\n    \n    static int getTheAnswer() {\n        return theAnswer.get();\n    }\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>class DeepThought {\n    private static final ComputedConstant&lt;Int&gt; theAnswer =\n            ComputedConstant.of(() -&gt; ultimateQuestion());\n\n    static int ultimateQuestion() {\n        \/\/ Expensive computation here\n        \/\/    (evaluation made before the first access)\n        return 42\n    }\n    \n    static int getTheAnswer() {\n        return theAnswer.get();\n    }\n}\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jak widzicie, rozwi\u0105zanie jest ca\u0142kiem eleganckie i \u0142adnie wpasowuje si\u0119 w ostatnie konwencje j\u0119zyka, takie jak Scoped Values. Wspominany ju\u017c oryginalny JEP zawiera te\u017c przyk\u0142ad dla kolekcji.<\/p>\n","innerContent":["\n<p>Jak widzicie, rozwi\u0105zanie jest ca\u0142kiem eleganckie i \u0142adnie wpasowuje si\u0119 w ostatnie konwencje j\u0119zyka, takie jak Scoped Values. Wspominany ju\u017c oryginalny JEP zawiera te\u017c przyk\u0142ad dla kolekcji.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/embed","attrs":{"url":"https:\/\/www.youtube.com\/watch?v=2Tvy_Pbe5NA","type":"video","providerNameSlug":"youtube","responsive":true,"className":"wp-embed-aspect-16-9 wp-has-aspect-ratio"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/www.youtube.com\/watch?v=2Tvy_Pbe5NA\n<\/div><figcaption class=\"wp-element-caption\">A teraz test Nerda - ile w powy\u017cszych przyk\u0142adach trwa\u0142o \"Expensive computation\"? Podpowied\u017a w miniaturce tego posta \ud83d\ude04<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/www.youtube.com\/watch?v=2Tvy_Pbe5NA\n<\/div><figcaption class=\"wp-element-caption\">A teraz test Nerda - ile w powy\u017cszych przyk\u0142adach trwa\u0142o \"Expensive computation\"? Podpowied\u017a w miniaturce tego posta \ud83d\ude04<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/8313278\">JEP draft: Ahead of Time Compilation for the Java Virtual Machine<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/8313278\">JEP draft: Ahead of Time Compilation for the Java Virtual Machine<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>A na koniec chyba moje ulubione mi\u0119siwo, wracamy bowiem do uwielbianego przeze mnie tematu szybszego startu JVM.<\/p>\n","innerContent":["\n<p>A na koniec chyba moje ulubione mi\u0119siwo, wracamy bowiem do uwielbianego przeze mnie tematu szybszego startu JVM.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Aplikacje i biblioteki Java s\u0105 obecnie wykonywane w modelu trzystopniowym, najpierw w Interpreterze, nast\u0119pnie jako skompilowany kod C1, a potem jako skompilowany kod C2. Proces ten jest bardzo dynamiczny, obejmuj\u0105cy wiele iteracji cykli optymalizacji i deoptymalizacji w trakcie \u017cycia kodu. Dodatkowo oznacza to, \u017ce rozgrzewanie kodu (gdzie w runtime odbywa si\u0119 kompilacji wysoce zoptymalizowanej wersji) mo\u017ce zaj\u0105\u0107 du\u017co czasu.<\/p>\n","innerContent":["\n<p>Aplikacje i biblioteki Java s\u0105 obecnie wykonywane w modelu trzystopniowym, najpierw w Interpreterze, nast\u0119pnie jako skompilowany kod C1, a potem jako skompilowany kod C2. Proces ten jest bardzo dynamiczny, obejmuj\u0105cy wiele iteracji cykli optymalizacji i deoptymalizacji w trakcie \u017cycia kodu. Dodatkowo oznacza to, \u017ce rozgrzewanie kodu (gdzie w runtime odbywa si\u0119 kompilacji wysoce zoptymalizowanej wersji) mo\u017ce zaj\u0105\u0107 du\u017co czasu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dobrym przyk\u0142adem jest kompilator Graal, kt\u00f3ry (jak pewnie niewiele os\u00f3b ju\u017c pami\u0119ta) by\u0142 dost\u0119pnym zamiennikiem dla C2 przed Java 17, gdzie w spektakularny spos\u00f3b si\u0119 go pozbyto. Powody by\u0142y ca\u0142kiem logiczne: etap uruchamiania kompilatora negatywnie wp\u0142yn\u0105\u0142 na ca\u0142\u0105 aplikacj\u0119, poniewa\u017c sam Graal musia\u0142 zosta\u0107 skompilowany, zanim m\u00f3g\u0142 dzia\u0142a\u0107 z rozs\u0105dn\u0105 pr\u0119dko\u015bci\u0105, co zniwelowa\u0142o mo\u017cliwe zyski z wydajno\u015bci. Dodatkowo proces deoptymalizacji, kt\u00f3ry wyst\u0119puje, gdy skompilowany kod C2 napotyka b\u0142\u0119dn\u0105 hipotez\u0119, mo\u017ce by\u0107 kosztowny, poniewa\u017c wariant profiluj\u0105cy C1 musi zosta\u0107 ponownie skompilowany, tylko po to, by zosta\u0107 ponownie odrzucony, gdy C2 skompiluje t\u0119 sam\u0105 metod\u0119. Istniej\u0105ce alternatywy, jak wspomniany GraalVM i Native Image, operuj\u0105 za\u015b na tak zwanym \"za\u0142o\u017ceniu zamkni\u0119tego \u015bwiata\", kt\u00f3re nie pozwala na dynamiczne doczytywanie kolejnych klas w runtime. Wymuszaj\u0105 wi\u0119c spore zmiany w stosunku do typowym wykonywaniem aplikacji Java przez JVM.<\/p>\n","innerContent":["\n<p>Dobrym przyk\u0142adem jest kompilator Graal, kt\u00f3ry (jak pewnie niewiele os\u00f3b ju\u017c pami\u0119ta) by\u0142 dost\u0119pnym zamiennikiem dla C2 przed Java 17, gdzie w spektakularny spos\u00f3b si\u0119 go pozbyto. Powody by\u0142y ca\u0142kiem logiczne: etap uruchamiania kompilatora negatywnie wp\u0142yn\u0105\u0142 na ca\u0142\u0105 aplikacj\u0119, poniewa\u017c sam Graal musia\u0142 zosta\u0107 skompilowany, zanim m\u00f3g\u0142 dzia\u0142a\u0107 z rozs\u0105dn\u0105 pr\u0119dko\u015bci\u0105, co zniwelowa\u0142o mo\u017cliwe zyski z wydajno\u015bci. Dodatkowo proces deoptymalizacji, kt\u00f3ry wyst\u0119puje, gdy skompilowany kod C2 napotyka b\u0142\u0119dn\u0105 hipotez\u0119, mo\u017ce by\u0107 kosztowny, poniewa\u017c wariant profiluj\u0105cy C1 musi zosta\u0107 ponownie skompilowany, tylko po to, by zosta\u0107 ponownie odrzucony, gdy C2 skompiluje t\u0119 sam\u0105 metod\u0119. Istniej\u0105ce alternatywy, jak wspomniany GraalVM i Native Image, operuj\u0105 za\u015b na tak zwanym \"za\u0142o\u017ceniu zamkni\u0119tego \u015bwiata\", kt\u00f3re nie pozwala na dynamiczne doczytywanie kolejnych klas w runtime. Wymuszaj\u0105 wi\u0119c spore zmiany w stosunku do typowym wykonywaniem aplikacji Java przez JVM.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dobre rozwi\u0105zanie to posiadanie trwa\u0142ego wariantu metody skompilowanej Ahead-of-Time C1, dzi\u0119ki czemu mo\u017cna pomin\u0105\u0107 Interpreter i C1, tak \u017ce przy uruchamianiu wykonanie zaczyna si\u0119 od prekompilowanego kodu C1, a nast\u0119pnie natychmiast przechodzi do kompilacji C2. Proponowane w <a href=\"https:\/\/openjdk.org\/jeps\/8313278\">JEP draft: Ahead of Time Compilation for the Java Virtual Machine<\/a> rozwi\u0105zanie polega wi\u0119c na wzbogacenie JVM o zdolno\u015b\u0107 do wczytywania aplikacji i bibliotek Java skompilowanych do kodu natywnego przed uruchomieniem. Obejmuje to ca\u0142kowite pomini\u0119cie Interpretera, umo\u017cliwiaj\u0105c kompilacj\u0119 kodu Java, standardowych bibliotek i dowolnych komponent\u00f3w JVM Ahead-of-Time do natywnego kodu w trybach profilowania lub optymalizacji. Zmiana ta umo\u017cliwia natychmiastowe wykonywanie skompilowanego kodu, przechodzenie od razu do kompilacji C2 oraz zachowanie skompilowanych metod dla bardziej wydajnych proces\u00f3w deoptymalizacji.<\/p>\n","innerContent":["\n<p>Dobre rozwi\u0105zanie to posiadanie trwa\u0142ego wariantu metody skompilowanej Ahead-of-Time C1, dzi\u0119ki czemu mo\u017cna pomin\u0105\u0107 Interpreter i C1, tak \u017ce przy uruchamianiu wykonanie zaczyna si\u0119 od prekompilowanego kodu C1, a nast\u0119pnie natychmiast przechodzi do kompilacji C2. Proponowane w <a href=\"https:\/\/openjdk.org\/jeps\/8313278\">JEP draft: Ahead of Time Compilation for the Java Virtual Machine<\/a> rozwi\u0105zanie polega wi\u0119c na wzbogacenie JVM o zdolno\u015b\u0107 do wczytywania aplikacji i bibliotek Java skompilowanych do kodu natywnego przed uruchomieniem. Obejmuje to ca\u0142kowite pomini\u0119cie Interpretera, umo\u017cliwiaj\u0105c kompilacj\u0119 kodu Java, standardowych bibliotek i dowolnych komponent\u00f3w JVM Ahead-of-Time do natywnego kodu w trybach profilowania lub optymalizacji. Zmiana ta umo\u017cliwia natychmiastowe wykonywanie skompilowanego kodu, przechodzenie od razu do kompilacji C2 oraz zachowanie skompilowanych metod dla bardziej wydajnych proces\u00f3w deoptymalizacji.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Brzmi troch\u0119 jak mix podej\u015bcia CRaC z projektem Leyden, prawda? Ten ostatni jest nawet wspominany w oryginalnym JEP-ie, a korzystaj\u0105c z okazji pozwol\u0119 sobie na ma\u0142y spoiler: Do tematu Leyden wr\u00f3cimy ju\u017c nied\u0142ugo, bo zaledwie wczoraj ukaza\u0142y si\u0119 nowe aktualizacje w temacie i id\u0119 si\u0119 musia\u0142 przez nie przebi\u0107 i przetrawi\u0107, bo to jednak nieco bardziej skomplikowany temat i nie chce Wam dostarczy\u0107 czego\u015b na szybko, niedopieczonego.<\/p>\n","innerContent":["\n<p>Brzmi troch\u0119 jak mix podej\u015bcia CRaC z projektem Leyden, prawda? Ten ostatni jest nawet wspominany w oryginalnym JEP-ie, a korzystaj\u0105c z okazji pozwol\u0119 sobie na ma\u0142y spoiler: Do tematu Leyden wr\u00f3cimy ju\u017c nied\u0142ugo, bo zaledwie wczoraj ukaza\u0142y si\u0119 nowe aktualizacje w temacie i id\u0119 si\u0119 musia\u0142 przez nie przebi\u0107 i przetrawi\u0107, bo to jednak nieco bardziej skomplikowany temat i nie chce Wam dostarczy\u0107 czego\u015b na szybko, niedopieczonego.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16540,"width":768,"height":576,"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\/08\/image-1024x768.png\" alt=\"\" class=\"wp-image-16540\" width=\"768\" height=\"576\"\/><figcaption class=\"wp-element-caption\">W weekend pierwszy raz robi\u0142em steki z grilla, i by\u0142o to dla mnie na tyle stresuj\u0105ce do\u015bwiadczenie, \u017ce dalej trzymaj\u0105 si\u0119 mnie kulinarne nawi\u0105zania.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/image-1024x768.png\" alt=\"\" class=\"wp-image-16540\" width=\"768\" height=\"576\"\/><figcaption class=\"wp-element-caption\">W weekend pierwszy raz robi\u0142em steki z grilla, i by\u0142o to dla mnie na tyle stresuj\u0105ce do\u015bwiadczenie, \u017ce dalej trzymaj\u0105 si\u0119 mnie kulinarne nawi\u0105zania.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">2. Premiera nowego IntelliJ Idea z AI Assistant<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">2. Premiera nowego IntelliJ Idea z AI Assistant<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Pojawi\u0142 si\u0119 nowy IntelliJ i oczywi\u015bcie, jak ka\u017cde narz\u0119dzie w 2023 musia\u0142 doczeka\u0107 si\u0119 wsparcia AI.<\/p>\n","innerContent":["\n<p>Pojawi\u0142 si\u0119 nowy IntelliJ i oczywi\u015bcie, jak ka\u017cde narz\u0119dzie w 2023 musia\u0142 doczeka\u0107 si\u0119 wsparcia AI.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16548,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/download.png\" alt=\"\" class=\"wp-image-16548\"\/><figcaption class=\"wp-element-caption\"><em>It's the circle of life; And it moves us all; Through despair and hope; Through faith and love<\/em>...<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/download.png\" alt=\"\" class=\"wp-image-16548\"\/><figcaption class=\"wp-element-caption\"><em>It's the circle of life; And it moves us all; Through despair and hope; Through faith and love<\/em>...<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Generatywna sztuczna inteligencja i tak zwane LLM (Large-Language Models) zosta\u0142y zintegrowane z IDE JetBrains, a celem nowego featura ma by\u0107 (oczywi\u015bcie) zwi\u0119kszenie efektywno\u015bci pracy programist\u00f3w. Obejmuje to czat umo\u017cliwiaj\u0105cy tworzenie zapyta\u0144 o kod, automatyczne generowanie dokumentacji, sugestie nazw i generowanie commit message. Funkcje AI s\u0105 dostarczane przez us\u0142ug\u0119 JetBrains AI, kt\u00f3re na ten moment opieraj\u0105 si\u0119 na OpenAI, ale w tw\u00f3rcy obiecali, \u017ce nale\u017cy si\u0119 spodziewa\u0107 wsparcia innych dostawc\u00f3w, a tak\u017ce lokalnych modeli. Niestety, ca\u0142o\u015b\u0107 dost\u0119pna jest tylko dla wybranych u\u017cytkownik\u00f3w. Wszystko powy\u017csze pisze w oparciu o release notes, poniewa\u017c czekam ci\u0105gle na dost\u0119p \ud83e\udd37\u200d\u2642\ufe0f<\/p>\n","innerContent":["\n<p>Generatywna sztuczna inteligencja i tak zwane LLM (Large-Language Models) zosta\u0142y zintegrowane z IDE JetBrains, a celem nowego featura ma by\u0107 (oczywi\u015bcie) zwi\u0119kszenie efektywno\u015bci pracy programist\u00f3w. Obejmuje to czat umo\u017cliwiaj\u0105cy tworzenie zapyta\u0144 o kod, automatyczne generowanie dokumentacji, sugestie nazw i generowanie commit message. Funkcje AI s\u0105 dostarczane przez us\u0142ug\u0119 JetBrains AI, kt\u00f3re na ten moment opieraj\u0105 si\u0119 na OpenAI, ale w tw\u00f3rcy obiecali, \u017ce nale\u017cy si\u0119 spodziewa\u0107 wsparcia innych dostawc\u00f3w, a tak\u017ce lokalnych modeli. Niestety, ca\u0142o\u015b\u0107 dost\u0119pna jest tylko dla wybranych u\u017cytkownik\u00f3w. Wszystko powy\u017csze pisze w oparciu o release notes, poniewa\u017c czekam ci\u0105gle na dost\u0119p \ud83e\udd37\u200d\u2642\ufe0f<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"width":1069,"height":573},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/generate_method-1.gif\" alt=\"\" width=\"1069\" height=\"573\"\/><figcaption class=\"wp-element-caption\">Powy\u017cszy screen to cyfrowy odpowiednik lizania cukierka przez papierek.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/generate_method-1.gif\" alt=\"\" width=\"1069\" height=\"573\"\/><figcaption class=\"wp-element-caption\">Powy\u017cszy screen to cyfrowy odpowiednik lizania cukierka przez papierek.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>To nie koniec ulepsze\u0144 w IntelliJ IDEA 2023.2. Java doczeka\u0142a si\u0119 rozszerzonej inspekcji i pod\u015bwietlania kodu oraz lepsze wsparcie dla wprowadzonego w JDK 18 tagu <code>@snippet<\/code> w komentarzach Javadoc. Stringi SQL w Java i Kotlin otrzyma\u0142y lepsz\u0105 analiz\u0119 w celu wykrycia niebezpiecznych zapyta\u0144 i potencjalnych podatno\u015bci na ataki typu SQL injection.<\/p>\n","innerContent":["\n<p>To nie koniec ulepsze\u0144 w IntelliJ IDEA 2023.2. Java doczeka\u0142a si\u0119 rozszerzonej inspekcji i pod\u015bwietlania kodu oraz lepsze wsparcie dla wprowadzonego w JDK 18 tagu <code>@snippet<\/code> w komentarzach Javadoc. Stringi SQL w Java i Kotlin otrzyma\u0142y lepsz\u0105 analiz\u0119 w celu wykrycia niebezpiecznych zapyta\u0144 i potencjalnych podatno\u015bci na ataki typu SQL injection.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Nowa wersja wzmacnia r\u00f3wnie\u017c wsparcie dla Scala 3, wprowadzaj\u0105c usprawnienia takie jak lepsze wykorzystanie enum\u00f3w, dekompilator TASTy, wsparcie w edytorze dla <code>IArray<\/code> oraz lepsze wsparcie dla sk\u0142adni o mniejszej ilo\u015bci nawias\u00f3w. IDE posiada ulepszon\u0105 obs\u0142ug\u0119 katalog\u00f3w oraz usprawnia renderowanie ScalaDoc.<\/p>\n","innerContent":["\n<p>Nowa wersja wzmacnia r\u00f3wnie\u017c wsparcie dla Scala 3, wprowadzaj\u0105c usprawnienia takie jak lepsze wykorzystanie enum\u00f3w, dekompilator TASTy, wsparcie w edytorze dla <code>IArray<\/code> oraz lepsze wsparcie dla sk\u0142adni o mniejszej ilo\u015bci nawias\u00f3w. IDE posiada ulepszon\u0105 obs\u0142ug\u0119 katalog\u00f3w oraz usprawnia renderowanie ScalaDoc.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Opr\u00f3cz Asystenta AI i innych wspomnianych funkcji, nadchodz\u0105ca wersja IntelliJ IDEA 2023.2 b\u0119dzie oznacza\u0107 wycofanie kilku wtyczek, takich jak Struts2, Play i Cloud Foundry - nie b\u0119d\u0105 one ju\u017c aktualizowane. Mnie jako\u015b \u0142ezka si\u0119 w oku zakr\u0119ci\u0142a je\u015bli chodzi o Play Framework, kt\u00f3ry kiedy\u015b uwa\u017cany by\u0142 za now\u0105 jako\u015b\u0107 w \u015bwiecie JVM, a teraz po oddaniu go spo\u0142eczno\u015bci przez Lightbend jest przestarza\u0142y i brakuje mu pe\u0142nej zgodno\u015bci z Java 17, aczkolwiek trzeba doceni\u0107 starania <a href=\"https:\/\/github.com\/mkurz\">Matthiasa Kurza<\/a>, kt\u00f3ry dba o jego utrzymanie <a href=\"https:\/\/opencollective.com\/playframework\">przy wsparciu Open Collective<\/a>. Co ciekawe, wersja ta zako\u0144czy r\u00f3wnie\u017c wsparcie dla Windows 7, wymagaj\u0105c aktualizacji do Windows 10 lub nowszego systemu operacyjnego. <\/p>\n","innerContent":["\n<p>Opr\u00f3cz Asystenta AI i innych wspomnianych funkcji, nadchodz\u0105ca wersja IntelliJ IDEA 2023.2 b\u0119dzie oznacza\u0107 wycofanie kilku wtyczek, takich jak Struts2, Play i Cloud Foundry - nie b\u0119d\u0105 one ju\u017c aktualizowane. Mnie jako\u015b \u0142ezka si\u0119 w oku zakr\u0119ci\u0142a je\u015bli chodzi o Play Framework, kt\u00f3ry kiedy\u015b uwa\u017cany by\u0142 za now\u0105 jako\u015b\u0107 w \u015bwiecie JVM, a teraz po oddaniu go spo\u0142eczno\u015bci przez Lightbend jest przestarza\u0142y i brakuje mu pe\u0142nej zgodno\u015bci z Java 17, aczkolwiek trzeba doceni\u0107 starania <a href=\"https:\/\/github.com\/mkurz\">Matthiasa Kurza<\/a>, kt\u00f3ry dba o jego utrzymanie <a href=\"https:\/\/opencollective.com\/playframework\">przy wsparciu Open Collective<\/a>. Co ciekawe, wersja ta zako\u0144czy r\u00f3wnie\u017c wsparcie dla Windows 7, wymagaj\u0105c aktualizacji do Windows 10 lub nowszego systemu operacyjnego. <\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/0JQi8hn.png\" alt=\"\"\/><figcaption class=\"wp-element-caption\">Zabawnie, Windows 8 nie zosta\u0142 nawet wspomniany, jakby ka\u017cdy chcia\u0142 zapomnie\u0107 o tej konkretnej wersji.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/0JQi8hn.png\" alt=\"\"\/><figcaption class=\"wp-element-caption\">Zabawnie, Windows 8 nie zosta\u0142 nawet wspomniany, jakby ka\u017cdy chcia\u0142 zapomnie\u0107 o tej konkretnej wersji.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">3. A mo\u017ce widzimy si\u0119 na KotlinConf '24?<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">3. A mo\u017ce widzimy si\u0119 na KotlinConf '24?<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>A na koniec, jak ju\u017c piszemy o produktach JetBrains, to ju\u017c totalna drobnica.<\/p>\n","innerContent":["\n<p>A na koniec, jak ju\u017c piszemy o produktach JetBrains, to ju\u017c totalna drobnica.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2023\/07\/kotlinconf-2024\/\">Zapowiedziano bowiem pi\u0105t\u0105 edycj\u0119 KotlinConf<\/a>, kt\u00f3ra odb\u0119dzie si\u0119 od 22 do 24 maja 2024 roku w Bella Center w Kopenhadze, w Danii.<\/p>\n","innerContent":["\n<p><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2023\/07\/kotlinconf-2024\/\">Zapowiedziano bowiem pi\u0105t\u0105 edycj\u0119 KotlinConf<\/a>, kt\u00f3ra odb\u0119dzie si\u0119 od 22 do 24 maja 2024 roku w Bella Center w Kopenhadze, w Danii.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>KotlinConf'24 rozpocznie si\u0119 dniem warsztat\u00f3w, a nast\u0119pnie przez dwie intensywne dni b\u0119dzie oferowa\u0107 sesje i mo\u017cliwo\u015bci nawi\u0105zywania kontakt\u00f3w i wiele innych atrakcyjnych aktywno\u015bci. Swoimi wra\u017ceniami z zesz\u0142orocznego Keynote dzieli\u0142em si\u0119 na wpisie <a href=\"https:\/\/vived.substack.com\/p\/tldw-opinionated-wrap-up-of-kotlinconf\">TLDW: Opinionated Wrap-up of KotlinConf 2023 Keynote<\/a>, wi\u0119c mo\u017cecie zobaczy\u0107 na ile tego typu impreza jest dla Was interesuj\u0105ca. Pisze o tym, bo radzi\u0142bym si\u0119 pospieszy\u0107 z zakupem - zar\u00f3wno bilety w promocji super wczesnej, jak i wczesnej ju\u017c zosta\u0142y wyprzedane, a nie min\u0105\u0142 jeszcze tydzie\u0144 od zapowiedzi.<\/p>\n","innerContent":["\n<p>KotlinConf'24 rozpocznie si\u0119 dniem warsztat\u00f3w, a nast\u0119pnie przez dwie intensywne dni b\u0119dzie oferowa\u0107 sesje i mo\u017cliwo\u015bci nawi\u0105zywania kontakt\u00f3w i wiele innych atrakcyjnych aktywno\u015bci. Swoimi wra\u017ceniami z zesz\u0142orocznego Keynote dzieli\u0142em si\u0119 na wpisie <a href=\"https:\/\/vived.substack.com\/p\/tldw-opinionated-wrap-up-of-kotlinconf\">TLDW: Opinionated Wrap-up of KotlinConf 2023 Keynote<\/a>, wi\u0119c mo\u017cecie zobaczy\u0107 na ile tego typu impreza jest dla Was interesuj\u0105ca. Pisze o tym, bo radzi\u0142bym si\u0119 pospieszy\u0107 z zakupem - zar\u00f3wno bilety w promocji super wczesnej, jak i wczesnej ju\u017c zosta\u0142y wyprzedane, a nie min\u0105\u0142 jeszcze tydzie\u0144 od zapowiedzi.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/vivedio_legoland_with_big_computer_monitor_and_old_fashioned_cu_0e674e1b-9907-475c-886e-956a0af48efe.png\" alt=\"\"\/><figcaption class=\"wp-element-caption\">Ja si\u0119 wybieram i zamierzam po\u0142\u0105czy\u0107 wyjazd z wizyt\u0105 w Legolandzie.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/vivedio_legoland_with_big_computer_monitor_and_old_fashioned_cu_0e674e1b-9907-475c-886e-956a0af48efe.png\" alt=\"\"\/><figcaption class=\"wp-element-caption\">Ja si\u0119 wybieram i zamierzam po\u0142\u0105czy\u0107 wyjazd z wizyt\u0105 w Legolandzie.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>A, i wzmianka jest totalnie bezinteresowna, nie mam z niej \u017cadnej affiliacji - ale je\u015bli czyta to kto\u015b, kto mo\u017ce mnie pchn\u0105\u0107 w kolejce AI Assistanta, to akurat by\u0142bym wdzi\u0119czny \ud83d\ude04<\/p>\n","innerContent":["\n<p>A, i wzmianka jest totalnie bezinteresowna, nie mam z niej \u017cadnej affiliacji - ale je\u015bli czyta to kto\u015b, kto mo\u017ce mnie pchn\u0105\u0107 w kolejce AI Assistanta, to akurat by\u0142bym wdzi\u0119czny \ud83d\ude04<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>A jak ju\u017c w temacie Kotlina, to mam dla Was ostatni\u0105 ma\u0142\u0105 informacje: Aby rozwi\u0105za\u0107 zamieszanie i niesp\u00f3jno\u015b\u0107 w nazewnictwie, nazwa produktu \u201eKotlin Multiplatform Mobile\u201d (KMM) jest wycofywana. Od tej pory \u201eKotlin Multiplatform\u201d (KMP) to oficjalna nazwa kotlinowych rozwi\u0105za\u0144 s\u0142u\u017c\u0105cych do wsp\u00f3\u0142dzielenia kodu na r\u00f3\u017cnych platformach, niezale\u017cnie od konkretnej kombinacji platform docelowych. Szczeg\u00f3\u0142y i kontekst tej zmiany znajdziecie w artykule <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2023\/07\/update-on-the-name-of-kotlin-multiplatform\/\">Update on the Name of Kotlin Multiplatform<\/a>.<\/p>\n","innerContent":["\n<p>A jak ju\u017c w temacie Kotlina, to mam dla Was ostatni\u0105 ma\u0142\u0105 informacje: Aby rozwi\u0105za\u0107 zamieszanie i niesp\u00f3jno\u015b\u0107 w nazewnictwie, nazwa produktu \u201eKotlin Multiplatform Mobile\u201d (KMM) jest wycofywana. Od tej pory \u201eKotlin Multiplatform\u201d (KMP) to oficjalna nazwa kotlinowych rozwi\u0105za\u0144 s\u0142u\u017c\u0105cych do wsp\u00f3\u0142dzielenia kodu na r\u00f3\u017cnych platformach, niezale\u017cnie od konkretnej kombinacji platform docelowych. Szczeg\u00f3\u0142y i kontekst tej zmiany znajdziecie w artykule <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2023\/07\/update-on-the-name-of-kotlin-multiplatform\/\">Update on the Name of Kotlin Multiplatform<\/a>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/separator","attrs":[],"innerBlocks":[],"innerHTML":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","innerContent":["\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>PS: Odpowied\u017a na pytanie zadane w tek\u015bcie: <strong>Expensive computation<\/strong> trwa\u0142o <a href=\"https:\/\/www.scientificamerican.com\/article\/for-math-fans-a-hitchhikers-guide-to-the-number-42\/\">7.5 miliona lat<\/a> \ud83d\udc01.<\/p>\n","innerContent":["\n<p>PS: Odpowied\u017a na pytanie zadane w tek\u015bcie: <strong>Expensive computation<\/strong> trwa\u0142o <a href=\"https:\/\/www.scientificamerican.com\/article\/for-math-fans-a-hitchhikers-guide-to-the-number-42\/\">7.5 miliona lat<\/a> \ud83d\udc01.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16546,"width":768,"height":317,"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\/08\/g5l98l-1-1024x422.gif\" alt=\"\" class=\"wp-image-16546\" width=\"768\" height=\"317\"\/><figcaption class=\"wp-element-caption\">Ja, przygotowuj\u0105c sample do dzisiejszej edycji. Jestem z nich bardzo dumny i sprawi\u0142y mi mas\u0119 rado\u015bci \ud83d\ude04<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/08\/g5l98l-1-1024x422.gif\" alt=\"\" class=\"wp-image-16546\" width=\"768\" height=\"317\"\/><figcaption class=\"wp-element-caption\">Ja, przygotowuj\u0105c sample do dzisiejszej edycji. Jestem z nich bardzo dumny i sprawi\u0142y mi mas\u0119 rado\u015bci \ud83d\ude04<\/figcaption><\/figure>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/16538","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=16538"}],"version-history":[{"count":5,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/16538\/revisions"}],"predecessor-version":[{"id":16555,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/16538\/revisions\/16555"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/16552"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=16538"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=16538"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=16538"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}