Kod

JVM: Czym jest i czym różni się od .NET — wyjaśnia programista Java

JVM: Czym jest i czym różni się od .NET — wyjaśnia programista Java

Dowiedz się: Zawód programisty Java

Dowiedz się więcej

Iwan Ugliański jest znaną postacią w swojej dziedzinie, posiadającą bogate doświadczenie i wiedzę. Jego działalność zawodowa obejmuje wiele aspektów, w tym wiedzę specjalistyczną w określonych obszarach, co czyni go cenionym specjalistą. Ugliański aktywnie dzieli się swoją wiedzą i doświadczeniem praktycznym, pomagając innym w rozwoju i osiąganiu sukcesów. Jego praca i osiągnięcia stanowią inspirację dla wielu osób dążących do rozwoju zawodowego. Ivan Uglyansky nadal wnosi swój wkład w swoją dziedzinę, pozostając cenionym i poszukiwanym ekspertem.

Ten ekspert posiada głęboką wiedzę i doświadczenie, co pozwala mu skutecznie rozwiązywać problemy i dostarczać wysokiej jakości rozwiązania. Jego działalność zawodowa obejmuje wiele aspektów, w tym analizę, planowanie strategiczne i wdrażanie innowacyjnych podejść. Stale monitoruje najnowsze trendy i technologie, co pozwala mu pozostać w czołówce w swojej branży. Dzięki wysokim kompetencjom i determinacji jest w stanie oferować swoim klientom optymalne ścieżki do sukcesu i zwiększenia efektywności.

Jest inżynierem JVM z doświadczeniem w Excelsior@Huawei, specjalizującym się w rozwoju maszyn wirtualnych Java, kompilatorów i nowych języków programowania. Jest członkiem-założycielem i aktywnym liderem Java User Group Nsk (JUGNsk) oraz członkiem komitetu programowego konferencji SnowOne.

Linki odgrywają kluczową rolę w strukturze treści internetowych i SEO. Zapewniają nawigację w witrynie, pomagają użytkownikom znaleźć potrzebne informacje i poprawiają indeksowanie stron przez wyszukiwarki. Linki wewnętrzne łączą różne strony w witrynie, pomagając rozłożyć ciężar stron i poprawić ich widoczność w wynikach wyszukiwania. Linki zewnętrzne kierujące do wiarygodnych źródeł mogą zwiększyć wiarygodność treści i poprawić ich pozycję w rankingu. Optymalizacja linków obejmuje używanie słów kluczowych w tekście kotwicy, tworzenie czytelnych adresów URL i regularne monitorowanie uszkodzonych linków. Prawidłowe użycie linków nie tylko poprawia komfort użytkowania, ale także pomaga witrynie uzyskać lepszą pozycję w wynikach wyszukiwania.

Rozwijam się na JVM od ponad 10 lat. Swoją karierę rozpocząłem w Excelsior, firmie z Nowosybirska, gdzie pracowałem nad własną implementacją wirtualnej maszyny Java, Excelsior JET. Nasz zespół dołączył później do Huawei, ale jego skład pozostał niezmieniony. Nieustannie rozwijamy i ulepszamy technologie Java i JVM, zapewniając naszym klientom wydajne i niezawodne rozwiązania.

Czym jest JVM i jak uchroniła programistów przed zawodowym „wypaleniem”

Około 25 lat temu, przed pojawieniem się Javy, wiele aplikacji tworzono w C i C++. Języki te mają jednak istotną wadę: programiści muszą rozważyć, na jakim systemie operacyjnym i architekturze procesora będzie działał ich kod. Na przykład program napisany dla systemu Linux najprawdopodobniej nie będzie działał w systemach Windows ani MacOS. Zmuszało to programistów do korzystania z dyrektyw kompilacji warunkowej lub tworzenia osobnych wersji programów dla każdego systemu operacyjnego. Java, w przeciwieństwie do C i C++, oferuje niezależność od platformy, co znacznie upraszcza tworzenie i zwiększa kompatybilność aplikacji na różnych urządzeniach.

Największe trudności pojawiały się podczas pracy z aplikacjami korzystającymi z graficznego interfejsu użytkownika (GUI). Kod komponentów graficznych znacznie różnił się w zależności od systemu operacyjnego. Wynika to z niskopoziomowej natury języków C i C++, wymagającej od programistów uwzględnienia architektury procesora i specyfiki systemu operacyjnego. W rezultacie obsługa wielu platform w tym kontekście nie wchodzi w grę.

W latach 60. XX wieku inżynierowie wpadli na pomysł tworzenia programów, które nie były powiązane z konkretnym sprzętem, lecz były projektowane dla abstrakcyjnego „programu wykonawczego”. Programy Java są projektowane właśnie w tym celu – są tworzone dla maszyny wirtualnej znanej jako Java Virtual Machine (JVM). Programiści Java nie muszą martwić się o platformę, na której będzie uruchamiany ich kod, ponieważ JVM akceptuje i interpretuje kod bajtowy, nie zdając sobie sprawy, że wykonuje instrukcje Java. Zapewnia to wysoki stopień kompatybilności i przenośności aplikacji, dzięki czemu Java jest popularnym wyborem do tworzenia oprogramowania w różnych dziedzinach.

Unikalną cechą Javy było to, że programiści mogli tworzyć programy dla systemu Windows, które działały w systemie macOS, z minimalnymi modyfikacjami. 25 lat temu wydawało się to cudem, ale dziś jest to uznawane za naturalny proces. Java zapewniła obsługę wielu platform, co znacznie uprościło rozwój i poszerzyło grono odbiorców oprogramowania.

Kadr: serial dokumentalny „Starożytni kosmici”

Obsługę wielu platform w Javie zapewnia Wyraźny podział między poziomami języka a jego implementacją. Pozwala to programistom tworzyć aplikacje działające w różnych systemach operacyjnych bez konieczności modyfikowania kodu źródłowego. Dzięki tej architekturze Java stała się popularnym wyborem do tworzenia wielofunkcyjnych i wszechstronnych rozwiązań programistycznych, które mogą efektywnie funkcjonować w różnych środowiskach.

Poziom języka. Programiści piszą kod w języku Java, którego składnia i semantyka są szczegółowo opisane w specyfikacji języka Java. Po napisaniu kodu źródłowego jest on kompilowany do kodu bajtowego Java za pomocą specjalnego narzędzia o nazwie javac. Podczas kompilacji sprawdzana jest składnia. W przypadku wykrycia błędów składniowych programista otrzymuje odpowiedni komunikat o błędzie od javac.

Ważne aspekty, na które należy zwrócić uwagę, to słowa kluczowe, meta tagi, struktura treści i jej unikatowość. Optymalizacja tekstu pod kątem SEO wymaga starannej pracy z nagłówkami, aby upewnić się, że są one informacyjne i zawierają główne słowa kluczowe. Należy również wziąć pod uwagę długość tekstu – powinien być wystarczająco długi, aby omówić temat, ale jednocześnie czytelny.

