Tại sao Android sử dụng Java? [đóng cửa]


114

OK, điều này thực sự nên được hỏi với một người nào đó từ Google, nhưng tôi chỉ muốn có ý kiến ​​khác.

Ngay cả Android cũng hỗ trợ các ứng dụng mã Native, công cụ phát triển chính là Java. Nhưng tại sao? Ý tôi là, không phải quá chậm để diễn giải mã trên thiết bị di động? Khi giới thiệu Froyo, Google cho biết trình biên dịch JIT mới có thể đạt được các ứng dụng nhanh hơn 2-5 lần. Điều này có nghĩa là sử dụng Java qua mã gốc sẽ chậm hơn gấp 2 lần.

Có, tôi biết rằng sử dụng các ứng dụng mã được quản lý sẽ an toàn hơn về độ ổn định của hệ thống, vì máy ảo có khả năng kiểm soát chương trình tốt hơn, tuy nhiên, sự sụt giảm hiệu suất này là rất lớn và tôi không hiểu tại sao phải sử dụng nó.


12
Mã Java không được thông dịch, ít nhất là không có trên Android - nó được biên dịch và chạy trên một máy ảo.
Radomir Dopieralski,

4
Tôi nghĩ rằng Sun đã chứng minh Java có thể (trong một số lĩnh vực, nhưng khá thường xuyên) nhanh như mã gốc? Thêm vào đó, những người của google là một nhóm thông minh - tôi tin rằng JIT mà họ giới thiệu gần đây sẽ sớm hoặc muộn tạo ra mã rất tốt.

1
@ b-gen-jack-o-neill Câu trả lời thực sự là không, vì máy ảo có thể cho biết mã nào đang được thực thi trong thời gian chạy và cách nó được thực thi. Ví dụ: Apple sử dụng LLVM trong OS X với mục đích rõ ràng là tối ưu hóa các chức năng đồ họa quan trọng về hiệu suất trong thời gian chạy. Điều này được thực hiện đặc biệt vì nó nhanh hơn các kỹ thuật mã gốc.
PeterAllenWebb

1
@ b-gen-jack-o-neill, Java bytecode có thể được biên dịch thành mã gốc trong thời gian chạy.
Mike Daniels

1
@ b-gen-jack-o-neill - VM có quyền truy cập vào nhiều thông tin hơn về môi trường excution so với một trình biên dịch thông thường, do đó nó có thể đưa ra nhiều lựa chọn thông minh hơn. Ở mức độ nào điều này bù đắp chi phí bổ sung sẽ khác nhau giữa các ứng dụng.
CurtainDog

Câu trả lời:


98

Một số điểm:

  1. Java là một ngôn ngữ đã biết, các nhà phát triển biết nó và không cần phải học nó

  2. khó có thể tự chụp bằng Java hơn là với mã C / C ++ vì nó không có số học con trỏ

  3. nó chạy trong một máy ảo, vì vậy không cần phải biên dịch lại nó cho mọi điện thoại hiện có và dễ bảo mật

  4. số lượng lớn các công cụ phát triển cho Java (xem điểm 1)

  5. một số điện thoại di động đã sử dụng Java ME, vì vậy Java đã được biết đến trong ngành

  6. sự khác biệt về tốc độ không phải là vấn đề đối với hầu hết các ứng dụng; nếu đó là bạn nên viết mã bằng ngôn ngữ cấp thấp


5
Chạy trên máy ảo (do đó không cần biên dịch lại) là một điểm cộng rất lớn. Ngoài ra, nó dễ dàng tách các quy trình lẫn nhau, ngăn chặn một ứng dụng giả mạo từ phá hủy điện thoại hoặc can thiệp với các ứng dụng khác
Falmarri

1
Về ứng dụng giả mạo - điều này nghe có vẻ thú vị. Hãy sửa tôi nếu tôi sai, nhưng CPU x86 có khả năng bảo vệ thông qua chế độ phân trang và đổ chuông, do đó ứng dụng không thể thay đổi trang trong bộ nhớ do đó không thể can thiệp vào ứng dụng khác ngoài việc sử dụng API OS. Nhưng tính năng này có CPU ARM không? Tôi thực sự không có ý tưởng. Nếu không, Điều này sẽ là tuyệt vời + cho Java trên nền tảng này.
B.Gen.Jack.O.Neill

CPU có gì để làm với một ứng dụng độc hại làm những việc bất chính
Falmarri

