2012-01-19 38 views
5

Đó là sự hiểu biết của tôi rằng trình biên dịch Java tạo ra "mã byte", không phải "mã đối tượng". Trước hết, điều này có đúng không?Java có tạo mã đối tượng hoặc mã byte không?

Ngoài ra, đó chỉ là những gì cuốn sách của tôi nói, tôi đã tự hỏi tại sao điều này là chính xác. Sự khác nhau giữa mã byte và mã đối tượng là gì?

+5

Trình biên dịch Java biên dịch mã nguồn thành mã byte. Tôi chưa bao giờ nghe nói về "mã đối tượng". –

+1

một cuốn sách của một trong các giáo sư của bạn? :) là nó được viết bằng tiếng Anh? – milan

Trả lời

15

Mã byte chỉ là "mã đối tượng" cho Máy ảo Java. Không phải mã số gốc (ví dụ: x86). Thành thật mà nói, tôi hiếm khi nghe thuật ngữ "mã đối tượng" những ngày này - nói chung là rõ ràng hơn để nói về các thuật ngữ cụ thể hơn.

+0

Vì vậy, mã đối tượng là mã gốc? – Bhaxy

+5

@ Bhaxy: Không, tôi không nói vậy. [Wikipedia] (http://en.wikipedia.org/wiki/Object_code) mô tả nó là "trình biên dịch máy tính tạo ra". Đó là một thuật ngữ hơi mơ hồ, nhưng tôi muốn nói nó thường là "một biểu diễn phi văn bản của một chương trình, máy nhắm mục tiêu chứ không phải là con người". "Máy" có là JVM thay vì kiến ​​trúc gốc của máy tính bạn đang chạy. –

+0

@Bhaxy yeah bạn đã nhận nó :) – reversiblean

2

Khi bạn biên dịch chương trình java, chương trình sẽ chuyển sang byte-code. Khi bạn chạy tạo phẩm kết quả, JVM của nền tảng sau đó chạy (tốt, diễn giải) bytecode, biến nó thành các lệnh mức máy.

0

Java là nền tảng độc lập. Khi bạn biên dịch mã nguồn Java, nó được chuyển thành mã byte và khi ứng dụng chạy JRE trên máy khách, thực hiện mã byte.

0

Trình biên dịch Java (javac.exe) lấy các tệp Java (.java) làm đầu vào và đầu ra các tệp Java bytecode (.class) (nếu mã của bạn biên dịch thành công). Sau đó, bạn thực thi trình khởi chạy Java (java.exe) và trỏ nó đến bytecode của bạn. Sau đó, nó được chuyển tới máy ảo Java (JVM) để lấy mã của bạn phần còn lại của đường đi và chuyển đổi mã byte của bạn thành mã máy (hoặc bản địa).

Bạn có thể coi đó là mã đối tượng ở gần mã máy hơn và mã bytecode được thêm từ mã máy. Ngoài ra, bytecode là di động (là một trong những lợi thế lớn của ngôn ngữ Java), trong khi mã máy cần phải được "chuyển" bằng các phương tiện của quy trình thủ công (tức là biên dịch lại cho một nền tảng hoặc kiến ​​trúc đích khác).

Mã đối tượng là "gần như" mã máy, đó là loại ở giữa. Nó giống như một phần của mã máy. Vì tính di động của ngôn ngữ Java, bạn không thể dịch trình biên dịch mã nguồn của bạn trực tiếp thành mã máy. Bởi vì mã máy cần phải khác nhau đối với các nền tảng và kiến ​​trúc khác nhau. Nếu ai đó chạy bytecode của bạn trên Windows, JVM sẽ dịch mã byte của bạn thành một loại mã máy. Nếu ai đó chạy bytecode của bạn trên Mac OS X, JVM sẽ dịch bytecode của bạn thành một loại mã máy khác.

Bạn có thể nghĩ JVM là thông dịch viên cho mã byte của bạn. Mặc dù về mặt kỹ thuật, nó được gọi là biên dịch JIT (Just In Time). JVM là một phần của JRE (Java Runtime Environment) và trong khi các chương trình Java có nhiều nền tảng độc lập (bất kỳ hệ thống nào chạy JVM cũng có thể chạy các chương trình Java), phần JVM của JRE phụ thuộc vào nền tảng.

Phiên bản ngắn:

  • trình biên dịch Java bytecode sản xuất (biên soạn một nửa đường đi, nền tảng độc lập, chưa thể chạy).
  • Máy ảo Java tạo mã máy.
  • Mã đối tượng là một phần của mã máy kết quả.
  • Bytecode trở thành mã đối tượng tại thời điểm JIT.
  • Mã đối tượng trở thành mã máy (phần còn lại biên dịch, phụ thuộc nền tảng, có thể chạy).

Điều này có thể không chính xác 100% vì tôi cũng mới bắt đầu tìm hiểu nội dung này.Nhưng đây là sự hiểu biết của tôi về khái niệm này cho đến nay. Tôi hi vọng cái này giúp được.

1

Mã đối tượng C ở dạng mà chỉ hệ điều hành được biên dịch mới có thể diễn giải.

C mã - (. Ví dụ gcc)> C biên dịch -> mã đối tượng -> đầu ra trình biên dịch os

C đối tượng mã cho hệ điều hành mà nó được viết cho. Nếu bạn muốn mã C của bạn chạy trên một máy khác, bạn phải biên dịch lại nó.
Mã C được biên dịch trên Windows sẽ không chạy trên Linux mà không biên dịch lại.

trình biên dịch Java số-> Java (javac) -> Mã byte -> JVM

Trình biên dịch Java đưa ra mã byte chạy trên JVM của nó. Tất cả các idiosyncracies của hệ điều hành được đẩy xuống vào JVM, ẩn từ mã Java. Vì vậy, miễn là hệ điều hành của bạn có một JVM, bạn có thể chạy Java bytecode trên nó mà không cần biên dịch lại. Mã Java được biên dịch trên Windows có thể chạy trên bất kỳ hệ điều hành nào khác có cùng phiên bản JVM.

Cũng tham khảo difference between object code and byte code

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