Pamiętaj o używaniu linków wewnętrznych i zewnętrznych, aby zwiększyć autorytet strony i usprawnić nawigację. Obrazy powinny mieć odpowiednie atrybuty alt, co poprawia SEO i sprawia, że ​​treść jest dostępna dla osób niepełnosprawnych. Nie zapominaj o optymalizacji pod kątem urządzeń mobilnych, ponieważ coraz więcej użytkowników korzysta z urządzeń mobilnych do łączenia się z internetem.

Kluczem jest tworzenie wysokiej jakości treści, które są przydatne dla użytkowników i odpowiadają na ich pytania. Regularna aktualizacja informacji może również poprawić pozycję w wynikach wyszukiwania.

  • Na tym etapie nie ma nic specyficznego dla platformy; cały kod Java (taki jak kod bajtowy Java) jest uniwersalny.
  • Kod bajtowy Java to język przeznaczony dla maszyn, a nie dla ludzi. Przeciętny programista nie musi go czytać.

Poziom implementacji kodu bajtowego Java rozpoczyna się od jego przeniesienia do maszyny wirtualnej Java (JVM). Maszyna wirtualna odpowiada za wykonywanie tego kodu bajtowego, który jest szczegółowo opisany w specyfikacji Java Virtual Machine. JVM obsługuje wszystkie aspekty związane z konkretnym systemem operacyjnym lub architekturą procesora, bez ingerencji w kod źródłowy Java. Uwalnia to programistów od złożoności związanych z różnicami w systemie operacyjnym lub sprzęcie. Wystarczy wybrać odpowiednią wersję JVM, na przykład dla Linuksa x64. Wszystkie niuanse specyficzne dla systemu operacyjnego i architektury są obsługiwane przez zespół programistów JVM, co upraszcza proces tworzenia oprogramowania Java.

Język programowania Java i maszyna wirtualna Java (JVM) ewoluują równolegle, co pozwala im na wzajemne wsparcie. Nowe funkcje języka często wymagają aktualizacji i ulepszeń w obrębie JVM. Jednocześnie różne implementacje JVM ewoluują niezależnie, wprowadzając bardziej wydajne algorytmy zbierania śmieci i optymalizacje kodu. Ta interakcja między językiem a maszyną wirtualną zapewnia stabilność i wydajność aplikacji Java, umożliwiając programistom korzystanie z nowoczesnych technologii i podejść w swoich projektach.

Rozdzielenie języka programowania Java i jego implementacji na maszynie wirtualnej jest ważne dla programistów. Pozwala im to nie ograniczać się tylko do języka Java, ponieważ maszyna wirtualna nie rozróżnia, czy kod bajtowy pochodzi z Javy, czy z innego języka. Dzięki temu programiści mogą używać dowolnego języka, który kompiluje się do kodu bajtowego, co otwiera szeroki wachlarz możliwości. Obsługiwanych jest wiele języków, w tym Kotlin, Clojure, Groovy i inne. Na przykład kod Kotlina jest kompilowany za pomocą narzędzia kotlinc do plików klas, które są następnie wykonywane na maszynie wirtualnej Java (JVM). Takie podejście zapewnia elastyczność i rozszerzalność w tworzeniu oprogramowania, pozwalając programistom wybrać język najbardziej odpowiedni do rozwiązywania konkretnych problemów.

W latach 60. inżynierowie zaproponowali koncepcję tworzenia oprogramowania, które nie jest przeznaczone dla konkretnego sprzętu, ale dla abstrakcyjnego „executora”. Programy Java są pisane właśnie dla takiego „runnera” – maszyny wirtualnej znanej jako Java Virtual Machine (JVM). Dzięki temu programiści Java mają pewność co do platformy, na której będzie uruchamiany ich kod. Jednocześnie maszyna wirtualna nie ma pojęcia, że ​​przetwarza instrukcje Java, ponieważ działa z kodem bajtowym. Takie podejście zapewnia wysoki stopień przenośności i kompatybilności oprogramowania, co czyni Javę jednym z najpopularniejszych języków programowania na świecie.

Jak JDK i Open JDK są ze sobą powiązane

Java Development Kit (JDK) to zestaw narzędzi przeznaczonych do tworzenia aplikacji w języku Java. JDK zawiera kluczowe komponenty, które umożliwiają tworzenie, kompilację i wykonywanie programów Java. Główne elementy JDK to kompilator Java, narzędzia do debugowania i biblioteki klas niezbędne do tworzenia funkcjonalnych aplikacji. Korzystanie z JDK jest koniecznością dla programistów, którzy chcą tworzyć wydajne i produktywne aplikacje Java.

  • Javac. To kompilator, który konwertuje kod źródłowy Java do plików klas lub formatu jar.
  • JVM. Maszyna wirtualna wykonująca kod bajtowy.
  • Biblioteka standardowa. Zestaw modułów, klas, obiektów i funkcji dostępnych w danym języku.
  • Dokumentacja. Zawiera informacje referencyjne o narzędziach w danej wersji JDK.

Gdy wydana zostaje nowa wersja języka programowania, wszystkie powiązane komponenty otrzymują aktualizacje.

W przypadku korzystania ze standardowej maszyny wirtualnej Java (JVM), takiej jak HotSpot, proces uruchamiania aplikacji Java rozpoczyna się od kompilacji kodu źródłowego za pomocą javac. Ten krok konwertuje kod do plików klas lub plików jar, które następnie można dystrybuować i używać jako aplikacji. Zatem głównym krokiem w tworzeniu aplikacji Java jest stworzenie kompilowalnego kodu, który umożliwia efektywne zarządzanie oprogramowaniem i jego wdrażanie.

Aby pomyślnie uruchomić aplikację, host musi mieć zainstalowaną maszynę wirtualną Java. Użytkownik musi wprowadzić polecenie java -jar w wierszu poleceń. Program zostanie uruchomiony. Upewnij się, że host ma zainstalowaną najnowszą wersję Javy, aby uniknąć potencjalnych problemów ze zgodnością i zapewnić stabilne działanie aplikacji.

Nasza maszyna wirtualna zmieniła proces uruchamiania aplikacji. Wstępnie skompilowaliśmy pliki klas do pojedynczego pliku wykonywalnego, umożliwiając uruchomienie aplikacji na komputerze użytkownika bez konieczności używania wirtualnej maszyny Java (JVM). Sama wirtualna maszyna Java nie zniknęła jednak; wszystkie jej komponenty zostały zintegrowane w pojedynczy plik wykonywalny. To rozwiązanie upraszcza korzystanie z aplikacji, zapewniając jej działanie w środowiskach, w których Java nie jest zainstalowana.

Specyfikacja wirtualnej maszyny Java (JVM) zawiera minimalne wymagania implementacyjne, pozostawiając programistom znaczną swobodę w podejściu. Opisuje ona pożądany rezultat, ale nie precyzuje, jak dokładnie go zaimplementować. Jedną z kluczowych funkcji wirtualnej maszyny Java jest zarządzanie pamięcią, które jest realizowane za pomocą mechanizmu odśmiecacza pamięci (ang. garbage collector). Specyfikacja nie ujawnia jednak szczegółów jego działania. Stwarza to możliwości różnych implementacji odśmiecacza pamięci, co pozwala na optymalizację wydajności w zależności od konkretnych warunków i zadań.

