2015-10-16 13 views
6

Tôi đang thiếu thứ gì đó cơ bản ở đây. Việc sử dụng việc biên dịch từ một ngôn ngữ nguồn sang bytecode (java) hoặc ngôn ngữ trung gian (.NET) là gì và sau đó chạy chúng từ bên trong JVM hoặc CLR?Tại sao chúng ta cần/sử dụng mã được quản lý (trên bản địa)?


Có hiệu suất giảm (dù nhỏ hoặc lớn) khi sử dụng mã được quản lý, nhưng lợi ích là gì? Tôi biết có bộ sưu tập rác và quản lý bộ nhớ nhưng ngay cả như vậy sẽ không tốt hơn để chỉ biên dịch nguồn gốc ngay mà không cần mức trung gian này?

Ngoài ra (tôi đang thêm điều này ở đây vì nó liên quan trực tiếp đến câu hỏi) - Rõ ràng Windows 10 Các ứng dụng phổ quát được biên dịch với .NET Native để biên dịch thành mã máy gốc. Tôi tò mò là tại sao điều này đã không được thực hiện trước với tất cả các chương trình.

+1

Một lợi thế lớn của bytecode là có thể chạy nó dù sao bạn đã triển khai VM.Phạm vi cho điều này bị giới hạn trong Windows bởi vì bạn chỉ thực sự nhắm vào một số kiến ​​trúc (nguyên tử, x86, v.v.) – Sammy

+0

.NET Native không đơn giản là "biên dịch thành mã máy" về cơ bản nó có jit sớm, để nó không cần để được lên án sau này. Điều này vẫn được chuyển đổi thành chính xác cùng một mã máy mà nó sẽ là trong jit; sự phóng đại quá mức của nó khiến nó nghe như bạn nghĩ nó đã trở thành bản địa C++. – Krythic

+0

