Java (vẫn) là ngôn ngữ đa nền tảng được lựa chọn? [đóng cửa]


20

Khi tôi bắt đầu sử dụng Java vào những năm 1990, tất cả chỉ là " Viết một lần, chạy mọi nơi! " Từ ngày đầu tiên. Điều đó có lẽ hoàn toàn đúng khi đó và tôi cũng là một phần của dàn hợp xướng.

Tôi không chắc phải nghĩ gì về điều đó nữa, xem xét tất cả các ngôn ngữ khác sử dụng thời gian chạy đa nền tảng (python, flash, perl, html, php ...). Nhưng tôi vẫn thấy nhiều đối số nói rằng bạn nên sử dụng Java vì nó được cho là tốt hơn để phát triển đa nền tảng.

Vì vậy, điều đó có còn đúng ngày hôm nay không? Java có còn là ngôn ngữ được lựa chọn để phát triển đa nền tảng không?

  • Hãy cụ thể tập trung vào các khía cạnh đa nền tảng.
  • Tôi không yêu cầu so sánh tính năng ngôn ngữ chung.

Cập nhật: Phản hồi tuyệt vời cho đến nay! Hầu hết các câu trả lời dường như ủng hộ Java hoặc web. Bất kỳ đầu vào từ đám đông kịch bản?



3
Nhận xét này không giải quyết được cốt lõi của câu hỏi, nhưng đây là một yếu tố cần xem xét: các ứng dụng web dựa trên Java nhắm vào người dùng Windows là điều cần tránh xa. Oracle JVM cho Windows đã có rất nhiều vấn đề bảo mật gần đây. Như vậy, bạn có thể thấy rằng những người dùng thông thái sẽ không sử dụng các ứng dụng web dựa trên Java vì họ đã gỡ cài đặt JVM.
chọc

Câu hỏi của bạn dựa trên giả định rằng đó thậm chí là ngôn ngữ đa nền tảng được lựa chọn để bắt đầu.
Lucas Ramage

Câu trả lời:


10

các ngôn ngữ theo phong cách kịch bản như python cũng giúp phát triển đa nền tảng dễ dàng hơn. Bây giờ, việc bạn có thích Python (hoặc các ngôn ngữ khác) hay không phụ thuộc vào bạn và có lẽ chúng ta không cần phải bắt đầu cuộc tranh luận đó ở đây.

Java cố gắng buộc bạn viết mã sẽ chạy một cách có thể di chuyển, trong khi python cho phép bạn viết mã di động. Bản thân ngôn ngữ python sẽ chạy một cách hợp lý, nhưng các thư viện bên ngoài có thể hoặc không. Ngoài ra, python sẽ tự do cấp quyền truy cập vào các dịch vụ cụ thể của nền tảng.

Java có lợi thế không? Tôi nghĩ trong cả hai trường hợp bạn có thể viết mã di động dễ dàng tương tự. Đó là, bạn có thể viết mã và nó thường sẽ hoạt động trên các nền tảng khác nhau. Nhưng bạn không thể thoát khỏi việc chỉ viết mã và cho rằng nó sẽ hoạt động ở mọi nơi. Tôi đã làm việc với một dự án python sản xuất phiên bản cho Windows, Linux và Mac và chúng tôi gặp rất ít vấn đề về nền tảng. (Điều duy nhất tôi nhớ là do lỗi trong thư viện chúng tôi đang sử dụng pygame, gây ra sự cố vẽ trên Linux. Điều này đã được khắc phục bằng cách nâng cấp phiên bản pygame mà chúng tôi đã sử dụng)

Một vấn đề khác là triển khai. Nếu bạn muốn phân phối các chương trình độc lập chạy mã của mình, bạn sẽ phải sản xuất các phiên bản khác nhau cho các nền tảng khác nhau. Đối với Java, bạn có thể phân phối một phiên bản và giả sử rằng người dùng đã cài đặt Java hoặc có thể cài đặt phiên bản đó. Trong trường hợp này, Java có thể thắng trong sự đơn giản của bộ phận triển khai.

Cuối cùng, tôi nghĩ nó thuộc về ngôn ngữ nào bạn thích làm việc và loại triển khai nào bạn cần thực hiện.


18

Trong khi Java có thể không những hay chỉ khả thi cụ đa nền tảng, nó có một số ưu điểm:

  • Nó cực kỳ nhanh.
  • Nó cực kỳ mạnh mẽ.
  • Nó cực kỳ di động (ví dụ: mã byte được biên dịch 10 năm trước trong Windows 95 chạy tốt trong OS X ngày nay).

và một số điểm yếu:

  • Các thư viện GUI lõi (Xoay ...) đang hiển thị tuổi của họ (trợ giúp của bên thứ 3 tại đây).
  • Bản thân ngôn ngữ có thể ít dài dòng hơn (ví dụ: các trường hợp ngoại lệ được kiểm tra ...).
  • Thời gian khởi động có thể nhanh hơn (mặc dù nó luôn được cải thiện).