Specyfikacja wirtualnej maszyny Java (JVM) została zaprojektowana w celu umożliwienia tworzenia różnych implementacji, które mogą różnić się charakterystyką, ale nadal są w pełni zgodne ze specyfikacją. Otwiera to możliwości dla różnorodności i innowacji w świecie maszyn wirtualnych. Różnice w implementacjach JVM tworzą przewagę konkurencyjną: niektóre maszyny wirtualne oferują wydajniejsze algorytmy zbierania śmieci, inne zapewniają szybkie uruchamianie aplikacji, a niektóre oferują zaawansowane optymalizacje na poziomie kompilacji. W ten sposób różnorodność implementacji JVM przyczynia się do rozwoju technologii i poprawy wydajności oprogramowania.

Pierwsza maszyna wirtualna Java (JVM), podobnie jak język programowania Java, została opracowana przez Sun Microsystems. Po opublikowaniu specyfikacji Javy, Oracle rozpoczęło prace nad własną wersją JVM o nazwie JRockit, a IBM stworzyło OpenJ9. W 2000 roku uruchomiliśmy naszą maszynę wirtualną Excelsior JET, oferującą unikalne możliwości dla programistów Java.

Początkowo wszystkie maszyny wirtualne Java (JVM) miały zamknięty kod źródłowy. Jednak w 2006 roku Sun Microsystems udostępnił na zasadzie open source swoją maszynę wirtualną HotSpot JVM, kompilator javac i standardową bibliotekę Java. Stało się to podstawą projektu OpenJDK, całkowicie otwartej implementacji Java Development Kit (JDK). Firma Sun została później przejęta przez Oracle, ale projekt OpenJDK nadal istniał i pozostaje kluczową platformą open source dla rozwoju Javy i JVM. OpenJDK zapewnia dostęp do najnowszych aktualizacji i ulepszeń, co czyni go niezbędnym narzędziem dla programistów chcących wykorzystać nowoczesne technologie Java.

OpenJDK to referencyjna implementacja Javy, punkt odniesienia dla programistów JDK. Projekt ten jest licencjonowany na podstawie licencji GPL 2 z wyjątkiem Classpath, co pozwala każdej firmie lub programistom posiadającym niezbędne umiejętności na tworzenie własnych implementacji JVM w oparciu o OpenJDK. Należy zauważyć, że zgodnie z warunkami licencji takie implementacje będą również otwarte, co promuje rozwój i innowacje w ekosystemie Java.

Istnieją implementacje JVM, które nie są związane z OpenJDK. Sun Microsystems i Oracle nie były jedynymi firmami rozwijającymi JVM. Przykładem jest IBM J9, który również udostępnił kod źródłowy i obecnie nazywa się OpenJ9. Platforma ta oferuje alternatywne rozwiązania do uruchamiania aplikacji Java i daje programistom możliwość korzystania z różnych narzędzi i technologii. Otwarty charakter OpenJ9 sprzyja rozwojowi społeczności i poprawia wydajność JVM w różnych zastosowaniach.

Niektóre firmy oferują maszyny wirtualne na sprzedaż. Na przykład Azul oferuje darmową kompilację Zulu i komercyjną wersję Azul Zing. Azul Zing zawiera unikalny moduł do zbierania śmieci C4, który zapewnia minimalny czas przestoju, wyprzedzając trendy w tej dziedzinie. Azul Zing implementuje również technologię ReadyNow!, która zapamiętuje wszystkie optymalizacje kodu i stosuje je podczas uruchamiania JVM, pomagając osiągnąć maksymalną wydajność. Excelsior JET był komercyjnym rozwiązaniem o zamkniętym kodzie źródłowym, które zapewniało szybki czas uruchamiania aplikacji, niskie zużycie pamięci i wysoką wydajność szczytową w różnych scenariuszach. Korzyści te uzyskano dzięki kompilacji statycznej, w przeciwieństwie do kompilacji dynamicznej w HotSpot. Kompilacja statyczna umożliwiała tworzenie zoptymalizowanych plików wykonywalnych, co jest szczególnie ważne w przypadku aplikacji wymagających wysokiej wydajności i efektywności. Obecnie wielu użytkowników preferuje darmowe kompilacje oparte na OpenJDK. Dostępne są zarówno standardowe kompilacje OpenJDK od Oracle, jak i alternatywne wersje opracowane przez inne firmy i deweloperów związanych z OpenJDK. Często kompilacje te są publikowane przez kontrybutorów spoza Oracle. Ta różnorodność pozwala deweloperom wybrać rozwiązania najbardziej odpowiednie dla ich projektów, biorąc pod uwagę wymagania dotyczące wydajności i kompatybilności. Alternatywne kompilacje mogą zawierać dodatkowe funkcje, których nie ma w standardowych wersjach Oracle. Niektóre z tych kompilacji mogą podlegać dodatkowej certyfikacji, na przykład w celu integracji z CryptoPro. Wszystkie kompilacje innych firm przechodzą standardowe testy, co zapewnia stabilne działanie programów. Korzystanie z tych kompilacji jest całkowicie bezpieczne i bezpłatne, co czyni je atrakcyjnym wyborem dla deweloperów i użytkowników. Niektóre firmy nie tylko publikują swoje kompilacje, ale oferują również płatne wsparcie użytkownikom. Na przykład, jeśli wystąpi problem z maszyną wirtualną, a aplikacja zacznie działać wolno lub nawet zgłaszać błędy, może to być spowodowane błędami w JVM. W takich przypadkach inżynierowie firmy są gotowi szybko rozwiązać problem i zaproponować rozwiązanie. Pozwala to użytkownikom zminimalizować przestoje i poprawić wydajność aplikacji, zapewniając jednocześnie niezawodne wsparcie techniczne, które pozwoli utrzymać ich sprawne działanie.

Istnieje wiele opcji dla maszyn wirtualnych i ich kompilacji, których omówienie w tym artykule jest niemożliwe. Duże firmy, takie jak Oracle, Red Hat, Azul, IBM, BellSoft, Amazon i Microsoft, oferują własne kompilacje maszyn wirtualnych. Społeczność ekspertów Javy przygotowała przydatny dokument, który szczegółowo analizuje różne opcje i wyjaśnia sytuację związaną z różnorodnością maszyn wirtualnych Java (JVM) i ich kompilacji. Dokument ten nosi tytuł „Java Is Still Free” i jest gorąco polecany do przeczytania wszystkim zainteresowanym.

Jak i dlaczego inne języki przechodzą na JVM

Java to nie tylko język programowania, ale także cała filozofia rozwoju. Filozofia ta okazała się tak atrakcyjna, że ​​inne języki programowania zaczęły adaptować się do działania na platformie JVM. Doskonałym przykładem są Jython i JRuby, które pozwalają programistom wykorzystać potencjał Javy ze składnią i funkcjami innych języków. Rozszerza to funkcjonalność i możliwości programowania, czyniąc Javę jedną z najbardziej wszechstronnych platform w świecie programistycznym.

