Czy Java (nadal) jest językiem z wyboru wielu platform? [Zamknięte]

20

Kiedy zacząłem używać Javy w latach dziewięćdziesiątych, od samego początku było wszystko: „ Napisz raz, biegnij gdziekolwiek! ”. To prawdopodobnie wtedy było prawdą i ja też byłem częścią chóru.

Nie jestem już pewien, co o tym myśleć, biorąc pod uwagę wszystkie inne języki używające środowisk uruchomieniowych na wielu platformach (python, flash, perl, html, php ...). Ale wciąż widzę wiele argumentów, które mówią, że powinieneś używać Javy, ponieważ podobno jest lepsza do programowania na różnych platformach.

Tak, jest to nadal prawdziwe dzisiaj? Czy Java jest nadal preferowanym językiem dla rozwoju wielu platform?

  • Bądź konkretny, koncentrując się na aspektach wieloplatformowych.
  • Nie proszę o ogólne porównanie funkcji języka.

Aktualizacja: Jak dotąd świetne odpowiedzi! Większość odpowiedzi wydaje się sprzyjać Javie lub sieci. Wszelkie uwagi od tłumu skryptów?

Martin Wickman
źródło
3
Ten komentarz nie odnosi się do sedna pytania, ale jest jednym z czynników, które należy wziąć pod uwagę: oparte na Javie aplikacje internetowe skierowane do użytkowników systemu Windows są czymś, czego należy unikać. Oracle JVM dla Windows miał ostatnio wiele problemów z bezpieczeństwem. W związku z tym może się okazać, że doświadczeni użytkownicy nie będą korzystać z aplikacji internetowych opartych na Javie, ponieważ odinstalowali maszynę JVM.
poke
Twoje pytanie opiera się na założeniu, że na początku był to nawet międzyplatformowy język.
Lucas Ramage

Odpowiedzi:

10

Języki w stylu skryptowym, takie jak Python, ułatwiają także tworzenie platform. To, czy lubisz Python (lub inne tego typu języki), zależy od Ciebie i prawdopodobnie nie musimy tutaj rozpoczynać tej debaty.

Java próbuje zmusić Cię do napisania kodu, który będzie działał przenośnie, podczas gdy Python pozwala pisać kod przenośny. Sam język Pythona będzie działał przenośnie, ale biblioteki zewnętrzne mogą, ale nie muszą. Dodatkowo, python swobodnie zapewni dostęp do usług specyficznych dla platformy.

Czy Java ma tam przewagę? Myślę, że w obu przypadkach możesz napisać przenośny kod z podobną łatwością. Oznacza to, że możesz pisać kod i zwykle będzie on działał na różnych platformach. Ale nie można oderwać się od pisania kodu i zakładania, że ​​będzie on działał wszędzie. Pracowałem nad projektem Pythona, który produkował wersję dla systemów Windows, Linux i Mac i napotkaliśmy bardzo niewiele problemów na różnych platformach. (Jedyne, co pamiętam, było spowodowane błędem w bibliotece, w której korzystaliśmy z pygame, co spowodowało problemy z rysowaniem w systemie Linux. Zostało to naprawione przez uaktualnienie używanej wersji pygame)

Kolejnym problemem jest wdrożenie. Jeśli chcesz dystrybuować samodzielne programy, które uruchamiają Twój kod, będziesz musiał stworzyć różne wersje dla różnych platform. W przypadku Javy możesz rozpowszechniać jedną wersję i zakładać, że użytkownik ma zainstalowaną Javę lub może ją zainstalować. W tym przypadku Java prawdopodobnie wygrywa w prostocie działu wdrażania.

Ostatecznie myślę, że sprowadza się to do tego, z jakim językiem lubisz pracować i jakiego rodzaju wdrożenia musisz wykonać.

Winston Ewert
źródło
18

Choć Java nie może być lub jedynym realnym narzędziem cross-platform, to ma pewne zalety:

  • Jest bardzo szybki.
  • Jest wyjątkowo solidny.
  • Jest niezwykle przenośny (np. Kod bajtowy skompilowany 10 lat temu w Windows 95 działa dziś dobrze w OS X).

i niektóre słabości:

  • Podstawowe biblioteki GUI (Swing ...) pokazują ich wiek (pomoce dodatków stron trzecich tutaj).
  • Sam język może być mniej szczegółowy (np. Sprawdzone wyjątki ...).
  • Czas uruchamiania może być szybszy (choć cały czas się poprawia).