Khi nói cụ thể về nền tảng Java , có một điểm nữa:

  • khá nhiều ngôn ngữ chạy trên JVM và tương tác với Java.

19
Vô cùng nhanh? So với cái gì?
HardCode

18
@HardCode: So với bất kỳ ngôn ngữ được giải thích hoặc hầu hết các ngôn ngữ được biên dịch. C và C ++ có thể được tạo ra nhanh hơn trong một số trường hợp nhưng nó khó và tiếp tục khó hơn khi số lượng lõi tăng lên. Với đồng thời Java (sử dụng nhiều lõi một cách hiệu quả) là cách dễ dàng hơn để đạt được trong thực tế.
Joonas Pulakka

5
@HardCode, rõ ràng JVM là thời gian chạy nhanh nhất có sẵn cho hầu hết mọi ngôn ngữ được dịch (trái ngược với ngôn ngữ mà các tin tặc ngôn ngữ tự tạo ra)

14

Điều đó đúng như ngày nay khi nó quay lại - đó là nói không hoàn toàn. Java được viết một lần, kiểm tra và gỡ lỗi ở mọi nơi. Chắc chắn rằng đó là công việc ít hơn nhiều so với một cổng hoàn toàn mới nhưng nó thường hoạt động nhiều hơn so với sự cường điệu ban đầu mà chúng tôi tin tưởng.

Sản phẩm của chúng tôi có máy chủ Java sẽ chạy trên Windows hoặc Linux nhưng chúng tôi đã thấy các sự cố cụ thể của HĐH với nó và đảm bảo rằng chúng tôi có cả máy chủ Linux và Windows để hỗ trợ / kiểm tra nếu cần. Các giao diện người dùng Java có xu hướng có nhiều vấn đề hơn các máy chủ (mặc dù nhiều máy tính là mỹ phẩm và do đó có khả năng có thể bị bỏ qua tùy thuộc vào ứng dụng).

Mặc dù không hoàn toàn là một ngôn ngữ đối với tôi, web là nền tảng đa nền tảng được lựa chọn. Giao diện người dùng HTML / JavaScript có nghĩa là ứng dụng của bạn sẽ chạy trên hầu hết mọi nền tảng máy khách và trong hầu hết các trường hợp là mục tiêu thực sự - không phải lo lắng rằng đó là máy Mac hay PC, phiên bản HĐH, v.v.

Tất nhiên, nhìn chung bạn vẫn sẽ ra lệnh cho nền tảng máy chủ nhưng khi mọi người trở nên linh hoạt hơn rất nhiều, đặc biệt là những ngày này khi hầu hết các công ty đã hỗ trợ kết hợp máy chủ Windows và Linux.


8
Câu trả lời tốt. Tất nhiên, đảm bảo ứng dụng của bạn hoạt động tốt trong tất cả các phiên bản trình duyệt khác nhau cũng có thể là vấn đề đau đầu.
Tim Goodman

5
@Tim: điểm tốt. Tôi tin rằng các ứng dụng trình duyệt là "thử nghiệm và gỡ lỗi ở mọi nơi" hơn nhiều so với các ứng dụng máy tính để bàn Java.
Joonas Pulakka

5
@Tim: +1. Để ứng dụng webapp hoạt động giống nhau trên tất cả các trình duyệt chính cũng khó như ứng dụng Java hoạt động giống nhau trên nhiều hệ điều hành.
Yevgeniy Brikman

3
"Viết một lần, gỡ lỗi ở mọi nơi" không đúng với kinh nghiệm của tôi. miễn là bạn hợp lý và tránh phụ thuộc vào nền tảng cụ thể, tôi không gặp vấn đề gì khi chạy cùng một mã Java trên nhiều nền tảng (bao gồm cả nền tảng GUI). Tất nhiên là bạn nên kiểm tra nó, nhưng tôi nghĩ rằng trong gần 15 năm mã hóa Java, tôi chỉ có một lần gặp sự cố về tính di động thực sự (đó là lỗi của tôi đối với các trình phân tách thư mục Windows mã hóa cứng thay vì sử dụng File.pathSeparator đa nền tảng của Java !)
mikera

2
@mikera - Chúng tôi đã thấy các vấn đề giữa Linux và Windows không liên quan gì đến mã của chúng tôi. Chúng hiếm nhưng chúng tồn tại.
Jon Hopkins

9

