Spis treści

     1 Wstęp i historia
     2 Cechy języka
          2.1 Interfejsy, dziedziczenie
     3 Bezpieczeństwo
     4 Niezależność od architektury
          4.1 Rozszerzalność
     5 Wydajność
     6 Inne cechy języka i platformy

Wstęp i historia

Zorientowany obiektowo język programowania stworzony w firmie Sun Microsystem (przejęta przez Oracle w 2010 roku) pod kierunkiem Jamesa Goslinga i opublikowany w 1995 roku wraz z Maszyną Wirtualną Java (JVM).

Początkowo język jak i maszyna wirtualna miały stanowić platformę dla telewizji interaktywnej. Jednak ze względu na zbyt duże trudności, m.n. zbyt zaawansowaną i niedostępną w tym czasie technologię, postanowiono stworzyć język, który będzie konkurentem dla C++. Większość elementów składni języka zaczerpnięto z C++, a rozwiązania takie jak maszyna wirtualna czy automatyczne zwalnianie pamięci z Smalltalk.

Od początku firma Sun wyznaczyła najważniejsze cechy Javy jako platformy:
  • powinien być prosty w użyciu, zorientowany obiektowo z "przyjazną" składnią.
  • powinien bezpieczny i "solidny".
  • powinien być neutralny architektonicznie i łatwy w rozszerzeniu.
  • powinien zapewniać wysoką wydajność.
  • powinien być interpretowany, wielowątkowy i dynamiczny.

Cechy języka

Język rzeczywiście posiada uproszczoną w stosunku do C++ składnię. Zrezygnowano też z dualnego dostępu do zmiennych - przez wartość i przez referencję, na rzecz przekazywania obiektów przez referencję. Język nie wspiera przeciążania operatorów (choć operator + został przeciążony dla klasy String ) ani nie umożliwia tworzenia własnych. Jednocześnie na obecnym etapie rozwoju programista ma do dyspozycji mechanizm adnotacji czy typy generyczne, które są bardziej rozbudowane w stosunku do znanej z C++ biblioteki STL.
Java jest językiem zorientowanym obiektowo ponieważ poza typami obiektowymi posiada też typy proste reprezentujące liczby całkowite, zmiennopozycyjne, wartości logiczne i pojedyncze znaki. W wersji 1.5 języka wprowadzono mechanizm auto-boxingu, który pozwala na swobodne mieszanie typów prostych i ich obiektowych odpowiedników, a to dzięki zamianie typów prostych na obiektowe w trakcie kompilacji.

Interfejsy, dziedziczenie

Język Java pozwala na dziedziczenie po jednej klasie nadrzędnej. Wszystkie klasy dziedziczą po klasie Object. Można też tworzyć interfejsy, które jednak nie mogą dostarczać domyślnej implementacji (mixin).

Bezpieczeństwo

Java udostępnia kilka mechanizmów zabezpieczających programistów przed popularnymi błędami. Pierwszym z nich jest automatyczne zwalnianie pamięci. Programista jest dzięki temu "zwolniony" z dbania o usuwanie nieużywanych obiektów. Nie oznacza to jednak, że nie można spowodować wycieku pamięci. Drugim jest silne typowanie oraz konieczność dostarczenia wszystkich użytych klas w czasie kompilacji. Kolejnym jest sposób obsługi wyjątków i wydzielenie grupy wyjątków weryfikowalnych, które muszą zostać obsłużone przez programistę. Ostatnim istotnym elementem jest tzw. security policy czyli zestaw reguł pozwalających na definiowanie dostępnych i zabronionych działań dla programów na danej JVM.

Niezależność od architektury

Java była reklamowana hasłem "napisz raz uruchom wszędzie". Jest to główna cecha rozpoznawcza języka która stała się też celem niewybrednych dowcipów1. Rzeczywistą zaletą jest rozgraniczenie elementów platformy systemowej i elementów dostępnych w języku bez konieczności wywołań systemowych. W toku prac nad językiem zauważono, że można stworzyć zbiór elementów API, które mogą być napisane w Javie bez wykorzystania wywołań systemowych. Ograniczyło to ilość kodu, który trzeba implementować w zależności od platformy. Teoretycznie prosta implementacja JVM powinna wymagać tylko systemowej I/O (system plików, sieć, klawiatura, mysz itp.). W praktyce implementowane są też niektóre operacje takie jak np. Math.sqrt.