4
Bảo vệ bộ nhớ là một phần của một số kiến ​​trúc cpu. Nó ngăn một ứng dụng độc hại truy cập vào bộ nhớ được gán cho một ứng dụng khác. en.wikipedia.org/wiki/Memory_protection
josefx

1
@Falmarri: Đúng vậy. Về cơ bản nó rất đơn giản. Ứng dụng của bạn đã chỉ định không gian địa chỉ của riêng nó. Tất cả các địa chỉ bạn muốn truy cập đều được dịch bởi MMU. Bạn muốn truy cập địa chỉ 0x0000 và MMU dịch nó thành ví dụ 0x0E21. Và để ngăn bạn thay đổi địa chỉ cơ sở, hướng dẫn riêng của nó và chương trình của bạn khi khởi động bằng HĐH đã chỉ định mức priviledge thấp nhất. Nếu không, CLI đơn (ngắt vô hiệu hóa) hướng dẫn sẽ sụp đổ hệ thống ....
B.Gen.Jack.O.Neill

39

Ở cấp độ mã byte, Android không sử dụng Java. Nguồn là Java, nhưng nó không sử dụng JVM.


7
Đúng. Java là nguồn, nhưng nó không được biên dịch thành mã byte tương thích với máy ảo java. Đây là lý do tại sao họ có thể sẽ hầu hết / tất cả các tranh chấp bằng sáng chế với sun / oracle. Họ chỉ sử dụng cú pháp của ngôn ngữ.
John Gardner

1
Nó vẫn phải hỗ trợ hầu hết các chức năng của java vm. Vì vậy, họ không thể tối ưu hóa những thứ đó.
josefx

1
Sau đó, tại sao cần phải cài đặt JDK khi phát triển trong Android? Nó chỉ dành cho trình giả lập?
jiggunjer

@jiggunjer Android Studio được phát triển bằng Java, thực tế là vậy. Và trình giả lập cũng vậy.
Rudra B. Saraswat

20

Cải thiện độ ổn định của hệ thống là rất quan trọng trên một thiết bị như điện thoại di động.

Bảo mật thậm chí còn quan trọng hơn. Môi trường Android cho phép người dùng chạy các ứng dụng bán tin cậy có thể khai thác điện thoại theo những cách thực sự khó chịu mà không có bảo mật tuyệt vời. Bằng cách chạy tất cả các ứng dụng trong một máy ảo, bạn đảm bảo rằng không có ứng dụng nào có thể khai thác nhân hệ điều hành trừ khi có lỗ hổng trong quá trình triển khai VM. Đến lượt nó, việc triển khai VM được cho là nhỏ và có bề mặt bảo mật nhỏ, được xác định rõ.

Có lẽ quan trọng nhất, khi các chương trình được biên dịch để viết mã cho một máy ảo, chúng không phải được biên dịch lại cho phần cứng mới. Thị trường chip điện thoại rất đa dạng và thay đổi nhanh chóng, vì vậy đó là một vấn đề lớn.

Ngoài ra, việc sử dụng Java khiến ít có khả năng các ứng dụng mà mọi người viết sẽ tự khai thác được. Không vượt quá bộ đệm, lỗi với con trỏ, v.v.


Một câu trả lời khác của David nói rằng android không sử dụng
jvm

13

Mã gốc không nhất thiết phải nhanh hơn mã Java. Dữ liệu hồ sơ của bạn ở đâu cho thấy rằng mã gốc có thể chạy nhanh hơn?

Tại sao Java?

  • Android chạy trên nhiều nền tảng phần cứng khác nhau. Bạn sẽ cần phải biên dịch và tối ưu hóa mã gốc của mình cho từng nền tảng khác nhau này để thấy được bất kỳ lợi ích thực sự nào.

  • Có một số lượng lớn các nhà phát triển đã thành thạo Java.

  • Java có hỗ trợ mã nguồn mở rất lớn, với nhiều thư viện và công cụ có sẵn để làm cho cuộc sống của các nhà phát triển dễ dàng hơn.

  • Java bảo vệ bạn khỏi nhiều vấn đề vốn có trong mã gốc, như rò rỉ bộ nhớ, sử dụng con trỏ kém, v.v.

  • Java cho phép họ tạo các ứng dụng hộp cát và tạo mô hình bảo mật tốt hơn để một Ứng dụng xấu không thể phá hủy toàn bộ hệ điều hành của bạn.


7

Trước hết, theo Google, Android không sử dụng Java. Đó là lý do tại sao Oracle đang kiện Google. Oracle tuyên bố rằng Android vi phạm một số công nghệ Java, nhưng Google nói rằng đó là Dalvik.