Mówiąc konkretnie o platformie Java , jest jeszcze jeden punkt:

  • Istnieje wiele języków, które działają na JVM i współpracują z Javą.
Joonas Pulakka
źródło
19
Ekstremalnie szybko? W porównaniu do czego?
HardCode,
18
@HardCode: W porównaniu do dowolnego tłumaczonego języka lub większości skompilowanych języków. W niektórych przypadkach C i C ++ można przyspieszyć, ale jest to trudne i staje się coraz trudniejsze, gdy rośnie liczba rdzeni. Dzięki współbieżności Java (efektywnemu wykorzystaniu wielu rdzeni) jest o wiele łatwiej osiągnąć w praktyce.
Joonas Pulakka
5
@HardCode, najwyraźniej JVM jest najszybszym dostępnym środowiskiem wykonawczym dostępnym dla prawie każdego zinterpretowanego języka (w przeciwieństwie do tych, które sami hakerzy stworzyli)
14

To jest tak prawdziwe dzisiaj jak wtedy - to znaczy nie do końca. Java pisz raz, testuj i debuguj wszędzie. Pewnie, że jest to o wiele mniej pracy niż całkowicie nowy port, ale generalnie jest to więcej pracy, niż początkowo nam się wydawało.

Nasz produkt ma serwer Java, który będzie działał w systemie Windows lub Linux, ale widzieliśmy z nim specyficzne problemy z systemem operacyjnym i upewnijmy się, że w razie potrzeby mamy do dyspozycji zarówno serwery Linux, jak i Windows. Interfejsy użytkownika Java mają zwykle więcej problemów niż serwery (choć wiele z nich ma charakter kosmetyczny i dlatego można je zignorować w zależności od aplikacji).

Chociaż nie jest to dla mnie język, sieć jest platformą z wyboru wielu platform. Interfejs HTML / JavaScript oznacza, że ​​twoja aplikacja będzie działać na prawie każdej platformie klienckiej, a w większości przypadków to był prawdziwy cel - nie musisz się martwić, czy to Mac, czy PC, która wersja systemu operacyjnego i tak dalej.

Oczywiście nadal będziesz dyktować platformę serwerową, ale kiedy ludzie stają się bardziej elastyczni, szczególnie w czasach, gdy większość firm już obsługuje wiele serwerów Windows i Linux.

Jon Hopkins
źródło
8
Dobra odpowiedź. Oczywiście upewnienie się, że aplikacja działa poprawnie we wszystkich wersjach przeglądarki, może być również problemem.
Tim Goodman,
5
@Tim: dobra uwaga. Wierzę, że aplikacje przeglądarkowe są znacznie bardziej „wszędzie testowane i debugowane” niż aplikacje komputerowe Java.
Joonas Pulakka
5
@Tim: +1. Uzyskanie takiej samej aplikacji internetowej we wszystkich głównych przeglądarkach jest tak samo trudne, jak uzyskanie takiej samej aplikacji Java w wielu systemach operacyjnych.
Jewgienij Brikman,
3
„pisz raz, debuguj wszędzie” nie jest moim zdaniem prawdą. tak długo, jak jesteś rozsądny i unikasz zależności od platformy, nie miałem problemów z uruchomieniem tego samego kodu Java na wielu platformach (w tym GUI). Tak, oczywiście, powinieneś to przetestować, ale myślę, że w ciągu prawie 15 lat pisania kodu w Javie tylko raz miałem poważny problem z przenośnością (co było moją własną winą za zakodowanie na stałe separatorów katalogów Windows zamiast używania pomocniczo wieloplatformowej Java File.pathSeparator !)
mikera
2
@mikera - Widzieliśmy problemy między Linuksem a Windowsem, które nie miały nic wspólnego z naszym kodem. Są rzadkie, ale istnieją.
Jon Hopkins
9

