Czym się różni JRE od JDK?

Świat Java pełen jest trzyliterowych skrótów: JDK, JVM, JRE, SDK, JSF, JMX… i tak dalej. Dwa najbardziej podstawowe akronimy to JRE oraz JDK. Często zdarza się, że są one mylone. Wyjaśnijmy sobie, raz na zawsze co one oznaczają oraz czym się różnią. Zacznijmy od JRE!

JRE, czyli Java Runtime Environment (środowisko uruchomieniowe Java). Programy napisane w Java, nie będą działały bezpośrednio na komputerze. Do ich uruchomienia potrzebna jest maszyna wirtualna (JVM; więcej na ten temat przeczytasz we wpisie: jak działa Java). Żeby móc uruchomić aplikację w Java trzeba posiadać maszynę wirtualną, czyli zainstalowane JRE na swoim komputerze. W skład JRE wchodzą wszystkie komponenty potrzebne do uruchomienia aplikacji Java. JRE instalowane jest na komputerach użytkowników końcowych aplikacji oraz na serwerach udostępniających aplikację w formie strony WWW w internecie.

JDK, czyli Java Development Kit (zestaw developera Java). Jest to takie „JRE” na sterydach, gdyż oprócz wszystkiego tego, co znajduje się w JRE, dostarcza również narzędzia potrzebne do stworzenia oprogramowania takie, chociażby jak kompilator oraz inne umożliwiające min. analizę działania aplikacji. Bez JDK nie będziesz w stanie stworzyć aplikacji Java… chociażby dlatego, że nie będziesz, mógł skompilować kod bez kompilatora ;). Dlatego właśnie JDK instalowane jest na komputerach programistów piszących oprogramowanie w Java.

Podsumowując, JRE jest dla użytkowników końcowych, pozwala uruchomić oprogramowanie stworzone przez programistów. Natomiast JDK jest dla programistów, po to, żeby mogli tworzyć oprogramowanie.

Czym są struktury danych?

Zaczynając przygodę z programowaniem, warto zaznajomić się z kilkoma podstawowymi pojęciami, które są uniwersalne dla wszystkich języków programowania. Jednym z takich pojęć jest właśnie struktura danych. Nie ważne czy będziesz programował w pythonie, c, c++, java script, swift czy objective c zawsze spotkasz się z tym pojęciem. Zastosowanie odpowiedniej struktury danych może przyśpieszyć działanie aplikacji (oczywiście zły wybór takowej może ją spowolnić). Każdy język programowania dostarcza kilka podstawowych struktur danych, dodatkowe mogą zostać dostarczone przez zewnętrzne biblioteki.

Więc czym właściwie są te struktury danych? Najprościej mówiąc, jest to sposób, w jaki przechowywane są dane w pamięci komputera. Każdy z tych sposobów ma swoje plusy i minusy, niestety nie można mieć wszystkiego :).

Jak można sobie wyobrazić takie różne struktury danych? Wyobraź sobie 50 książek oraz cztery osoby z różnym podejściem do kolejności ich czytania.

  • Tomek trzyma książki na kupce w kącie pokoju. Każdą nową pozycję po prostu kładzie „gdzieś” losowo na tej właśnie kupce. Kiedy chce przeczytać kolejną książkę, po prostu bierze pierwszą lepszą z brzegu i czyta.
  • Marian, z drugiej story, woli czytać książki takiej kolejności, w jakiej je kupił. Więc trzyma je ułożone równo na półce. Nowe pozycje dokłada zawsze na końcu, a kiedy chce przeczytać kolejną książkę, bierze po prostu tą „najstarszą”. Dodatkowo Marian może szybko sprawdzić jaką książkę przeczyta następną, patrząc na koniec swojej kolejki ;).
  • Ania, podobnie jak Marian trzyma książki równo ułożone na półce, z tym że gdy chce przeczytać kolejną, zgaduje sobie jakąś liczbę od 1 do 50. Potem odlicza ją od prawej strony i wyciąga książkę z tej pozycji.
  • Gosia z kolei czyta książki bazując na rekomendacjach znajomych. Pyta ich o kolejny tytuł do przeczytania, a potem na podstawie tego tytułu odnajduje daną książkę na półce i ją czyta.

Każde z powyższych podejść można zaimplementować z wykorzystaniem prostej tablicy. Niestety przy każdym z nich będziemy musieli się „namęczyć” (tj. napisać dużo wlanego kodu), żeby osiągnąć dany efekt.

