Dự án của chúng tôi thực hiện một số công cụ bytecode Java. Và chúng tôi tình cờ gặp một số hành vi kỳ lạ. Giả sử đoạn mã sau:Sự khác biệt trong bytecode java được sản xuất bởi trình biên dịch của Oracle và Eclipse
public void a() {
new Integer(2);
}
Oracle javac biên dịch trên vào bytecode sau:
0: new #2; //class java/lang/Integer
3: dup
4: iconst_2
5: invokespecial #3; //Method java/lang/Integer."<init>":(I)V
8: pop
9: return
và trình biên dịch của Eclipse vào:
0: new #15; //class java/lang/Integer
3: iconst_2
4: invokespecial #17; //Method java/lang/Integer."<init>":(I)V
7: return
Như bạn thấy, Oracle trình biên dịch tạo "dup" sau "mới", trong khi Eclipse thì không. Đó là hoàn toàn chính xác trong trường hợp sử dụng này, như trường hợp Integer mới được tạo ra không được sử dụng ở tất cả, vì vậy không có "dup" là bắt buộc.
Câu hỏi của tôi là:
- Có một số tổng quan về sự khác nhau giữa các trình biên dịch khác nhau? Bài viết/bài đăng trên blog?
- Tôi có thể kết luận một cách an toàn, rằng nếu không có "dup" giữa "mới" và "invokespecial" thì đối tượng không được sử dụng sau khi khởi tạo?
Mục tiêu của bạn với việc thiết lập bytecode là gì? Sự khác biệt này có gây ra vấn đề cho bạn không? Lưu ý rằng không có sự đảm bảo về những gì bytecode chính xác một trình biên dịch Java sẽ tạo ra.Hoàn toàn có thể là trong một phiên bản tương lai, Oracle 'javac' sẽ tạo ra một cái gì đó khác với những gì bạn thấy bây giờ - vì vậy nó không phải là ý tưởng hay khi viết một chương trình phụ thuộc rất nhiều vào bytecode chính xác do trình biên dịch tạo ra. – Jesper
Bạn có sử dụng JDK khác cho Eclipse không? – Nishant