2010-02-04 73 views
13

Tôi đã nghe nhiều lần Java thực hiện biên dịch JIT (just-in-time) và các bytecode của nó có thể di động trên các nền tảng được JVM giải nghĩa. Tuy nhiên, tôi không thực sự biết những gì bytecode là gì, và những gì JVM thực sự có ý nghĩa trong kiến ​​trúc ngôn ngữ Java; Tôi muốn biết thêm về họ.Bytecode là gì và JVM xử lý chúng như thế nào

+3

hy vọng http://en.wikipedia.org/wiki/Bytecode sẽ hữu ích. – Jichao

Trả lời

36

JVM (Máy ảo Java) có hướng dẫn được đặt giống như một máy thực. Tên được đặt cho tập lệnh này là Java Bytecode. Nó được mô tả trong Java Virtual Machine Specification. Các ngôn ngữ khác được dịch sang bytecode trước khi thực hiện, ví dụ như ruby ​​và python. Java bytecode là ở mức khá thấp trong khi python là cao hơn nhiều.

Giải thích và biên dịch JIT là hai chiến lược khác nhau để thực thi bytecode. Giải thích các quá trình bytecode một tại một thời điểm làm thay đổi trạng thái máy ảo được mã hóa trong mỗi lệnh. Biên dịch JIT dịch bytecode thành các hướng dẫn có nguồn gốc từ nền tảng máy chủ thực hiện các hoạt động tương đương.

Giải thích thường bắt đầu nhanh nhưng chậm trong khi thực thi, trong khi JIT có chi phí khởi động cao hơn nhưng chạy nhanh hơn sau đó. Các JVM hiện đại sử dụng sự kết hợp giữa các kỹ thuật giải thích và JIT để có được lợi ích của cả hai. Bytecode được hiểu đầu tiên trong khi JIT dịch nó trong nền. Khi quá trình biên dịch JIT hoàn tất, JVM sẽ chuyển sang sử dụng mã đó thay vì trình thông dịch. Đôi khi việc biên dịch JIT có thể tạo ra các kết quả tốt hơn so với việc biên dịch trước thời gian được sử dụng cho C và C++ bởi vì nó năng động hơn.JVM có thể theo dõi tần suất mã được gọi và đường dẫn thông thường thông qua mã là gì và sử dụng thông tin này để tạo ra mã hiệu quả hơn trong khi chương trình đang chạy. JVM có thể chuyển sang mã mới này giống như khi nó ban đầu chuyển từ trình thông dịch sang mã JIT.

Cũng giống như có các ngôn ngữ khác biên dịch mã gốc, như C, C++, Fortran; có các trình biên dịch cho các ngôn ngữ khác xuất ra bytecode JVM. Một ví dụ là ngôn ngữ scala. Tôi tin rằng groovy và jruby cũng có thể chuyển đổi sang bytecode java.

+1

+1 rất được giải thích – stacker

+1

_The bytecode đầu tiên được giải thích trong khi JIT đang dịch nó trong background_. Đây có phải là một khái niệm mutli-threaded hay một quá trình tuần tự không? – jmishra

+2

@ ladiesMan217, tất nhiên, tùy thuộc vào việc thực hiện cụ thể; nhưng tôi hy vọng rằng các JVM hiện đại chạy trình biên dịch JIT trong một luồng song song –

13

Bytecode là một bước giữa mã nguồn của bạn và mã máy thực tế. JVM là những gì cần bytecode và dịch nó thành mã máy.

JIT đề cập đến thực tế là JVM thực hiện bản dịch này một cách nhanh chóng khi chương trình được thực thi, chứ không phải trong một bước duy nhất (như trong một biên soạn theo truyền thống/ngôn ngữ liên quan như C hay C++)

Điểm bytecode là bạn nhận được hiệu suất tốt hơn so với một ngôn ngữ diễn giải nghiêm ngặt (ví dụ như PHP) vì bytecode đã được biên dịch và tối ưu hóa một phần. Ngoài ra, do bytecode không cần phải được giải thích trực tiếp bởi CPU, nó không cần phải gắn với bất kỳ cấu trúc CPU cụ thể nào làm cho nó dễ di chuyển hơn.

Những bất lợi của khóa học là nó thường sẽ chậm hơn một chút so với ứng dụng được biên dịch nguyên bản vì JVM vẫn phải thực hiện một số công việc dịch mã byte sang mã máy.

+0

"JVM là những gì cần bytecode và dịch nó thành mã máy." Không phải luôn luôn, phải không? –

0

Khi bạn biên dịch một cái gì đó trong Java, trình biên dịch tạo ra bytecode. Đây là mã nguồn gốc cho Máy ảo Java. JVM sau đó dịch mã byte sang mã gốc cho bộ xử lý/kiến ​​trúc của bạn, đây là nơi mà JIT xảy ra. Nếu không có JIT, JVM sẽ dịch từng chương trình một lệnh, rất chậm.

0

jcyang đã được cung cấp một liên kết đến wikipedia, nhưng điều này là một trận đấu tốt hơn cho câu hỏi của bạn:

Java Bytecode

Java Compiler biên dịch mã Java Source để các file class. Các phương thức của lớp được dịch sang Byte Code và máy ảo Java (JVM) giải thích mã byte này. Trình biên dịch Just In Time (JIT) có thể được sử dụng để dịch mã byte thành mã máy để tăng tốc độ thực hiện các phương thức lớp.

0

Bytecode là JVM tương đương với hướng dẫn ngôn ngữ máy.

0

JVM là một máy ảo được sử dụng để chạy mã Java. Chúng ta có thể so sánh JVM với một trình biên dịch như không có nó, chúng ta không thể biên dịch mã Java và tạo ra các ứng dụng. JVM không là gì ngoài một đoạn mã sẽ kiểm chứng mã Java của bạn. Nhiệm vụ chính của JVM là chuyển đổi mã Java thành mã Java bytecode và biên dịch nó. Điều này làm cho việc phát triển Java trở nên dễ dàng. Hãy xem this article nếu bạn muốn biết thêm về Java Virtual Machine hoạt động như thế nào?

0

Oracle jdk

mã lập trình rằng, một khi biên soạn, được điều hành thông qua một máy ảo thay vì bộ vi xử lý máy tính. Bằng cách sử dụng phương pháp này, mã nguồn có thể chạy trên bất kỳ nền tảng nào khi nó đã được biên dịch và chạy qua máy ảo.

Bytecode là định dạng được biên dịch cho các chương trình Java. Khi một chương trình Java đã được chuyển thành bytecode, nó có thể được chuyển qua một mạng và được thực thi bởi Java Virtual Machine (JVM). Các tệp byte thường có đuôi .class.

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