Głównym powodem tworzenia takich rozwiązań jest poprawa wydajności. W ciągu ostatnich 25 lat powstały wysoce wydajne maszyny wirtualne Java (JVM). Dzięki tym udoskonaleniom można znacznie poprawić wydajność aplikacji napisanych w Pythonie i Ruby. Optymalizacja wykonywania kodu w tych językach programowania otwiera nowe możliwości tworzenia szybszych i wydajniejszych rozwiązań programistycznych.

Używanie maszyny wirtualnej Java (JVM) zapewnia niezawodną interakcję z ekosystemem Java. Uruchamianie kodu na JVM zapewnia lepszą integrację z innymi modułami działającymi w tym środowisku. Otwiera to możliwości korzystania z różnych bibliotek Java, co znacznie rozszerza funkcjonalność i upraszcza tworzenie aplikacji. Dzięki temu programiści mogą skutecznie wykorzystać zalety ekosystemu Java do tworzenia wydajnych i skalowalnych rozwiązań.

Kotlin ma swoją własną, unikalną historię. Podczas jego tworzenia podjęto decyzję o skompilowaniu języka do kodu bajtowego Javy i uruchomieniu go na maszynie wirtualnej Java (JVM). Oznaczało to, że głównym zadaniem było opracowanie wysokiej jakości translatora znanego jako kotlinc, który konwertuje kod źródłowy .kt na pliki klas. Komponenty niskiego poziomu, takie jak moduły odśmiecania pamięci i interakcja z systemem operacyjnym, zostały delegowane do istniejącego środowiska JVM, co znacznie uprościło implementację języka i pozwoliło skupić się na jego funkcjach wysokiego poziomu.

Twórcy Kotlina niedawno wprowadzili Kotlin Native, technologię umożliwiającą kompilację kodu Kotlina do kodu natywnego bez użycia maszyny wirtualnej Java (JVM). Technologia ta zawiera własne komponenty niskiego poziomu, takie jak menedżer pamięci, który zapewnia bardziej efektywne zarządzanie zasobami. Kotlin Native otwiera nowe możliwości dla programistów, umożliwiając im tworzenie aplikacji działających na wielu platformach, w tym iOS i Android, bez konieczności dostosowywania kodu do każdej z nich. Korzystanie z Kotlin Native upraszcza tworzenie aplikacji wieloplatformowych i poprawia wydajność poprzez bezpośrednią interakcję z systemowymi interfejsami API.

Chociaż przeniesienie dowolnego języka programowania na maszynę wirtualną Java (JVM) wydaje się na pierwszy rzut oka proste, w praktyce jest to znacznie bardziej skomplikowane. Stworzenie translatora konwertującego kod do plików klas wymaga dogłębnej znajomości języka i jego funkcjonalności. Ważne jest nie tylko prawidłowe odzwierciedlenie funkcji języka w kodzie bajtowym Java, ale także zapewnienie wysokiej wydajności, co stanowi poważne wyzwanie. JRuby jest przykładem ilustrującym wyzwania związane z wdrażaniem tego podejścia.

Charles Nutter regularnie dzieli się swoim doświadczeniem w zakresie obsługi różnych funkcji Ruby w projekcie JRuby, omawiając pojawiające się wyzwania. Wraz ze wzrostem różnic między oryginalnym językiem Ruby a platformą Java, proces tłumaczenia staje się coraz bardziej złożony. Jednak, jak pokazuje praktyka, wszystko jest możliwe, a JRuby jest tego wyraźnym potwierdzeniem.

Jakich konkurentów ma JVM?

Platforma .NET jest jednym z najbardziej znanych konkurentów maszyny wirtualnej Java, oferując maszynę wirtualną do wykonywania programów w języku C#. Zapewnia wysoką wydajność i obsługę wielu platform, co czyni ją atrakcyjnym wyborem dla programistów. Porównanie możliwości maszyny wirtualnej Java i platformy .NET pomaga uwypuklić zalety i wady każdej technologii, co może być przydatne przy wyborze optymalnego rozwiązania do tworzenia oprogramowania.

Na początku XXI wieku Microsoft opracował swoją maszynę wirtualną Java, znaną jako Microsoft J++. Firma nie zastosowała się jednak do specyfikacji języka, co doprowadziło do pozwu ze strony Sun Microsystems. W rezultacie Microsoft przegrał wszystkie procesy i utracił prawo do stworzenia maszyny wirtualnej dla Javy. To wydarzenie jest uważane za jeden z powodów powstania języka programowania C#, który powstał jako alternatywa dla Javy i stał się ważnym narzędziem w ekosystemie Microsoft.

Java i C# zostały zaprojektowane do rozwiązywania podobnych problemów i mają szereg wspólnych zalet. Oba języki oferują silne typowanie, automatyczne odśmiecanie i wysoki poziom bezpieczeństwa, co czyni je atrakcyjnymi dla programistów. Te zarządzane języki są szeroko stosowane w różnych obszarach programowania, zapewniając niezawodność i wydajność w tworzeniu oprogramowania.

Wcześniej istniała znacząca różnica między platformami: Java zapewniała obsługę wielu platform, podczas gdy .NET i C# działały wyłącznie w systemie Windows. Jednak wraz z pojawieniem się .NET Core, C# zyskał możliwość działania na różnych systemach operacyjnych, czyniąc go wieloplatformowym. Ta transformacja otworzyła nowe horyzonty dla programistów, umożliwiając używanie C# do tworzenia aplikacji w systemach Windows, Linux i macOS, co znacznie poszerzyło grono odbiorców i możliwości wykorzystania tego języka.

Java i C# to dwa popularne języki programowania, każdy z własnymi funkcjami i zaletami. Jednak C# rozwija się dynamiczniej, oferując programistom nowe funkcje i możliwości, które w Javie czasami pojawiają się znacznie później lub w ogóle ich nie ma. W rezultacie C# wydaje się atrakcyjniejszą opcją dla nowoczesnego rozwoju. To sprawia, że ​​jest chętnie wybierany przez wiele projektów, zwłaszcza tych wymagających innowacyjnych rozwiązań i nowoczesnych podejść programistycznych.

Java oferuje potężną implementację i wysoce zoptymalizowane maszyny wirtualne. Jest to wynik długotrwałej rywalizacji między programistami maszyn wirtualnych, która trwa od ponad 20 lat. Dostawcy nieustannie prześcigają się w tworzeniu lepszych optymalizacji, bardziej wydajnych algorytmów zbierania śmieci i szybszego uruchamiania aplikacji. W wyniku wielu z tych ulepszeń implementacja Javy przewyższa C# pod wieloma względami. Niektóre funkcje, które były obecne w JVM od dawna, dopiero zaczynają być implementowane na platformie .NET.

Istnieją inne języki programowania, które mogą konkurować z Javą, ale różnią się one znacząco charakterem. Na przykład Python, który niedawno zajął pierwsze miejsce w rankingu TIOBE, jest aktywnie wykorzystywany w takich obszarach jak analiza danych, sztuczna inteligencja, uczenie maszynowe i automatyzacja zadań. Warto jednak zauważyć, że dynamiczne typowanie w Pythonie może sprawiać trudności przy zarządzaniu dużymi bazami kodu, co ogranicza jego zastosowanie w projektach na dużą skalę.