Pierwszy problem, jaki napotkamy przy każdej implementacji to to, że tablica ma określny rozmiar, którego w Java nie można zmienić „w locie”. Trzeba najpierw zdeklarować nową tablicę o większym lub mniejszym rozmiarze, a potem przepisać wszystkie elementy (plus lub minus jeden) do nowej tablicy.

  • W przypadku Tomka dodatkowo będziemy musieli losować liczbę po to, żeby wiedzieć, w które miejsce włożyć nową książkę oraz żeby „wiedzieć” jaką książkę przeczytać następną.
  • Jeżeli chodzi o Mariana, to zawsze będziemy przepisywać naszą tablicę książek. Przy każdym dołożeniu nowej książki będziemy musieli zwiększyć jej rozmiar o jeden i dodać na końcu nową pozycję. Natomiast w przypadku wzięcia nowej lektury do czytania, będziemy brać tą z pozycji 0, a potem usuwać ją z tablicy… czyli znowu musimy przepisać całość, tym razem bez pierwszego elementu.
  • Podobnie jest w przypadku Ani, z tym że nie wiemy którą pozycję weźmie ona jako następną, więc nasza operacja przepisania będzie jeszcze bardziej skomplikowana.
  • Natomiast w przypadku Gosi, najlepiej będzie nam mieć drugą tablicę, w której będziemy trzymać tytuły książek w takiej samej kolejności, w jakiej są one w tablicy, która przechowuje „całe” książki… oczywiście w tym przypadku musimy „opiekować” się obiema tablicami oraz pilnować, żeby nie rozjechała się nam kolejność.

Tak jak pisałem wcześniej, wszystko da się zrobić, tylko po co się męczyć… jeżeli wiemy, co chcemy osiągnąć oraz znamy właściwości kilku struktur danych, powyższe problemy rozwiążemy, stosując odpowiedni typ zmiennej w Java (czyli wybierając odpowiedni typ danych). Stosując odpowiednią strukturę danych, nie musimy pisać sami kodu związanego z dodawaniem, usuwaniem oraz pobieraniem elementów. Dodatkowo nie musimy się też martwić o rozmiar danej struktury. Wszystkie te rzeczy zrobione są za nas przez innych programistów. Dodatkowo są one przetestowane oraz zaimplementowane w najbardziej wydajny sposób.

Korzystając ze struktur danych dostępnych w Java, biblioteczki naszych poszczególnych bohaterów można zaimplementować używając:

  • java.util.HashSet – korzystamy tutaj ze struktury danych znanej jako set, która to jest takim workiem, do którego można bardzo szybko coś włożyć, oraz szybko wyciągnąć losowy element. Jeżeli nie obchodzi nas kolejność elementów oraz nigdy nie będziemy chcieli pobrać konkretnego elementu jest to idealna struktura danych.
  • java.util.Stack – czyli stos. Jego podstawowymi właściwościami jest to, że dodawane elementy zawsze lądują na końcu oraz to, umożliwia on łatwy (szybki) dostęp do najstarszego elementu (tego, który został umieszczony tam jako pierwszy) oraz można podejrzeć (bez pobierania/ściągania ze stosu) element, jaki jest na samej górze (tj. najstarszy włożony).
  • java.util.ArrayList – struktura danych, z jakiej korzystamy tutaj to lista. Umożliwia ona szybki dostęp do dowolnego elementu po jego liczbie porządkowej. Porządek w liście trzymany jest według kolejności wkładania elementów tj. kolejne elementy dodawane są na końcu listy.
  • java.util.HashMap – czyli mapa… umożliwia ona mapowanie (łączenie) dowolnego elementu w formie klucz-wartość. W przypadku Gosi kluczem będzie tytuł książki (typ String), a wartością obiekt samej książki.

Reasumując, czym są struktury danych? Jest to sposób, w jaki dane przechowywane są w pamięci komputera, oraz algorytmy umożliwiające wykonywanie operacji takich jak dodawanie, usuwanie oraz pobieranie elementów w najbardziej wydajny sposób. Zastosowanie odpowiedniej struktury danych może przyśpieszyć działanie aplikacji oraz zmniejszy ilość kodu, jaki musimy napisać w celu osiągnięcia działania aplikacji. Biblioteka standardowa Java zawiera wiele różnych struktur danych, jako dobry programista powinieneś znać je wszystkie plus dodatkowo kilka dostarczanych przez zewnętrzne biblioteki jak na przykład Google Guava.

Czy muszę znać angielski żeby programować?

Prosta odpowiedź na to pytanie brzmi: nie. Odpowiedź bardziej złożona: na prawdę dobrze by było gdybyś znał angielski. Dlaczego te odpowiedzi się wzajemnie wykluczają? Zapraszam do zapoznaina się z tym wpisem.

Zacznimy najpierw od opcji dla leniwych: nie musisz znać angielskiego żeby programować.

