1. Kompilator Java
Przy okazji, nie raz jeszcze usłyszysz, że niepodważalną przewagą Javy nad innymi językami jest wieloplatformowość. Czym to właściwie jest i z czym to się je? Zacznijmy od początku.
Chodzi o to, że komputer potrafi wykonywać tylko najprostsze polecenia.
Dla psów są komendy „Do nogi”, „Łapę” i inne — po ich usłyszeniu pies robi coś konkretnego. W komputerze rolę takich komend pełnią liczby: każda komenda jest zakodowana pewną liczbą (nazywa się to także kodem maszynowym).
Pisanie programu jako ciągu liczb jest bardzo trudne, dlatego ludzie wymyślili języki programowania i kompilatory. Taki język z jednej strony jest zrozumiały dla człowieka, z drugiej — dla kompilatora. Kompilator to specjalny program, który tłumaczy tekst programu napisany w języku programowania na kod maszynowy.
Zazwyczaj programista pisze program w języku programowania, a potem uruchamia kompilator, który na podstawie plików z kodem tworzy jeden plik z kodem maszynowym — finalny (skompilowany) program.
- Program w języku C++
-
Kompilator
- Program, składający się z kodu maszynowego
Powstały w rezultacie program może być od razu uruchamiany na komputerze. Minusem takiego podejścia jest to, że kod otrzymanego programu silnie zależy od procesora i systemu operacyjnego. Program skompilowany pod Windows nie będzie działał na telefonie z Androidem.
Jeśli napisałeś program pod Android, to w systemie Windows on się nie uruchomi!
Ale Java ma znacznie bardziej innowacyjne podejście.
- Program w języku Java
-
Kompilator Java
- Program, składający się ze specjalnych kodów (kod bajtowy)
-
Java VM
- Program, składający się z kodu maszynowego
Kompilator Java nie kompiluje wszystkich klas do jednego programu z kodem maszynowym. Zamiast tego kompiluje każdą klasę osobno i nie do kodu maszynowego, lecz do specjalnego kodu pośredniego (kodu bajtowego). Kompilacja do kodu maszynowego odbywa się przy uruchomieniu programu.
A kto kompiluje program do kodu maszynowego w momencie jego uruchomienia?
Do tego służy specjalny program o nazwie JVM (Java Virtual Machine) — Wirtualna Maszyna Javy. Najpierw uruchamia się ją, a dopiero potem program składający się z kodu bajtowego. I to właśnie JVM, przed wykonaniem docelowego programu, kompiluje go do kodu maszynowego.
Jeśli masz mocny procesor, który obsługuje większy zestaw instrukcji maszynowych, to podczas „drugiej kompilacji” zostanie wygenerowany kod maszynowy z uwzględnieniem właśnie twojego procesora i systemu operacyjnego. Dlatego Java bywa czasem szybsza niż C++, który od razu kompiluje się do kodu maszynowego i może używać tylko najbardziej rozpowszechnionych instrukcji procesora.
2. Typowe błędy przy kompilacji
Szybkość i optymalizacja kodu na razie nie są dla nas bardzo istotne, za to ważne jest to, że kompilator sprawdza twój program pod kątem błędów. Weryfikuje poprawność kodu i nie przepuści go dalej, jeśli znajdzie nawet drobny błąd.
Przykład błędu:
Próbujesz przypisać liczbę do zmiennej, która może przechowywać tylko tekst.
String userName = 42; // Ups! Tak nie wolno.
Kompilator natychmiast zgłosi błąd, że typy nie odpowiadają: Cannot implicitly convert type 'int' to 'string'.
Inny przykład — literówka w nazwie metody println:
System.out.printline("Cześć!"); // Błąd w nazwie metody
Kompilator powie: „Nie ma takiej metody — sprawdź składnię!”
Jak czytać błędy?
Większość kompilatorów podpowiada, gdzie w kodzie jest błąd, a czasem nawet proponuje warianty naprawy. Nie bój się błędów: każdy z nich to krok ku oświeceniu i pokonaniu twojego wewnętrznego „bossa”.
3. Komentarze
Wyobraź sobie: piszesz złożony program. Wszystko działa, jesteś — geniusz! Ale po miesiącu otwierasz ten sam kod i... nic nie rozumiesz. Tu parę linijek, tam dziwna zmienna. W głowie tylko: „To na pewno pisał ktokolwiek, byle nie ja!”. I właśnie tu ratują nas komentarze.
Komentarze są jak notatki na marginesie podręcznika albo karteczki na lodówce („Piwo. Nie pić. Na rano!”). Kompilator je ignoruje, a ludzie — wręcz przeciwnie. Komentarze pozwalają wytłumaczyć sens kodu, zaznaczać ważne szczegóły, a nawet „wyłączać” fragmenty programu bez ich usuwania.
Ważne: żaden kompilator nie czyta twoich komentarzy — są całkowicie ignorowane!
Komentarze jednoliniowe
W Javie są dwa rodzaje komentarzy — jednoliniowe i wielowierszowe. Jednoliniowe zaczynają się od podwójnego ukośnika // i trwają do końca wiersza. Wszystko, co znajduje się po //, jest komentarzem i jest całkowicie ignorowane przez kompilator.
Przykład:
System.out.println("Witaj, świecie!"); // To wypisuje powitanie na ekran
Właśnie to // To wypisuje powitanie na ekran — to komentarz. Jeśli w kodzie nie jest jasne, po co jest dana linijka, po prostu tak to opisz!
Jeszcze jeden przykład:
int x = 42; // Wartość wieku programisty
Komentarze jednoliniowe można pisać także w osobnych wierszach:
// Inicjalizacja zmiennej z nazwą użytkownika
String userName = "Wiktor";
Prawie jak kwestie w scenariuszu: komentarz wyjaśnia, po co i dlaczego.
Komentarze wielowierszowe
A co, jeśli nazbierało się dużo do opowiedzenia? Prawdziwa historia? Do tego służą komentarze wielowierszowe, które zaczynają się od /* i kończą na */. Wszystko między tymi symbolami jest ignorowane przez kompilator, nawet jeśli to kilka wierszy.
Przykład:
/*
Tutaj wypisujemy nazwę użytkownika na ekran.
Jeśli nazwa nie istnieje, wypiszemy "Gość".
*/
System.out.println("Wprowadź swoje imię:");
Albo tak:
int age = 18; /* Wartość początkowa wieku
dla nowego użytkownika */
Uwaga: nie można zagnieżdżać jednych komentarzy wielowierszowych w inne. Nie próbuj być sprytniejszy od kompilatora — to nie zadziała.
Ilustracja:
| Rodzaj | Składnia | Przykład |
|---|---|---|
| Jednoliniowy | |
|
| Wielowierszowy | |
|
4. Przykłady z życia
„Wyłączenie” wiersza kodu:
Zdarza się, że chcesz tymczasowo nie wykonywać jakiegoś fragmentu kodu. Komentarze są tu jak najbardziej na miejscu:
// System.out.println("Tekst, który tymczasowo nie jest potrzebny");
Linijka została, ale kompilator jej nie „widzi”.
Adnotacje TODO i FIXME
Programiści to też ludzie i czasem trzeba samemu sobie przypomnieć, że kod nie jest jeszcze skończony albo że jest tu błąd. Do tego często pisze się:
// TODO: dodać sprawdzenie pustego wejścia
// FIXME: ta funkcja błędnie liczy sumę
Wiele edytorów i IDE nawet wyróżnia takie słowa!
Programiści żartują
// Nie odpowiadam za ten kod. Zmuszono mnie, by go napisać wbrew mojej woli.
// Drogi ja_z_przyszłości! Proszę, wybacz mi ten kod.
// Jeśli jeszcze raz coś takiego zobaczę, będę musiał zacząć nosić do pracy broń.
// Jeśli ten warunek kiedyś się spełni, proszę, powiadom mnie pod tel. xxx-xxx-xxx za wynagrodzeniem.
// Drogi programisto:
//
// Kiedy skończysz "optymalizować" ten podprogram
// i zrozumiesz, jak wielkim błędem było to robić,
// proszę, zwiększ licznik na dole jako ostrzeżenie
// dla następnego gościa:
//
// liczba_godzin_spędzonych_tutaj = 42
// Kiedy zaczynałem to pisać, tylko Bóg i ja rozumieliśmy, co robię.
// Teraz został już tylko Bóg
// Czasami wydaje mi się, że kompilator ignoruje wszystkie moje komentarze
// Poświęcam cały mój kod, całą moją pracę mojej żonie Darlin, która
// będzie musiała utrzymywać mnie, naszą trójkę dzieci i psa, kiedy
// to trafi na produkcję.
Tak, komentarze potrafią być bardzo zabawne. W końcu piszą je żywi ludzie.
GO TO FULL VERSION