JavaScript pozostaje jednym z najpopularniejszych języków programowania, ale jego związek z Javą nie jest tak znaczący, ponieważ Java nie jest obecnie wykorzystywana w programowaniu front-end. W przeszłości istniały plany wykorzystania Javy w tym obszarze, na przykład za pośrednictwem starszych technologii apletów Javy, ale nie znalazły one powszechnego zastosowania. JavaScript z kolei stał się głównym narzędziem do tworzenia interaktywnych aplikacji internetowych, co czyni go niezbędnym we współczesnym programowaniu stron internetowych.

Gdzie Java jest dobra, a gdzie nie

Java jest aktywnie wykorzystywana w programowaniu back-end, obsługując różnorodne aplikacje po stronie serwera. Głównym konkurentem Javy jest C#, ale Java utrzymuje znaczącą przewagę dzięki swojej wieloplatformowości. Chociaż to stwierdzenie traci na znaczeniu, ponieważ C# również ewoluuje w tym kierunku. Należy zauważyć, że Java ma priorytet czasowy, ponieważ została wydana dziesięć lat przed C#. Pozwoliło to jej zdobyć zaufanie programistów i stworzyć obszerne bazy kodu.

Java jest lepsza od „szwajcarskiego noża” C++, ponieważ oferuje większą wygodę i bezpieczeństwo. Oznacza to, że programiści mogą uniknąć typowych pułapek, takich jak nieprawidłowe zarządzanie pamięcią i błędy segmentacji, które mogą wystąpić nieoczekiwanie. W przypadku codziennych zadań po stronie serwera, szybkość tworzenia w Javie i C# znacznie przewyższa tę w C++. Java pozwala skupić się na rozwiązywaniu problemów, a nie na szczegółach technicznych, co czyni ją idealnym wyborem dla wielu projektów we współczesnym programowaniu.

Java nie jest optymalnym wyborem dla aplikacji wymagających wysokiej wydajności i ściśle określonych czasów reakcji. Jednak niektórzy programiści używają Javy do tworzenia takich programów, jeśli są gotowi zaakceptować niewielkie opóźnienia mierzone w mikrosekundach. W takich przypadkach zalety związane z szybkością i niezawodnością tworzenia mogą przeważać nad wadami. Nie zaleca się jednak używania Javy do tworzenia oprogramowania dla rozruszników serca, gdzie dokładność i stabilność mają kluczowe znaczenie.

Kadr: film „Spider-Man 2”

Aplikacje handlowe są coraz częściej tworzone w Javie. W handlu szybka reakcja jest szczególnie ważna, aby uniknąć strat spowodowanych gwałtownymi wahaniami cen akcji, na przykład Tesli. Jednak w praktyce niezawodność okazuje się ważniejsza niż szybkość. Lepiej mieć powolną, ale stabilną platformę transakcyjną niż tworzyć szybką aplikację w C++, która może zawiesić się po kilku minutach działania. Java zapewnia wysoki poziom bezpieczeństwa, co czyni ją atrakcyjnym wyborem do tworzenia aplikacji transakcyjnych.

Co jest nie tak z JVM

Wraz z rozwojem każdego języka programowania, w tym Javy, pojawiają się kontrowersyjne kwestie i wątpliwe decyzje. Dotyczy to zarówno specyfikacji samego języka, jak i działania maszyny wirtualnej Java (JVM). Analiza takich subtelności może pomóc programistom lepiej zrozumieć ograniczenia i możliwości Javy, co z kolei prowadzi do tworzenia wydajniejszego i zoptymalizowanego kodu. Zrozumienie tych aspektów pomaga również uniknąć typowych błędów i poprawić jakość oprogramowania.

Jednym z gorących tematów w świecie Javy jest projekt Jigsaw i implementacja systemu modułów, wprowadzonego w dziewiątej wersji języka. Twórcy Javy pracowali długo i intensywnie nad opracowaniem systemu, który umożliwia podział programów Java na oddzielne komponenty logiczne, zwane modułami. Tworzy to nowy poziom abstrakcji, uzupełniający istniejące pakiety w Javie. System modułów upraszcza zarządzanie zależnościami i poprawia organizację kodu, co przyczynia się do bardziej efektywnego tworzenia i utrzymywania aplikacji Java. System modułów zapewnia również większe bezpieczeństwo, umożliwiając ograniczenie dostępu do komponentów wewnętrznych i poprawiając hermetyzację. Wprowadzenie projektu Jigsaw było ważnym krokiem w ewolucji Javy, otwierając nowe możliwości dla programistów.

Na jego rozwój poświęcono znaczną ilość czasu, ponieważ konieczne było zapewnienie wsparcia na poziomie języka, maszyny wirtualnej i innych komponentów JDK. Przez długi czas system nie był uwzględniany w wersji finalnej, a kiedy w końcu został wydany, okazał się mało popularny wśród użytkowników.

Proces wprowadzania nowych funkcji i specyfikacji do języka Java odbywa się w ramach Java Community Process (JCP). Ta specjalna rada analizuje propozycje, znane jako Java Specification Requests (JSR), i podejmuje decyzje w drodze głosowania. JCP reprezentuje interesy różnych interesariuszy społeczności Java: dużych firm, przedstawicieli grup użytkowników i indywidualnych programistów. W ten sposób proces rozwoju i ulepszania języka Java zapewnia uwzględnienie opinii wszystkich interesariuszy, co sprzyja jego rozwojowi i adaptacji do współczesnych wymagań.

Pomysł wprowadzenia nowego systemu modułów do Javy był kilkakrotnie odrzucany przez JCP, co jest rzadkością. Jednak po znaczących poprawkach i złagodzeniu, system ten został ostatecznie zintegrowany z językiem. Niemniej jednak, kilka lat po jego wprowadzeniu, można zauważyć, że większość programistów Javy nie jest zadowolona z nowego systemu modułów, a ich użycie pozostaje rzadkie.

W Javie, w przeciwieństwie do wielu innych języków programowania, typy generyczne są usuwane. Oznacza to, że parametry typu są konwertowane na Object podczas kompilacji, a w czasie wykonywania nie można określić, który typ został przekazany. To podejście ma swoje zalety i wady, a debata na temat tego, które typy generyczne są lepsze – usuwane czy nie – trwa do dziś. Jednak wybór usuwanych typów generycznych w Javie zależy od kilku czynników. Bardziej szczegółowe wyjaśnienie wyboru i cech typów generycznych w Javie można znaleźć w artykule Briana Goetza „Background: How We Got the Generics We Have”, który omawia aspekty historyczne i szczegóły techniczne implementacji typów generycznych w tym języku.

Pomimo różnych opinii na temat implementacji typów generycznych w Javie, istnieje istotny problem: typów prymitywnych nie można używać jako parametrów typu, ponieważ są one niezgodne z obiektem Object. Ogranicza to ekspresję języka i zmusza programistów do uciekania się do używania typów opakowanych, co może negatywnie wpłynąć na wydajność. Z kolei niektóre funkcje muszą być ręcznie specjalizowane dla typów prymitywnych. Aby rozwiązać ten problem, projekt Valhalla planuje zaimplementować wyspecjalizowane typy generyczne, co znacznie usprawni pracę z typami prymitywnymi i zwiększy wydajność kodu.