Osobiście powiedziałbym, że Java jest nadal preferowanym językiem międzyplatformowym i prawdopodobnie pozostanie tam przez pewien czas (obok aplikacji internetowych). Napisałem więcej na ten temat w tym poście na Javie jako platformie z wyboru , ale w szczególności na wielu platformach:

  • Tak długo, jak jesteś ostrożny ze swoimi zależnościami (np. Unikając bibliotek, które używają JNI do łączenia się z kodem natywnym), Java może być napisana bez zmian na wszystkich głównych platformach JVM

  • Beacuse Java jest zwykle dystrybuowana jako niezależny od maszyny kod bajtowy, można uruchomić bez ponownej kompilacji na dowolnej maszynie JVM (ponieważ lokalna maszyna JVM obsługuje kompilację JIT na rodzimy kod). Na przykład udało mi się uzyskać rozsądną złożoną aplikację GUI do pierwszego uruchomienia na komputerze Mac po opracowaniu w systemie Windows - z tym samym plikiem jar . Porównaj to z większością innych języków wieloplatformowych, które zazwyczaj wymagają różnych bibliotek lub rekompilacji dla innej platformy.

  • Wiele podstawowych bibliotek, których potrzebujesz (GUI, sieci, IO itp.), Stanowi część standardowego środowiska wykonawczego i jest napisanych na wiele platform. Dzięki temu nie musisz szukać i testować bibliotek między platformami, masz gwarancję, że prawie wszystko, czego potrzebujesz, znajduje się już w środowisku wykonawczym.

mikera
źródło
3

Myślę, że masz te możliwości:

1) użyj albo

  • skompilowany lub
  • język interpretowany.

2) Jak spakujesz i dostarczysz swój kod?

  • Jeden „front-end”, jeden plik binarny / skrypt?
  • Jeden „front-end”, wiele plików binarnych / skryptów?
  • Wiele „front-endów”, wiele plików binarnych / skryptów?

Wybory te wpływają na wydajność, widoczność kodu i dystrybucję.

Czy masz coś przeciwko rozdawaniu kodu źródłowego? Skompilowane języki mogą być dla Ciebie. Wydaje się, że skompilowane języki osiągają lepsze wyniki w mikro-testach niż języki interpretowane (nawet JIT). Również jeśli zależysz od środowiska wykonawczego, takiego jak Java, Python, Ruby itp., Kod może być trudniejszy do rozpowszechnienia.

Odkryłem, że najpopularniejsze wieloplatformowe aplikacje komputerowe używają „jednego frontonu, wielu plików binarnych” przy użyciu C / C ++ i biblioteki widżetów międzyplatformowych, np. Audacity, Blender, Firefox, Google Earth, OpenOffice, Skype, Songbird, Stellarium, VLC.

LennyProgrammers
źródło
Popełniłeś interesujący błąd, wymieniając Skype w swoich przykładach, ale ta bardzo popularna aplikacja faktycznie została uruchomiona z Delphi / Pascal na Windows i przeniesiona z C / C ++ na Linux i Objective-C na MacOS / iPhone
Maksee
Myślę, że skompilowana / zinterpretowana dychotomia jest trochę myląca - Java w pewnym sensie też nie jest ani kompilowana do niezależnego od maszyny kodu bajtowego do dystrybucji (tj. Nie jest już w formie źródłowej), a następnie JIT skompilowana później do natywnego kodu na na dowolnej maszynie. Jest w pełni wieloplatformowy, ale zapewnia także natywną wydajność, a ponadto nie musisz rozpowszechniać źródła, jeśli nie chcesz. wygrana / wygrana / wygrana.
mikera
0

Powiem nie. Python i Ruby są często używane, podobnie jak javascript zarówno po stronie klienta, jak i serwera. Osobiście używam .NET i nie mam problemów z uruchomieniem go na Macu i Linuksie (podczas programowania na Windowsie)

-edit- słyszę, że LLVM staje się popularny, ale wciąż jest bardzo mały. To pozwoli ci używać wieloplatformowego C ++ w jednym pliku binarnym. Najwyraźniej zostanie wykonany w przeglądarce, ale nie widziałem żadnego przykładu, w którym pozwala on modyfikować dom lub wywoływać javascript.


źródło
LLVM nie polega na uruchomieniu w przeglądarce ... Mówisz o emscripten?
Camilo Martin
sprawdź datę. 4 lata temu emscripten nie istniał. NativeClient miał działać (i miał działać los), ale nie działał.
Teraz widzę datę, ale LLVM nigdy nie było specjalnie dotyczące przeglądarek, prawda?
Camilo Martin,
1
Nie. Chociaż chciałbym móc napisać C ++ lub inny język obsługiwany przez LLVM zamiast JS ...
W związku z tym ...
Camilo Martin
-1

Jeśli włączysz platformy mobilne do miksu, musisz także dołączyć rekompilację. Np. Android, j2me.

Conor
źródło