Thứ hai, tôi đã không nhìn thấy trình thông dịch mã byte Java kể từ năm 1995.

Bạn có thể sao lưu phỏng đoán hiệu suất của mình với một số điểm chuẩn thực tế không? Phạm vi của các giả định của bạn dường như không hợp lý với thông tin cơ bản không chính xác mà bạn cung cấp.


4

Java có một lập luận khá thuyết phục để Google sử dụng nó trong Android: nó có một lượng lớn các nhà phát triển. Tất cả những nhà phát triển này đều đã sẵn sàng phát triển cho nền tảng di động của họ.

Hãy nhớ rằng, về mặt kỹ thuật, Android không sử dụng Java thuần túy .


2
Tôi nghĩ rằng tất cả những người quan tâm đến phát triển Di động cũng quan tâm đến các ngôn ngữ "ngầu" hơn Java.
Earlz

4

Như đã đề cập ở phần khác, vấn đề chính là Android được thiết kế như một hệ điều hành di động, để chạy trên nhiều loại phần cứng. Nó cũng xây dựng trên một khuôn khổ và ngôn ngữ quen thuộc với nhiều nhà phát triển di động hiện tại.

Cuối cùng, tôi muốn nói rằng đó là một cuộc đánh cược với tương lai - bất kỳ vấn đề hiệu suất nào tồn tại sẽ trở nên không liên quan khi phần cứng được cải thiện - bằng cách yêu cầu các nhà phát triển viết mã chống lại sự trừu tượng, Google có thể tách ra và thay đổi hệ điều hành cơ bản dễ dàng hơn nhiều so với các nhà phát triển đã mã hóa các API POSIX / Unix.

Đối với hầu hết các ứng dụng, chi phí sử dụng ngôn ngữ dựa trên VM thay vì ngôn ngữ gốc là không đáng kể (nút cổ chai đối với các ứng dụng sử dụng dịch vụ web, như Twitter, chủ yếu là mạng). Palm WebOS cũng thể hiện điều này - và sử dụng JavaScript thay vì Java làm ngôn ngữ chính.

Do hầu hết tất cả các máy ảo JIT đều biên dịch thành mã gốc, tốc độ mã thô thường có thể so sánh với tốc độ gốc. Nhiều sự chậm trễ do các ngôn ngữ cấp cao hơn ít liên quan đến chi phí VM hơn các yếu tố khác (thời gian chạy đối tượng phức tạp, kiểm tra quyền truy cập bộ nhớ 'an toàn' bằng cách thực hiện kiểm tra giới hạn, v.v.).

Cũng nên nhớ rằng bất kể ngôn ngữ được sử dụng để viết ứng dụng là gì, rất nhiều công việc thực tế được thực hiện trong các API cấp thấp hơn. Ngôn ngữ cấp cao nhất thường chỉ là chuỗi các lệnh gọi API với nhau.

Tất nhiên, có nhiều ngoại lệ cho quy tắc này - trò chơi, ứng dụng âm thanh và đồ họa đẩy giới hạn của phần cứng điện thoại. Ngay cả trên iOS, các nhà phát triển thường giảm xuống C / C ++ để có được tốc độ trong các lĩnh vực này.


1

JIT mới chạy các ứng dụng nhanh hơn 2 - 5 lần so với dalvikVM cũ (cả JAVA). Vì vậy, so sánh không phải là C trên JAVA, mà là JIT trên dalvikVM.


1

Trước hết, điều tương tự sẽ xảy ra với windows mobile hoặc iPhone, khung .net cần máy ảo riêng cũng như ca cao.

Và ngay cả khi hiệu suất không ở mức tốt nhất, bởi vì đó là cách diễn giải mã byte, android mang lại cho toàn bộ cộng đồng java như những nhà phát triển tiềm năng. Nhiều ứng dụng hơn, nhiều máy khách hơn, v.v.

Để kết thúc, không có hiệu suất nào là không tệ, đó là lý do tại sao java được sử dụng ngay cả trên các thiết bị nhỏ hơn (xem JavaMe).


Cocoa không dựa trên VM - tất cả đều là mã gốc đã được biên dịch - nhưng không giống như C / C ++ thuần túy, nó có thời gian chạy động (tương tự như Smalltalk / Ruby / Python) - có các vấn đề về hiệu suất và tối ưu hóa riêng. Đáng chú ý là hầu hết các trò chơi trên iPhone phần lớn là C ++ chứ không phải là Obj-C.
JulesLt
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.