Kompatybilność wsteczna to kluczowa zasada języka Java, której zarząd JCP nie zamierza naruszać nawet w celu implementacji najnowocześniejszych funkcji. Chociaż w niektórych przypadkach mogą nastąpić zmiany, starszy kod musi nadal działać bez zakłóceń. Ten ważny wymóg pozwala programistom na aktualizowanie aplikacji z przekonaniem, że istniejąca funkcjonalność pozostanie funkcjonalna. Kompatybilność wsteczna zapewnia niezawodność i stabilność oprogramowania, dzięki czemu Java jest popularnym wyborem do tworzenia oprogramowania w różnych dziedzinach.

W starszym kodzie bajtowym można znaleźć wyjątki zaimplementowane za pomocą instrukcji JSR i RET, ale w nowym kodzie bajtowym instrukcje te są nieobecne. Jednak wszystkie narzędzia muszą obsługiwać starszy kod bajtowy, ponieważ nadal jest on istotny dla bibliotek opracowanych 20 lat temu. Biblioteki te są nadal używane w nowoczesnych projektach w formacie .jar, co podkreśla znaczenie zgodności ze starszymi standardami.

Ta zasada zapewnia stworzenie stabilnego ekosystemu, pozwalając firmom uniknąć obawy, że nowa wersja uszkodzi istniejącą infrastrukturę i zablokuje aktualizacje. Jednak taka stabilność może hamować innowacje. Java może rozwijać się wolniej niż C# ze względu na ścisłą kompatybilność wsteczną, która jest postrzegana jako coś niezmiennego i niedopuszczalnego do zmian. Stwarza to pewne ograniczenia i utrudnia szybką adopcję nowych technologii i funkcji, co może negatywnie wpłynąć na konkurencyjność platformy.

W języku programowania Java nowe funkcje i specyfikacje pojawiają się w ramach procesu Java Community Process (JCP). Proces ten obejmuje przegląd propozycji, znanych jako Java Specification Requests (JSR), na które następnie przeprowadza się głosowanie. W procesie JCP uczestniczą przedstawiciele dużych firm, członkowie grup użytkowników i indywidualni eksperci, zapewniając różnorodność opinii i zainteresowań w społeczności Java. W ten sposób nowe funkcje i ulepszenia są opracowywane z myślą o potrzebach różnych uczestników, co sprzyja ewolucji języka i jego adaptacji do potrzeb współczesnych programistów.

Jaka jest wiedza o JVM potrzebna programiście?

To pytanie jest przedmiotem ożywionej dyskusji. Odpowiedź w dużej mierze zależy od celów programisty Java.

Około 30% programistów może z powodzeniem wykonywać swoje zadania bez zagłębiania się w wewnętrzne mechanizmy maszyny wirtualnej. Dla 50% programistów podstawowa znajomość maszyny wirtualnej Java (JVM) wystarcza do osiągnięcia stanowisk średniego i wyższego szczebla. Chociaż ich głównym zadaniem nie jest zagłębianie się w zawiłości maszyny wirtualnej, zrozumienie jej struktury pozwala im pisać bardziej wydajny kod i zapobiegać błędom. Jednak 20% zadań wymaga dogłębnego zrozumienia działania JVM. Im lepiej rozumiesz maszynę wirtualną, tym szerszy zakres zadań możesz pomyślnie rozwiązać.

Ramka: serial animowany „Futurama”

Jeśli wydajność ma kluczowe znaczenie w projekcie i chcesz ją poprawić, Jeśli nie można zastosować wydajniejszego algorytmu, należy zwrócić uwagę na moduł zbierający śmieci. Ważne jest, aby zrozumieć, jak on działa i jak poprawić jego wydajność. Należy rozważyć dostępne ustawienia, które można zmienić, aby zoptymalizować działanie modułu zbierającego śmieci. Warto również zrozumieć koncepcję deoptymalizacji: czym ona jest, jakie są przyczyny jej występowania i jak zminimalizować jej wpływ na wydajność projektu.

Programista Java, który systematycznie zgłębia swoją dziedzinę, ma szansę zostać inżynierem wydajności. Ci specjaliści identyfikują problemy z wydajnością i analizują wewnętrzne procesy maszyny wirtualnej Java (JVM). Zamiast wprowadzać zmiany w kodzie maszyny wirtualnej, dostrajają ją niczym zegarmistrzowie, zapewniając optymalną wydajność aplikacji. Aby zostać inżynierem wydajności, potrzebna jest dogłębna znajomość maszyny wirtualnej Java (JVM), a także umiejętności analizy wydajności i optymalizacji, co może znacznie poprawić wydajność aplikacji Java.

Dla programistów języka zarządzanego ważne jest zrozumienie, co dzieje się „pod maską” podczas uruchamiania programów w zintegrowanych środowiskach programistycznych. Chociaż nie jest konieczne zapamiętywanie każdego szczegółu JVM, podstawowa znajomość takich pojęć, jak interpreter, kompilator Just-In-Time i cykl życia obiektu, w tym koncepcji „martwego obiektu”, jest pomocna. Ta wiedza pomaga w głębszym zrozumieniu wydajności i optymalizacji aplikacji, a także poprawia umiejętności debugowania i rozwiązywania problemów. Zrozumienie tych aspektów pozwala programistom pisać wydajniejszy i zoptymalizowany kod.

Programista bez znajomości pewnych kluczowych aspektów może z powodzeniem wykonać wiele zadań. Jednak prędzej czy później napotka błędy, których przyczyny są niejasne. Na przykład, bez zastanowienia się nad tym, jak działa pamięć i jak jest zwracana do systemu operacyjnego, możesz otrzymać komunikat o błędzie „Brak pamięci” od IDE. Dzieje się tak, ponieważ program zużywa nadmierną ilość pamięci. Programista, który rozumie zasady zarządzania pamięcią, będzie dążył do optymalizacji swojego kodu i minimalizacji tworzenia niepotrzebnych obiektów. Znajomość tych podstaw pomaga unikać problemów, zwiększa produktywność i prowadzi do tworzenia lepszego oprogramowania.

Programista Java, który stale rozwija swoją wiedzę i umiejętności, może ostatecznie zostać inżynierem wydajności. Ci eksperci identyfikują i rozwiązują problemy z wydajnością, analizując wewnętrzne działanie maszyny wirtualnej Java (JVM). Zamiast po prostu dodawać kod, skupiają się na dostrajaniu maszyny wirtualnej, niczym zegarmistrzowie, aby zoptymalizować wydajność aplikacji i poprawić ogólną wydajność systemu. Rozwój w tym kierunku wymaga od programisty dogłębnej wiedzy na temat działania maszyny wirtualnej Java i zrozumienia różnych technik optymalizacji.

Dokąd zmierza JVM

Obecnie aktywnie rozwijane są trzy projekty, które z pewnością zostaną uwzględnione w przyszłych wersjach Javy. Projekty te mają istotne znaczenie dla dalszego rozwoju języka i jego ekosystemu, zapewniając poprawę wydajności, nowe funkcje i możliwości dla programistów. Oczekuje się, że ich integracja z Javą zwiększy wydajność programowania i uprości pracę z nowoczesnymi technologiami.

