Các ứng dụng Android được giải thích thay vì biên dịch. Điều này có làm cho chúng chậm hơn ứng dụng iOS khi chạy không?
Các ứng dụng Android được giải thích thay vì biên dịch. Điều này có làm cho chúng chậm hơn ứng dụng iOS khi chạy không?
Câu trả lời:
Java không được giải thích trên Android. Các ứng dụng Android được nhà phát triển biên dịch sang mã byte . Bytecode là một đại diện nhỏ gọn của chương trình: nhỏ hơn mã nguồn được lập trình viên viết, nhưng vẫn không được CPU thực thi trực tiếp. Một số tối ưu hóa, chẳng hạn như loại bỏ mã chết, có thể được thực hiện ở giai đoạn này.
Khi bạn tải ứng dụng trên một thiết bị, Dalvik JVM sẽ biên dịch mã byte thành mã thực thi riêng, giống như khi nó sắp chạy. Đây là biên dịch chỉ trong thời gian . Nó gây ra sự chậm chạp ngắn trong khi chương trình chờ được biên dịch, nhưng sau đó không có chi phí hiệu năng, bởi vì mã đã được biên dịch thành mã thực thi riêng.
Có một số lợi thế về hiệu suất để thực hiện theo cách này thay vì biên dịch trước trên máy tính của nhà phát triển. Ứng dụng có thể được biên dịch cho CPU cụ thể trên điện thoại, tận dụng các tính năng phần cứng và sử dụng các đặc tính hiệu suất của nó. Ví dụ, nó có thể sử dụng các hoạt động điểm nổi phần cứng nếu CPU hỗ trợ nó. Ngoài ra, một trình biên dịch JIT thông minh (phải thừa nhận, Dalvik không hoàn toàn thông minh này) có thể theo dõi cách chương trình chạy và thực hiện tối ưu hóa dựa trên cách sử dụng chương trình trong thực tế. Nó có thể biên dịch lại mã với gợi ý nhánh tốt hơn một khi nó đã thấy các tùy chọn nào được bật và tắt trong môi trường của bạn, trên điện thoại của bạn. Một trình biên dịch lên phía trước không có thông tin này để sử dụng.
Dalvik sử dụng bộ đệm Dalvik và các kỹ thuật khác để giảm thiểu những hạn chế của quá trình biên dịch JIT. JVM mới cho Android L trở lên, ART, thay thế hoàn toàn JIT bằng trình biên dịch trước thời hạn . Điều này biên dịch mã byte thành mã thực thi riêng khi ứng dụng được cài đặt, để có được hầu hết các lợi thế của JIT mà không bị trì hoãn tải ứng dụng.
Đừng quên rằng các ứng dụng Android không hoàn toàn bao gồm Java. Các nhà phát triển có NDK để viết tất cả hoặc một phần ứng dụng của họ bằng C hoặc C ++, cho các phần quan trọng về hiệu năng của ứng dụng, đặc biệt là cho các trò chơi. Các giao diện mục đích đặc biệt như OpenGL và Rendercript cho phép các lập trình viên tận dụng phần cứng đặc biệt như bộ đồng xử lý GPU và SIMD cho một số loại tính toán.
Vì vậy, thực sự, không có câu trả lời đơn giản cho câu hỏi của bạn. Sử dụng JIT thay vì biên dịch trước làm cho một số thứ nhanh hơn, một số thứ chậm hơn. Đây chỉ là một phần trong hiệu năng tổng thể của HĐH.
Vì đây là một câu hỏi rộng, đây là một câu trả lời rộng.
"Các ứng dụng iOS có nhanh hơn các ứng dụng Android vì các ứng dụng Android được diễn giải không?"
Trước hết, các ứng dụng iOS không "nhanh hơn" ứng dụng Android.
Thứ hai, liên quan đến vấn đề "Ứng dụng Android được giải thích." Đây là điều bạn nói về điện toán, như "15 năm trước": như bạn có thể thấy từ cuộc thảo luận ở trên, tình hình ngày nay phức tạp hơn nhiều; công nghệ hoàn toàn mới đã ra đời. Khái niệm "biên dịch nhanh hơn giải thích!" là so sánh có liên quan, bạn biết đấy, perl với mã máy 20 năm trước; mọi thứ đã chuyển sang rất nhiều vấn đề không thể thực sự được áp dụng rõ ràng cho "iOS V Android" ngày hôm nay.
Thứ ba, có những vấn đề khác trong lập trình di động hoàn toàn tràn ngập những cân nhắc như vậy. Chỉ cần một ví dụ trên thực tế, các lập trình viên di động đã tự mình xử lý các danh sách hình ảnh cuộn lớn, tải chậm và các vấn đề tương tự. Làm thế nào hai hệ điều hành và các thư viện phổ biến khác nhau xử lý các vấn đề quan trọng này thường làm thay đổi các vấn đề khác.
Thứ tư, chỉ một vấn đề áp đảo nữa trên điện thoại di động là các vấn đề của chipset đồ họa và các mối quan hệ phức tạp khác nhau của phần mềm, OpenGL, v.v. Ví dụ, Apple sắp ra mắt với một hệ thống mà họ sử dụng "Metal" liên quan đến những vấn đề này và Android sẽ ra mắt với "điều" riêng của họ trong lĩnh vực này. Những vấn đề xung quanh đường ống đồ họa cực kỳ quan trọng đối với cách ứng dụng "cảm nhận" trong tay bạn.
Câu trả lời rất ngắn cho câu hỏi của bạn là "biên dịch V. diễn giải" về cơ bản là một điểm thảo luận lỗi thời mà bạn biết?
(Ngoài ra, tôi đặc biệt không thấy Note3 "chậm" hơn iPhone. Ngoài ra, một số trong số này là vật phẩm thuần túy - có điện thoại Android rẻ tiền: đơn giản là không có iPhone hiệu suất thấp được sản xuất, vì vậy một số người có thể không chính xác ý tưởng từ đây.)
Bởi vì các ứng dụng được giải thích không có nghĩa là chúng luôn chậm. Đôi khi chúng mạnh mẽ và năng động hơn so với biên dịch. Vì tất cả các mã trong ứng dụng đã biên dịch được biên dịch một lần và đầu ra được giữ ở dạng thư viện hoặc tệp thực thi, trong khi ở ngôn ngữ được giải thích, một lần có thể thay đổi ngẫu nhiên chuỗi thực thi. Vì vậy, tôi có thể nói, nó phụ thuộc vào nhà phát triển cho nhà phát triển và cách lập trình.
Tuy nhiên, Java (ngôn ngữ lập trình của Android) không được giải thích mà là JIT được biên dịch. Điều đó có nghĩa là các chương trình Android biên dịch ngay trước khi bạn chạy chúng, mang lại hiệu năng tương đối hợp lý với Objective C.
Gần đây, khung ART của Android biên dịch trước các ứng dụng, vì vậy chúng được chạy giống như các ứng dụng iOS. Nói cách khác, phiên bản tiếp theo của Android có lẽ sẽ nhanh như iOS.
Cập nhật
Ngôn ngữ lập trình thường rơi vào một trong hai loại: Biên dịch hoặc Phiên dịch. Với ngôn ngữ được biên dịch, mã bạn nhập được rút gọn thành một tập hợp các hướng dẫn cụ thể của máy trước khi được lưu dưới dạng tệp thực thi. Với các ngôn ngữ được thông dịch, mã được lưu theo cùng định dạng mà bạn đã nhập. Các chương trình được biên dịch thường chạy nhanh hơn các chương trình được giải thích vì các chương trình được giải thích phải được giảm xuống theo hướng dẫn của máy khi chạy. Tuy nhiên, với ngôn ngữ được dịch, bạn có thể thực hiện những điều không thể thực hiện bằng ngôn ngữ được biên dịch. Ví dụ, các chương trình diễn giải có thể tự sửa đổi bằng cách thêm hoặc thay đổi các chức năng trong thời gian chạy. Việc phát triển các ứng dụng trong môi trường được giải thích cũng thường dễ dàng hơn vì bạn không phải biên dịch lại ứng dụng của mình mỗi lần bạn muốn kiểm tra một phần nhỏ.