@Krythic Tôi hiểu. Nhưng đó không phải là lựa chọn của tôi về từ ngữ, tôi đã trích dẫn từ liên kết tôi đã đề cập ([.NET Native] (https://msdn.microsoft.com/en-us/vstudio/dotnetnative.aspx)). –

Trả lời

2

Ngoài mọi thứ khác được chỉ ra trong các câu trả lời khác, lợi ích chính của phương pháp này là giảm chi phí quan trọng đạt được trong phát triển và bảo trì và khả năng mở rộng được cải thiện đáng kể của môi trường phát triển.

Xem xét trường hợp không có ngôn ngữ trung gian; bạn cần phát triển và biên dịch một trình biên dịch cho mỗi ngôn ngữ được hỗ trợ mỗi nền tảng được hỗ trợ. Giả sử bạn có ngôn ngữ L1, L2L3 và các nền tảng P1, P2P3. Điều này có nghĩa bạn sẽ cần phải phát triển và mantain 9 trình biên dịch khác nhau: C1 (L1, P1), C2 (L1, P2), C3 (L1, P3), C4 (L2, P1) vv

Mặt khác, có một ngôn ngữ chung trung tôi phép bạn phát triển 3 ngôn ngữ biên dịch cụ thể C1 (L1, I), C2 (L2, I)C3 (L3, I) và 3 trình biên dịch cụ thể nền tảng C4 (I, P1), C 5 (I, P2)C6 (I, P3).

Rõ ràng, nền tảng ngôn ngữ và nền tảng được hỗ trợ càng lớn thì khả năng giảm chi phí càng lớn.

Nó cũng mang lại cho bạn rất nhiều tính linh hoạt trong việc bổ sung các nền tảng hoặc ngôn ngữ được hỗ trợ trong tương lai; bất kỳ ngôn ngữ mới L4 sẽ chỉ yêu cầu sự phát triển của một trình biên dịch đơn C (L4, I) và bạn hỗ trợ ngay lập tức tất cả các nền tảng cho mức giá của một phát triển. Ngược lại, nếu bạn có một nền tảng mới P4, bạn sẽ chỉ cần phát triển C (I, P4) và, bingo, bạn có L1, L2L3 tất cả làm việc trong P4.

Về cơ bản, đây là một tình huống chiến thắng.

-1

Bytecode và JVM "shenanigans" có nghĩa là mã luôn được diễn giải theo cùng một cách, độc lập với nền tảng được chạy. Tôi nhớ một cách mơ hồ đọc từ lâu trước rằng Intel và AMD (và các bộ vi xử lý khác) thực hiện một số thao tác logic khác nhau, dẫn đến các kết quả khác nhau trên các bộ xử lý đó và có thể dẫn đến một số lỗi nền tảng chéo. Vì vậy, bytecode giải quyết điều đó và kết quả luôn luôn là hằng số. Mặt khác, nếu bạn biết bạn đang lập trình cho một nền tảng duy nhất và muốn có thêm hiệu suất, đó là nơi phát triển phần mềm nhúng (hoặc các ngôn ngữ cấp thấp). Java và .NET được sử dụng tốt nhất khi bạn biết hiệu suất không quan trọng.

0

Đó là do việc biên dịch thành mã gốc sẽ làm cho nền tảng chương trình của bạn được chỉ định. Tuy nhiên, với việc biên dịch là ngôn ngữ trung gian, chương trình của bạn là di động và có thể chạy trên mọi nền tảng nếu có một JVM/CLR được chỉ định trên nền tảng.

Cả Java và .Net đều sử dụng tính năng biên dịch trong thời gian để chúng có thể cung cấp tính di động nhưng hiệu suất vẫn tốt hơn so với sử dụng trình thông dịch.

Bên cạnh đó, Microsoft đã cung cấp Ngen cùng với Visual Studio cho biên dịch mã Net để mã gốc:
https://msdn.microsoft.com/en-us/library/6t9t5wcf(v=vs.110).aspx
Một khác biệt chính giữa Ngen và Net Native là Ngen vẫn phụ thuộc vào .Net Framework và Net Native biên dịch mã bắt buộc của .Net cùng với chương trình để cài đặt .NET Framework là không cần thiết.

-1

Trong java khi mã byte được tạo, cụ thể cho một loại kiến ​​trúc cụ thể, giúp java đạt được khả năng 'biên dịch khi chạy bất cứ đâu'. Ngoài ra, nó có bộ nhớ rất ít.

2

Đây là từ MSDN:

Lợi ích của mã số quản lý

ngôn ngữ quản lý cung cấp một cách tổng quát để xử lý các chi tiết của quản lý bộ nhớ và thu gom rác thải, với chi phí của một lượng nhỏ trên đầu. Sự cân bằng này giải phóng bạn khỏi các tác vụ dễ bị lỗi và cho phép bạn viết các chương trình nhỏ gọn, dễ đọc hơn và không có lỗi.

Lợi ích của mã Un-quản lý

Nếu bạn sử dụng một ngôn ngữ không được quản lý, chẳng hạn như C++, bạn phải viết thêm code để quản lý bộ nhớ và an ninh, và dọn dẹp đối tượng sau khi họ đã phục vụ mục đích của họ. Các chi tiết về nhà vệ sinh rất phức tạp và không liên quan đến chức năng dự định của chương trình, vì vậy các nhà phát triển thường bỏ qua những nhiệm vụ này, bỏ qua chúng hoặc mất dấu chúng. Kết quả là, mã không được quản lý thường mất nhiều thời gian hơn và tốn thời gian để kiểm tra, và nó đòi hỏi đào tạo và kỷ luật lập trình lớn hơn.

Tuy nhiên, nhà phát triển thường thích mã không được quản lý bởi vì nó thực thi nhanh hơn, cho phép linh hoạt hơn trong việc sử dụng con trỏ và cho phép kiểm soát trực tiếp phần cứng.

+2

Có vẻ như câu hỏi của Aniruddha Varma không phải là điều gì đó về mã được quản lý/không được quản lý. Ông đang tự hỏi tại sao một ngôn ngữ trung gian được sử dụng trong chương trình Java/.Net. –

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