Loom to projekt, który dodaje obsługę wątków wirtualnych do języka programowania Java. W przeciwieństwie do tradycyjnych wątków, które bezpośrednio odpowiadają wątkom systemu operacyjnego, wątki wirtualne działają niezależnie. Są aktywowane tylko wtedy, gdy są potrzebne, co pozwala na efektywne wykorzystanie zasobów i poprawę wydajności aplikacji. Wątki wirtualne w Javie zapewniają łatwiejszą i bardziej elastyczną obsługę zadań równoległych, upraszczając tworzenie programów wielowątkowych.

Wcześniej każda instancja klasy java.lang.Thread w Javie odpowiadała oddzielnemu wątkowi systemu operacyjnego, umożliwiając wielowątkowość. To rozwiązanie, choć logiczne, ma swoje ograniczenia: liczba wątków systemu operacyjnego jest ograniczona, a utworzenie w ten sposób kilku tysięcy wątków staje się trudne. Projekt Loom oferuje innowacyjne rozwiązanie – wątki wirtualne, które nie mają ścisłej relacji 1:1 z wątkami systemu operacyjnego. Zamiast tego wątki wirtualne wykorzystują wątki systemu operacyjnego w razie potrzeby do wykonywania swoich zadań, znacznie zwiększając wydajność wielowątkowości. Te zmiany pozwalają programistom tworzyć bardziej skalowalne i wydajne aplikacje poprzez optymalizację wykorzystania zasobów i uproszczenie zarządzania wątkami.

Idea wątków wirtualnych nie jest nowa. Przykładowo język Go implementował tę koncepcję od samego początku. Kwestia wątków wirtualnych jest dyskutowana od wielu dekad. W latach 90. XX wieku Java również miała zielone wątki – koncepcję, w której kilka „zielonych” wątków było przetwarzanych w ramach jednego wątku systemu operacyjnego. W tamtych czasach, gdy procesory miały tylko jeden rdzeń, problem lekkiej wielowątkowości nie był tak palący. Można argumentować, że projekt Loom jest swego rodzaju reinkarnacją zielonych wątków, ale zaimplementowaną na wyższym poziomie. Ta nowa implementacja pozwala programistom tworzyć bardziej wydajne i skalowalne aplikacje, zapewniając jednocześnie proste zarządzanie wątkami.

Ten projekt ma ogromne znaczenie w kontekście współczesnego świata mikrousług i serwerów obsługujących ogromną liczbę równoczesnych połączeń. Podczas tworzenia dziesiątek lub setek tysięcy wątków, starsze metody implementacji wykorzystujące wątki systemu operacyjnego stają się nieefektywne. Jednak dzięki Loom zadanie to staje się w pełni wykonalne. Loom oferuje innowacyjne podejście do zarządzania wątkami, umożliwiając programistom efektywne tworzenie i zarządzanie dużą liczbą lekkich wątków, co znacząco poprawia wydajność i skalowalność aplikacji.

Panama to projekt mający na celu uproszczenie interakcji między Javą a kodem natywnym, takim jak C lub C++. Chociaż Java od samego początku miała możliwość interakcji z kodem natywnym, głównym narzędziem do tego celu pozostał Java Native Interface (JNI). Pomimo swojej mocy, JNI jest często powolny i uciążliwy w użyciu. Tworzenie aplikacji z jego wykorzystaniem wymaga pisania złożonego, uciążliwego i niebezpiecznego kodu. Wielu programistów Javy z doświadczeniem w pracy z JNI może potwierdzić trudności i frustrację, jakie powoduje ten proces, pozostawiając negatywne wrażenie po pracy z kodem natywnym. Projekt Panama ma na celu rozwiązanie tych problemów, zapewniając wydajniejsze i bezpieczniejsze sposoby interakcji, co stanowi istotny krok w ewolucji Javy.

Autorzy Projektu Panama od kilku lat pracują nad rozwiązaniem, które może znacząco ułatwić życie programistom Javy. Podobnie jak Kanał Panamski, Panama łączy dwa światy: natywny i Javy. Ten projekt oferuje nowy interfejs i zoptymalizowaną implementację JVM, umożliwiając bezpieczną i wydajną interakcję z kodem natywnym, w tym pracę poza stosem. Dzięki Panamie programiści mogą integrować biblioteki natywne ze swoimi aplikacjami Java, otwierając nowe horyzonty w zakresie wydajności i funkcjonalności.

Projekt Valhalla ma na celu wprowadzenie do Javy nowych typów obiektów, znanych jako typy wartości, typy inline lub prymitywne typy wartości. Nazwa ta, podobnie jak sama koncepcja projektu, stale ewoluuje. Valhalla to złożona inicjatywa, której celem jest rozszerzenie możliwości języka Java, poprawa wydajności i uproszczenie pracy z danymi. Wprowadzenie typów wartości pozwoli programistom tworzyć wydajniejsze i lżejsze struktury danych, co znacznie poprawi wydajność aplikacji.

Ideą jest zdefiniowanie podklasy obiektów, którym brakuje tożsamości. Co to oznacza? W Javie można utworzyć dwa identyczne obiekty za pomocą operatora new i porównać je za pomocą operatora ==, co da wynik false. Dzieje się tak, ponieważ są to różne obiekty, które są porównywane nie według ich zawartości, ale według unikalnej właściwości przypisanej każdemu obiektowi w momencie jego utworzenia. Możliwość porównywania według innego kryterium niż ich zawartość nazywamy tożsamością.

Z drugiej strony, można utworzyć dwie zmienne typu int i przypisać im wartość 42. Po porównaniu za pomocą operatora == wynik będzie równy true. Dzieje się tak, ponieważ typ int nie ma tożsamości; zmienne tego typu są porównywane wyłącznie według wartości.

Celem Valhalli jest umożliwienie użytkownikom tworzenia własnych klas bez tożsamości i przygotowanie istniejącego systemu typów do tego procesu. Umożliwi to na przykład osadzanie płaskich pól tego typu w innych klasach, co w praktyce oznacza możliwość wstawiania ich pól wewnątrz innych obiektów. Ponadto użytkownicy będą mogli pracować z płaskimi tablicami takich obiektów i uzyskiwać wyspecjalizowane obiekty generyczne, co znacząco rozszerzy funkcjonalność programowania i optymalizacji kodu.

To znacząca i fundamentalna zmiana w ekosystemie Java, która przyciąga uwagę i zasługuje na oczekiwanie, ponieważ otworzy nowe możliwości dla programistów. Innowacje obiecują lepszą funkcjonalność i wydajność, co umożliwi tworzenie wydajniejszych i nowocześniejszych aplikacji na platformie Java.