Rozszerzalność

Rozszerzalność platformy Java jest doskonale widoczna jeżeli przyjrzymy się innym językom, które są uruchamiane w ramach JVM. Scala i Groovy doskonale ilustrują fakt, iż język Java i JVM to dwa niezależne byty. Poza rozszerzalnością składni jest też możliwe tworzenie rozszerzeń wprowadzających nowe paradygmaty aspektowy - AspectJ czy funkcyjny Clojure. Istnieją też rozszerzenia architektury pozwalające na swobodne zarządzanie zasobami w ramach działającego JVM - z głównym rozwiązaniem OSGi.

Wydajność

Początkowo Java była uważana za język prosty, ale powolny i zasobochłonny. Jednakże kolejne modyfikacje oraz wprowadzenie kompilatora JIT (Just In Time) spowodowało, że Java stała się językiem w którym niektóre problemy mogą zostać rozwiązane szybciej niż w C2.
Nadal jednak wydajność jest tematem zażartych dyskusji i flamewarów pomiędzy programistami.

Inne cechy języka i platformy

Kod jest kompilowany do bytekodu, czyli asemblera maszyny wirtualnej, a następnie interpretowany przez JVM. Obecnie dzięki zastosowaniu JIT maszyna wirtualna potrafi wykryć często wykorzystywane fragmenty bytekodu i skompilować je do kodu maszynowego platformy na której jest uruchomiona.
Java udostępnia API do pisania programów współbieżnych. Jednocześnie nie gwarantuje zachowania reżimu czasowego co czyni ją praktycznie nie przydatną w programowaniu systemów czasu rzeczywistego. Wynika to z niedeterministycznej natury automatycznego odśmiecania pamięci, który nie pozwala na przewidywanie momentu uruchomienia, ani czasu pracy. Istnieją co prawda wersje Garbage Collector, które pozwalają na określenie takich parametrów jak periodyczność uruchomienia, maksymalny czas pracy, wielowątkowe działanie, ale nie są one dostępne w standardowych ustawieniach JVM.

[1] http://www.davidgrant.ca/java_and_anal_sex
[2] http://en.wikipedia.org/wiki/Java_performance

7 komentarzy

Brak avatara
Napisany 2008-03-01 11:06 przez Crane

Według mnie kategoria J2ME to dobry pomysł. Chociaż teraz to JME...

Avatar: lukasz1235
Napisany 2008-02-27 13:55 przez lukasz1235

Co myślicie o tym żeby dodać nową podkategorię J2ME?

Avatar: Koziołek
Napisany 2007-04-28 21:35 przez Koziołek

ze strony suna. www.sun.com

Avatar: RedbaK
Napisany 2006-09-21 20:23 przez RedbaK

z kad ==> skąd
Ściągnij sobie kompilator zwany Mr.Java.
Bardzo prosty, intuicyjny i pokazujący nawet jak masz zapisac plik z programem, czyli pod jakąnazwą. A o informowaniu o błędach i ich podkreślaniu to nie wspomnę ;)

Avatar: czarownik
Napisany 2006-07-25 18:44 przez czarownik

dla początkujących polecam wszystko co nie ma Ctrl+Space... przeklęstwo jak ktoś chce się nauczyć języka. potem wiadoko... im łatwiej i szybciej tym lepiej, ale na początek proponuje Context (można podpiąć kompilator każdego języka) lub specjalnie dla Javy: JCreator - bardzo wygodny.

Avatar: Garar
Napisany 2006-04-21 11:05 przez Garar

kompilator jest w jdk, ktore mozesz dostac ze strony suna: java.sun.com. nazywa sie javac i jest konsolowy. Ide do javy to np:
NetBeans : www.netbeans.org
Eclipse : www.eclipse.org

Brak avatara
Napisany 2006-03-09 17:04 przez maksx

OK OK tylko <ort>z kad</ort> moge dostac kompilator javy???

4programmers.net