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
Trả lời
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 rất được giải thích – stacker
_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
@ 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 –
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.
"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? –
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.
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 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.
Bytecode là JVM tương đương với hướng dẫn ngôn ngữ máy.
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?
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.
- 1. Bytecode được xác minh như thế nào trong JVM?
- 2. NOP trong bytecode JVM được sử dụng cho là gì?
- 3. Tìm hiểu về Java bytecode và JVM
- 4. Làm thế nào để chạy mã bytecode scala trên jvm?
- 5. LPCWSTR có nghĩa là gì và xử lý như thế nào?
- 6. Chức năng xử lý là gì và nó hữu ích như thế nào?
- 7. Ngôn ngữ/thời gian hoạt động dựa trên JVM tạo ra bytecode Java như thế nào?
- 8. Ứng dụng CAD được viết là gì và chúng được sắp xếp như thế nào?
- 9. ResourceReferences trong Wicket là gì và chúng hoạt động như thế nào?
- 10. Trình xử lý là gì
- 11. Ext.namespace là gì, chúng ta nên sử dụng chúng như thế nào?
- 12. Lỗi ANR - MÀN HÌNH TẮT - Tôi phải xử lý chúng như thế nào?
- 13. Trách nhiệm của JVM bytecode verifier
- 14. Chính xác thì các tệp DLL là gì và chúng hoạt động như thế nào?
- 15. C#: Sự kiện ảo là gì và chúng có thể được sử dụng như thế nào?
- 16. "Gọi lại" trong C là gì và chúng được triển khai như thế nào?
- 17. [cmdletbinding()] là gì và nó hoạt động như thế nào?
- 18. Cách dễ nhất để xây dựng trình biên dịch F # chạy trên JVM và tạo ra bytecode Java là gì?
- 19. Quy trình xử lý được xác định như thế nào?
- 20. Cây biểu thức là gì, bạn sử dụng chúng như thế nào và tại sao bạn sử dụng chúng?
- 21. PHP xử lý các biến như thế nào?
- 22. Android xử lý sự kiện GUI như thế nào?
- 23. Gettext xử lý nội dung động như thế nào?
- 24. "Xử lý được ghim" là gì?
- 25. Cạnh gephi song song là gì và làm cách nào để xử lý chúng khi nhập một nhà soạn nhạc?
- 26. Khái niệm về Mục đích đang chờ xử lý là gì? Tại sao và khi nào chúng tôi sử dụng Mục đích đang chờ xử lý?
- 27. việc sử dụng các JVM là gì nếu JIT là thực hiện bytecode chuyển đổi thành các lệnh máy
- 28. Bạn xử lý mã lỗi LicenseCheckerCallback.ERROR_NOT_MARKET_MANAGED như thế nào?
- 29. Chú thích là gì và chúng thực sự hoạt động như thế nào cho các khung công tác như Spring?
- 30. Các ngắt được xử lý như thế nào trên SMP?
hy vọng http://en.wikipedia.org/wiki/Bytecode sẽ hữu ích. – Jichao