Tak, do samego programowania znajomość języka angielskiego nie jest Tobie w cale potrzebna. Pisać kod można po Polsku (oczywiście instrukcje języka pozozstają po angielsku np.: if, for, whie, import, public itp). Nazwy zmiennych, klas i interfejsów mogą być po Polsku. W Java możesz używać całego zakresu UTF-8 w nazwach zmiennych, klas i interfejsów. Kompilator wszystko zaakceptuje.

W “polskim” internecie znajdziesz również sporo wiedzy (ot chociażby mój blog czy 4programmes.net, przy okazji zwróć uwagę na anglojęzyczną nazwę tego serwisu). Sporo osób zajmujących się programowaniem prowadzi również blogi w języku polskim, jest sporo konferencji np. Confitura czy DevCrowd w naszym ojczystym języku. Więc wiedzy bedziesz miał pod “dostatkiem”.

Z ofertami pracy bywa to różnie, nie każda zawiera w wymaganiach język angielski. Tutaj jednak nie można być niczego pewnym, często się po prostu zakłada, że programista zna angielski dlatego się tego nawet nie wspoimina w ofercie. Jeżeli będziesz bardzo dobrym programistą to wezmą ciebie nawet bez znajomości języka (ale musisz być naprawdę dobry oraz nie mieć zbyt wygurowanych wymagań płacowych).

Nie wygląda to tak całkiem źle prawda?

Nie mniej jest jeszcze druga strona medalu!

Bez znajomości tego języka mocno ograniczasz sobie możliwości! Bo po co czekać (i liczyć na innych) aż ktoś po polsku coś napisze lub przetłumaczy z języka angielskiego.

Językiem informatyki i programowania jest język angielski nawet jeżeli ktoś z Polski stworzy jakąś fajną bibliotekę (np. Mockito) to i tak cała dokumetacja oraz kod źródłowy jest po angielsku.

Kod napisany z różnymi narodowościowymi wstawkami (nazwy zmiennych, klas oraz interfejsów) wygląda “dziecinnie”. Nie wspominając już o tym że osoba “z zaganicy” będzie miała utrudnione zadanie w jego zrozumieniu.

W internecine znajdziesz znacznie więcej informacji w dziedzinie programowania w języku angielskim niż po polsku. Ot chociażby słynny serwis StackOverflow.com na którym znajdują się opowiedzi na przeróżne pytania… oczywiście po angielsku.

Innym niezmiernie przydatnym serwissem jest GitHub.com na którym znajdują się miliony otwarto-źródłowych bibliotek i programów. Oczywiście 95% z nich jest po angielsku.

Jeżeli znajdziesz jakiś błąd lub potrzebował będziesz dodatkowej funkcjonalności w bibliotece… będziesz musiał wszystko to opisać po angielsku.

Największe i najbardziej znaczące konterencje w polsce (GeeGon, Devoxx PL) i na świecie (JavaOne, Google I/O) odwybają się po angielsku.

Jeżeli kiedy kolwiek będziesz chciał się zaangażować w jakiś projekt OpenSource to cała komunikacja będzie odbywałą się właśnie po angielsku.

Podsumowując, bez angielskiego da się programować jednak zakłada to wiele ograniczeń. Dlatego mocno zachęcam Ciebie do nauki tego języka. Z mojej strony mogę polecić darmowy serwis oraz aplikację na Android/iOs Duolingo.

Pierwsze kroki w Java

Więc, stawiasz swoje pierwsze kroki w Java? Wiesz już trochę o jej historii oraz jak uruchamiane są programy napisane w tym języku. Warto teraz zainstalować potrzebne komponenty, takie jak:

  • maszyna wirtualna,
  • kompilator,
  • biblioteka standardowa.

Możliwe, że użyłeś już jakiejś wyszukiwarki żeby naleźć wymagane komponenty i stanąłeś przed wyborem między Java JRE, a Java JDK?

Co to jest JRE i JDK?

Continue reading

Jak działa Java?

Zastanawiałeś się kiedyś jak działa Java? Czym różnią się programy w niej napisane od innych aplikacji? Z czego wynikają te różnice, oraz jakie są ich pozytywne oraz negatywne strony? Jeżeli nie, to warto się nad tym zastanowić przez chwilę. W tym wpisie znajdziesz właśnie odpowiedzi na te pytania.

Zanim przejdziemy do samej Javy, omówimy najpierw jak działają programy napisane w C++ czy ObjectiveC. Otóż, kod źródłowy programu zapisany przez programistę w pliku tekstowym, tłumaczony jest przy użyciu kompilatora (proces ten nazywany jest kompilacją) na kod maszynowy. Continue reading