Cá nhân, tôi muốn nói rằng Java vẫn là ngôn ngữ đa nền tảng được lựa chọn và có khả năng vẫn ở đó một thời gian (bên cạnh các ứng dụng web). Tôi đã viết thêm một số chủ đề trong bài đăng này trên Java như là một nền tảng được lựa chọn , nhưng cụ thể là trên mặt trận đa nền tảng:

  • Miễn là bạn cẩn thận với các phụ thuộc của mình (ví dụ: tránh các thư viện sử dụng JNI để giao diện với mã gốc) thì Java có thể được viết không chạy trên tất cả các nền tảng JVM chính

  • Beacuse Java thường được phân phối dưới dạng mã byte độc ​​lập với máy, bạn có thể chạy mà không cần biên dịch lại trên bất kỳ JVM nào (do chính JVM cục bộ xử lý biên dịch JIT thành mã gốc). Ví dụ: tôi đã thành công trong việc giúp ứng dụng GUI phức tạp hợp lý chạy lần đầu tiên trên máy Mac sau khi phát triển trong Windows - với cùng một tệp jar . Trái ngược với hầu hết các ngôn ngữ đa nền tảng khác, thường yêu cầu các thư viện khác nhau hoặc biên dịch lại cho một nền tảng khác.

  • Rất nhiều thư viện cốt lõi bạn cần (GUI, mạng, IO, v.v.) là một phần của thời gian chạy tiêu chuẩn và được viết theo cách đa nền tảng. Vì vậy, bạn không cần phải đi săn và thử nghiệm các thư viện đa nền tảng, bạn được đảm bảo rằng hầu hết mọi thứ bạn cần đều đã có trong môi trường thời gian chạy.


3

Tôi nghĩ bạn có những lựa chọn đó:

1) sử dụng một

  • biên dịch hoặc
  • giải thích ngôn ngữ.

2) Làm thế nào bạn sẽ đóng gói và cung cấp mã của bạn?

  • Một "front-end", một nhị phân / script?
  • Một "front-end", nhiều nhị phân / script?
  • Nhiều "mặt trước", nhiều nhị phân / tập lệnh?

Những lựa chọn đó ảnh hưởng đến hiệu suất, khả năng hiển thị và phân phối mã soure.

Bạn có phiền khi cho đi mã nguồn của bạn? Ngôn ngữ biên dịch có thể là dành cho bạn. Các ngôn ngữ được biên dịch dường như hoạt động tốt hơn ở các điểm chuẩn vi mô so với các ngôn ngữ được giải thích (thậm chí là JITed). Ngoài ra nếu bạn phụ thuộc vào môi trường thời gian chạy như Java, Python, Ruby, v.v., mã của bạn có thể khó phân phối hơn.

Tôi thấy rằng hầu hết các ứng dụng máy tính để bàn đa nền tảng phổ biến đều sử dụng "Một mặt trước, nhiều nhị phân" bằng C / C ++ và thư viện tiện ích đa nền tảng, ví dụ :Audacity, Blender, Firefox, Google Earth, OpenOffice, Skype, Songbird, Stellarium, VLC.


Bạn đã mắc một lỗi thú vị khi liệt kê Skype trong các ví dụ của bạn, nhưng ứng dụng siêu phổ biến này thực sự đã được bắt đầu với Delphi / Pascal trên Windows và được chuyển bằng C / C ++ trên linux và Objective-C trên MacOS / iPhone
Maksee

Tôi nghĩ rằng sự phân đôi được biên dịch / giải thích là một chút sai lệch - Java về mặt nào đó cũng không phải vì nó được biên dịch thành mã byte độc ​​lập với máy để phân phối (tức là không còn ở dạng nguồn), và sau đó JIT được biên dịch thành mã gốc bất cứ máy nào bạn đang chạy. Nó hoàn toàn đa nền tảng, nhưng cũng mang lại cho bạn hiệu suất riêng, cộng với việc bạn không phải phân phối nguồn của mình nếu bạn không muốn. Thắng thắng thắng.
mikera

0

Tôi sẽ nói không. python và ruby ​​được sử dụng rất nhiều và javascript cho cả phía máy khách và máy chủ cũng vậy. Cá nhân tôi sử dụng .NET và không gặp vấn đề gì khi chạy nó trên mac và linux (trong khi phát triển trên windows)

-edit- tôi nghe nói LLVM đang trở nên phổ biến nhưng vẫn còn rất nhỏ. Điều đó sẽ cho phép bạn sử dụng C ++ đa nền tảng trong một nhị phân duy nhất. Rõ ràng nó sẽ được thực thi trên trình duyệt nhưng tôi chưa thấy một ví dụ nào cho phép bạn sửa đổi dom hoặc gọi javascript.


LLVM không phải là về việc chạy trên trình duyệt ... Bạn đang nói về emscripten?
Camilo Martin

kiểm tra ngày 4 năm trước, mô tả không tồn tại. NativeClient được cho là hoạt động (và đã chạy diệt vong) nhưng không được.

Bây giờ tôi thấy ngày, nhưng vẫn còn, LLVM chưa bao giờ cụ thể về trình duyệt, phải không?
Camilo Martin

1
Không. Mặc dù tôi ước mình có thể viết C ++ hoặc một số ngôn ngữ khác hỗ trợ LLVM thay vì JS ...


-1

Nếu bạn đưa các nền tảng di động vào hỗn hợp thì ít nhất bạn cũng cần bao gồm biên dịch lại. Ví dụ: android, j2me.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.