Wcześniej każda instancja klasy java.lang.Thread w Javie odpowiadała jednemu wątkowi systemu operacyjnego, co umożliwiało wielowątkowość. Model ten ma jednak swoje ograniczenia: liczba wątków systemu operacyjnego jest ograniczona, a utworzenie więcej niż kilku tysięcy wątków staje się trudne. Projekt Loom oferuje rozwiązanie w postaci wątków wirtualnych, które nie są powiązane ścisłą relacją 1:1 z wątkami systemu operacyjnego. Zamiast tego wątki wirtualne wykorzystują wątki systemowe w razie potrzeby, umożliwiając efektywniejsze zarządzanie zasobami i zwiększając wydajność aplikacji wielowątkowych. Ta innowacja znacznie upraszcza tworzenie oprogramowania i poprawia skalowalność aplikacji obsługujących dużą liczbę zadań równoległych.

W jakich językach tworzone są maszyny wirtualne Java (JVM) i biblioteki dla Javy?

Maszyny wirtualne Java są zazwyczaj tworzone w C++, podczas gdy ich standardowa biblioteka jest napisana głównie w samej Javie. Czasami jednak zachodzi potrzeba użycia kodu natywnego, co również oznacza konieczność sięgnięcia po C++. Tradycyjnie programowanie systemów odbywa się w C++, ponieważ język ten zapewnia niezbędną wydajność i możliwość interakcji z komponentami niskiego poziomu, takimi jak systemy operacyjne i sprzęt. Staje się jednak coraz bardziej oczywiste, że nie wszystkie elementy maszyny wirtualnej wymagają pisania w C++. Na przykład użycie języków zarządzanych, takich jak Java lub Scala, pozwala na wydajniejsze i wygodniejsze tworzenie kompilatorów bez uciekania się do C++. Otwiera to nowe możliwości optymalizacji i uproszczenia tworzenia oprogramowania. Oracle Labs rozwija projekt GraalVM, który obejmuje trzy główne komponenty. GraalVM to uniwersalna maszyna wirtualna, która zapewnia obsługę różnych języków programowania i wysoką wydajność dla aplikacji wielowątkowych. Pierwszym komponentem jest Graal, kompilator optymalizujący wykonywanie kodu i znacznie przyspieszający jego wykonywanie. Drugim komponentem jest Truffle, framework do tworzenia interpreterów języków programowania, który zapewnia łatwą integrację z Graal. Trzecim komponentem jest Substrate VM, technologia tworzenia natywnych obrazów, umożliwiająca uruchamianie aplikacji bez potrzeby korzystania z pełnoprawnej maszyny wirtualnej. Razem te komponenty sprawiają, że GraalVM jest potężnym narzędziem dla programistów chcących poprawić wydajność i efektywność swoich aplikacji.

  • Kompilator Graal to potężny kompilator optymalizujący; w przyszłości może zastąpić kompilator C2 firmy HotSpot. Jest równie dobry, co wiele rozwiązań optymalizujących, ale jest napisany w całości w Javie.
  • Framework Truffle to specjalny framework do pisania interpreterów dla innych języków programowania, które następnie działają na GraalVM. Zasadniczo jest to szybki sposób na implementację dowolnego języka programowania w oparciu o GraalVM! Ponownie, interpretery są napisane w językach zarządzanych.
  • Graal Native Image to osobny tryb kompilacji aplikacji, który w rzeczywistości jest całą maszyną wirtualną, ale napisaną z pewnymi naruszeniami specyfikacji. Pozwala to jednak na szybki start i niskie zużycie pamięci. Środowisko wykonawcze tej maszyny wirtualnej jest również częściowo napisane w Javie! Oczywiście nie całkowicie i z innymi ograniczeniami językowymi (w rzeczywistości używany jest tam osobny dialekt - System Java), ale mimo to jest to możliwe.

Tworzenie maszyn wirtualnych w językach zarządzanych jest od dawna celem wielu programistów systemów. Na przykład, znany kompilator C jest napisany w C. Podobnie, programiści maszyn wirtualnych dla języków zarządzanych dążą do korzystania z Javy lub innych języków zarządzanych, unikając jednocześnie złożoności i ryzyka związanego z używaniem C++. Otwiera to nowe możliwości poprawy bezpieczeństwa, redukcji błędów i uproszczenia procesu tworzenia maszyn wirtualnych. Korzystanie z języków zarządzanych może znacząco poprawić wydajność i niezawodność systemów, co czyni ten obszar szczególnie istotnym dla współczesnych specjalistów IT.

Jak wnieść swój wkład w rozwój OpenJDK

Nigdy nie przyczyniałem się do rozwoju OpenJDK i pracowałem na innej, zamkniętej i zastrzeżonej maszynie wirtualnej Java (JVM). Dlatego posiadam jedynie ogólną wiedzę na temat procesu zatwierdzania zmian w OpenJDK. Proszę zachować ostrożność.

Gdybym miał wnieść swój wkład w rozwój OpenJDK, skupiłbym się na dwóch głównych obszarach: poprawie wydajności i rozbudowie funkcji. Poprawa wydajności obejmuje optymalizację istniejących algorytmów i mechanizmów zarządzania pamięcią, co może znacząco poprawić wydajność aplikacji Java. Rozbudowa funkcji obejmuje dodawanie nowych funkcji i bibliotek, które mogą ułatwić rozwój i poprawić komfort użytkowania. Takie inicjatywy nie tylko przyczyniają się do rozwoju OpenJDK, ale także pomagają społeczności programistów znaleźć nowe rozwiązania palących problemów.

  • Znajdź coś małego, co można naprawić lub ulepszyć. Może to być prosty (i niskopriorytetowy) błąd w systemie śledzenia błędów OpenJDK lub nieefektywność algorytmu w klasach platformy. Napraw ten problem, skompiluj OpenJDK i sprawdź, czy na przykład algorytm faktycznie działa lepiej w niektórych testach porównawczych.

Po wprowadzeniu ulepszeń wyślij wiadomość na listę mailingową, opisując zmiany i prosząc o recenzję. Następnie przejdź przez proces recenzji i wykonaj pozostałe kroki zatwierdzania. Procedura zatwierdzania jest dość standardowa, ponieważ OpenJDK jest teraz hostowane w serwisie GitHub. Gratulacje, jesteś teraz współtwórcą OpenJDK!

Według opinii osób, które już przeszły przez ten proces, cały proces może zająć sporo czasu, zwłaszcza za pierwszym razem. Jest to jednak całkiem wykonalne i realistyczne dla większości osób.

  • Znajdź pracę w firmie, w której pracują współtwórcy. W tym przypadku będziesz tworzyć kod, który trafi do OpenJDK w godzinach pracy. Problem polega jednak na tym, że takich firm jest wciąż bardzo mało. Jednak dostanie się do jednej z nich jest naprawdę fajne. Wyraźnym przykładem takiej firmy jest firma BellSoft z Petersburga, która w zeszłym roku zajęła czwarte miejsce na świecie (!) wśród zewnętrznych (nie z Oracle) współtwórców OpenJDK.

Zawód programisty Java

Nauczysz się programować w Nauczysz się Javy od podstaw i stworzysz aplikacje internetowe z wykorzystaniem frameworka Spring. W ciągu sześciu miesięcy zdobędziesz podstawowe umiejętności i zbudujesz portfolio, a my pomożemy Ci znaleźć pracę.

Dowiedz się więcej