Dzisiaj jest piątek, 23 czerwca 2017
DLACZEGO logo musi być wektorowe?JAKIE błędy popełniamy w Corelu?DLACZEGO tak szybko oceniamy?
Java vs C++ - runda #2

Java vs C++ - runda #2

środa, 2011-04-270

Kod źródłowy pochodzi z banku zdjęć Fotolia

Korzystając z chwili świątecznego czasu, postanowiłem dopisać jeszcze kilka punktów porównujących oba języki, chociaż tym razem bardziej skupię się na samej Javie i jej zaletach/wadach (oczywiście z mojego punktu widzenia).

Założeniem Javy była 100% przenośność na róże platformy. O ile w kwestii samego działania nie mam zastrzeżeń (programu uruchamiają się i po za drobnymi różnicami, które można opanować, działają identycznie). Problem pojawia się w przypadku GUI.

Swing

Trzeba używać wielu różnych layoutów, żeby zapanować nad tym chaosem
Zatweetuj

Java udostępnia różne biblioteki do rysowania okienek i komponentów, ale Swing jest (podobno) najbardziej uniwersalny. Niestety jego obsługa bardzo różni się od tego, co znałem np. z WinApi. Owszem, można obudować klasy tak, żeby niezależnie pozycjonować każdy element, ale tu chodziło o to, żeby właśnie tego nie robić. Wszytko się pozycjonuje się zależnie od innych elementów (kontrolek). Często więc trzeba się mocno nakombinować, żeby elementy były jako-tako poukładane. Trzeba używać wielu różnych layoutów, żeby zapanować nad tym chaosem. W dodatku w zależności od platformy, elementy wyglądają różnie, nawet mimo zdefiniowania wyglądu „MetalLookAndFeel” (swoją drogą wcale mi się on nie podoba).

Swing niekonsekwentnie przekazuje parametry w metodach. Dla przykładu w SetSize można niezależnie przekazać szerokość i wysokość albo jako obiekt zawierający te wartości. Ale już SetMinSize przyjmuje tylko obiekt. W ogóle bez sensu jest konieczność tworzenia i przekazywania obiektów w przypadkach gdy można przekazać same parametry (mniej pisania) np. SetBackground(new Color(R,G,B)).

Klasy, obiekty, tablice i dużo więcej...

Twórcy języka C/C++ zakładali, że programista wie co robi i dali mu wolną rękę niemal we wszystkim. Co prawda zwiększa to ryzyko popełnienia błędu niewychwytywalnego przez kompilator, ale za to klepania kodu jest o wiele mniej. Wiele danych można przekazywać jako wskaźnik (na tablicę, funkcję, obiekt), nawet bez konieczności rzutowania. W Javie to nie przejdzie. Tutaj z założenia niemal wszystko jest przekazywane jako wskaźnik, ale konieczne jest rzutowanie. Czasami przy konwersji jednego obiektu na inny (z jednoczesnym odczytem np. wartości z tablicy) trzeba zastosować kila rzutowań. Pomijając konieczność klepania dodatkowych literek (samo rzutowanie zajmuje więcej kodu niż właściwy algorytm), bardzo to zaciemnia prostą operację. Owszem, można ją podzielić na kilka(-naście) linijek, ale często nie ma po co. Ciekawi mnie, jak to się ma do wydajności. Czy rzutowanie jest realizowane podczas kompilowania do bytecodu czy podczas wykonywania programu?

Każdy obiekt obsługiwany jest nieco inaczej, aż się prosi o ujednolicenie wszystkiego
Zatweetuj

Każdy obiekt obsługiwany jest nieco inaczej, aż się prosi o ujednolicenie wszystkiego. Domyślam się, że to wynika z samej ewolucji i rozwoju języka, ale z punktu widzenia kodera to uciążliwe. W dodatku klasa String zupełnie niepodobna do niczego. Niby działa jak prosta tablica, ale jest obiektem.

Java ma dużo gotowych obiektów do tablicowania danych. Każdy działa nieco inaczej (problemem może tu być wybór najefektywniejszego do danego typu danych i operacji na nich wykonywanych, ale będę się tym martwił, gdy będę pisał wielki program). Plusem jest garbage collector, który odciąża mnie od konieczności zajmowania się obsługą pamięci, co jest jednym z największych problemów podczas programowania w C. Z tego powodu bardzo lubię PHP, który też sam zajmuje się obsługą pamięci.

Bardzo szybki jest odczyt/zapis obiektu. Kilka linijek kodu i niczym nie trzeba się martwić.

Kompilator

Java zawsze jest taka sama (jeden kompilator), kod wynikowy również, do C/C++ jest wiele kompilatorów do każdego systemu i tworzą różny kod wynikowy. Builder tworzy masę zbędnego kodu, GCC bardzo mały kompaktowy kod. C/C++ dla każdej platformy ma róże kompilatory, niektóre wymagają zupełnie innego przygotowania kodu źródłowego. Czyli pojawia się problem przenośności programu. Program w Javie (poza problemami z GUI, o których już pisałem) można skompilować i uruchamiać na każdym komputerze pod warunkiem zainstalowania maszyny wirtualnej.

Jeszcze o wydajności

Wybrałem środowisko Eclipse (napisane w Javie zresztą), jako najbardziej dla mnie przyjazne. Wszystko piszę z palca, ale za to mam kontrolę nad całością kodu źródłowego. Jako że Javę dopiero zgłębiam, mam włączone podpowiedzi. I tu się pojawia problem, co czasami lista metod danej klasy wczytuje się kilkadziesiąt sekund. Pół biedy gdyby można to było jakoś przerwać, ale tak muszę czekać aż cała lista się załaduje. Może jest jakiś sposób na przerwanie tego, ale ja go nie znam? W ogóle często widać spowolnienie w działaniu edytora, przycinanie się i takie tam. Niby drobiazg, ale ja komfort i płynność pracy stawiam na pierwszym miejscu.

Spodobał Ci się wpis? Udostępnij go w Social Media:
Jeśli podoba Ci się wpis,
koniecznie zalajkuj,
skomentuj i zapisz się na