2010-08-24 33 views
106

OK, điều này thực sự nên được yêu cầu đối với một người nào đó từ Google, nhưng tôi chỉ muốn ý kiến ​​khác.Tại sao Android sử dụng Java?

Thậm chí Android 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à, quá chậm để diễn giải mã trên thiết bị di động? Khi giới thiệu Froyo, Google cho rằng 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, việc sử dụng Java trên mã gốc chậm hơn 2 lần. Có, tôi biết rằng việc sử dụng các ứng dụng mã được quản lý an toàn hơn về tính ổn định của hệ thống, vì máy ảo có kiểm soát tốt hơn chương trình, nhưng vẫn còn, hiệu suất này giảm rất lớn và tôi không thấy bất kỳ lý do gì để sử dụng nó.

+11

Mã Java không được giải thích, ít nhất không phải trên Android - được biên dịch và chạy trên máy ảo. –

+3

Tôi nghĩ Sun đã chứng minh Java có thể (trong một vài lĩnh vực, nhưng khá thường xuyên gần như) nhanh như mã gốc? Thêm vào đó, các chàng trai google là một gói thông minh - Tôi tin tưởng rằng JIT mà họ mới giới thiệu sẽ sớm hay muộn sản xuất mã rất tốt. – delnan

+0

Giới thiệu về vấn đề hiệu suất, mã gốc không phải lúc nào cũng nhanh hơn mã bytecode? Vì CPU có thể trực tiếp thực thi nó mà không có máy ảo? Tôi không quen thuộc với cách thức Dalvik và các máy ảo khác hoạt động, nhưng phải dịch bytecode thành mã máy đầu tiên, và điều đó phải ăn rất nhiều hiệu suất trên mã bản sao chỉ-copy-to-RAM và chạy ... –

Trả lời

88

Một số điểm:

  1. Java là một ngôn ngữ được biết đến, các nhà phát triển biết điều đó và không cần phải tìm hiểu nó

  2. nó khó khăn hơn để bắn mình với Java so với C/C++ từ nó không có con trỏ số học

  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 lên đó, và dễ dàng để bảo đảm

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

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

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

+5

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

+1

Về điều ứng dụng giả mạo - điều này nghe có vẻ thú vị. Nếu tôi sai, nhưng CPU x86 có khả năng bảo vệ thông qua chế độ nhắn tin và đổ chuông, do đó ứng dụng không thể thay đổi trang của nó 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. –

+0

CPU không liên quan gì đến ứng dụng độc hại đang làm những điều bất chính – Falmarri

1

Trước hết là về cùng một thứ sẽ có cửa sổ di động hoặc iPhone, khung .net cần máy ảo của riêng nó cũng như ca cao.

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

Để kết thúc, không có hiệu suất nào không phải là xấu, đó 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).

+0

Ca cao không dựa trên VM - đó là tất cả mã nguồn 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ự Smalltalk/Ruby/Python) - có các vấn đề về hiệu suất và tối ưu hóa riêng. Điều đáng chú ý là hầu hết các game iPhone phần lớn là C++ chứ không phải là Obj-C. – JulesLt

1

JIT mới đang chạy các ứng dụng nhanh gấp 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, nhưng JIT trên dalvikVM.

37

Ở 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

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

+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 chúng. – josefx

+1

Vậy tại sao cần phải cài đặt JDK khi phát triển trong Android? Là nó chỉ cho giả lập? – jiggunjer

4

Java có một đối số khá hấp dẫn đối với Google khi 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ọ.

Xin lưu ý rằng, về mặt kỹ thuật, Android không sử dụng thuần túy Java.

+1

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ữ "lạnh" hơn Java. – Earlz

17

Cải thiện độ ổn định của hệ thống là rất quan trọng trên 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 đáng tin cậy có thể khai thác điện thoại theo những cách thật sự khó chịu mà không cần 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 ứng dụng nào có thể khai thác hạt nhân hệ điều hành trừ khi có một lỗ hổng trong việc triển khai VM. Việc triển khai VM, lần lượt, có lẽ là nhỏ và có một 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 thành mã cho một máy ảo, chúng không cần phải được biên dịch lại cho phần cứng mới. Thị trường chip điện thoại đa dạng và thay đổi nhanh chóng, do đó, đó là một vấn đề lớn.

Ngoài ra, việc sử dụng Java làm cho ứng dụng mà mọi người viết sẽ ít bị khai thác hơn. Không có lỗi tràn bộ đệm, lỗi với con trỏ, v.v ...

4

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 đó là Dalvik.

Thứ hai, tôi chưa thấy một Java byte code phiên dịch từ năm 1995.

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

11

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 cho thấy mã gốc có thể chạy nhanh hơn ở đâu?

Tại sao lại là 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 để xem 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 trong 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 để giúp nhà phát triển dễ dàng hơn.

  • Java bảo vệ bạn khỏi nhiều vấn đề cố hữu trong mã nguồn gốc, như rò rỉ bộ nhớ, sử dụng con trỏ xấu vv

  • Java cho phép chúng để tạo ra các ứng dụng sandbox, và tạo ra một mô hình bảo mật tốt hơn vì vậy người ta mà Ứng dụng xấu không thể gỡ bỏ toàn bộ hệ điều hành của bạn.

4

Khi được chạm vào ở nơi 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 sẽ nói đó là đặt cược chống lạ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 khiến 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 hơn nữa một cách dễ dàng, hơn là 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, phí sử dụng ngôn ngữ dựa trên máy ảo trên bản địa không đáng kể (nút cổ chai cho các ứng dụng sử dụng dịch vụ web, như Twitter, chủ yếu là kết nối 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 như tất cả các máy ảo JIT biên dịch xuống mã gốc, tốc độ mã thô thường có thể so sánh với tốc độ gốc. Rất nhiều chậm trễ do các ngôn ngữ cấp cao hơn ít hơn khi thực hiện với VM overhead so với các yếu tố khác (một thời gian chạy đối tượng phức tạp, 'an toàn' kiểm tra truy cập bộ nhớ bằng cách kiểm tra giới hạn, vv).

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

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

Các vấn đề liên quan