2012-01-12 25 views
7

Gần đây tôi đã thực hiện một trình biên dịch ngược cho AVM2/AS3 và tôi đã nhận thấy rằng trình biên dịch Flash có xu hướng phát ra rất nhiều mã không cần thiết. Ví dụ: đối với một ứng dụng nhất định, tôi đã xóa khoảng 10% mã mà không bị suy giảm chức năng. Nó chỉ là một mã chết chắc chắn không được tham chiếu bởi các opcodes có điều kiện cũng như các khối xử lý ngoại lệ.Tại sao trình biên dịch Flash ActionScript3 phát ra mã không cần thiết?

Ngoài ra, nhìn vào đoạn mã này:

... 
    313  setproperty   y 
    315  getlocal   12 
317 returnvalue 318 jump L9 

    L3: 
    322  getlocal   8 
    324  returnvalue   

    L9: 
325 jump L10 ; L10 (opcode #331) does not ever exist. 
            ; Technically, it is a jump beyond 
            ; the end of function. This is invalid code! 

    L2: 
    329  pushnull    
    330  returnvalue   

Vâng, tất nhiên đây là mã không hợp lệ, cũng là chết và do đó sẽ không gây ra bất kỳ tác dụng phụ (trừ codebase đầy hơi). Nhưng tại sao nó lại phát ra mã đó? Và tại sao người xác minh lại chấp nhận điều đó?

+0

Nó không được tham chiếu từ bảng ngoại lệ (vì không có nhiều thứ khác, lớn hơn nhiều - 10 hướng dẫn - khối mã chết) và đánh giá từ thông số kỹ thuật, bạn có thể chuyển quyền kiểm soát thông qua mã nhảy nhảy hoặc một ngoại lệ. Không có nhảy. – whitequark

+0

@wvxvw Bằng cách này, 'cuối cùng' các khối được thực hiện trong AS3 với một hack lạ và quanh co, nơi trình biên dịch cố ý tạo ra các opcodes không hợp lệ để xác minh lừa và VM, một lần nữa cố ý, bỏ qua chúng. Flash chỉ là một WTF lớn. – whitequark

+0

@wvxvw, tôi đã hiểu bạn đúng chưa? nếu bạn thực hiện một chuỗi các opcodes nhất định thì VM cho phép mã chạy để kiểm tra luồng opcode của nó bằng cách nào đó, có lẽ là thông qua việc đẩy chúng vào ngăn xếp dữ liệu? +50 nếu bạn có thể tìm thấy tài liệu tham khảo. – whitequark

Trả lời

7

ASC hoặc compc không tối ưu hóa. Điều này là không may, nhưng lý thuyết là JIT làm tất cả các công việc tối ưu hóa. Bạn có thể đưa ra các ví dụ thậm chí tệ hơn như thêm hai hằng số. Vì vậy, câu trả lời là: Xin lỗi, nó chỉ không tối ưu hóa. Có thể có một trình biên dịch tốt hơn trong tương lai. Ngay bây giờ, bạn phải dựa vào AS3 JIT để thực hiện công việc tối ưu hóa khi chạy (mà nó thực hiện một công việc khá tại!) Hoặc sử dụng một trình biên dịch khác.

+0

Vâng, tôi tất nhiên đã thấy thêm hằng số và như vậy, chưa kể đến sự ép buộc không cần thiết ở khắp mọi nơi. Ví dụ tồi tệ nhất của nó có lẽ là cách 'lookupswitch' là codegen'd. Bạn có bất kỳ tài liệu tham khảo về lý do tại sao nó được thiết kế theo cách đó (như [LLVM] (http://blog.llvm.org/) có)? Gấp liên tục không phải là * mà * khó thực hiện, trừ khi bạn hoàn toàn braindead. – whitequark

+1

whitequark: Lý thuyết là "trình biên dịch" chỉ là một trình phân tích cú pháp được tôn vinh và JIT sẽ xử lý mọi thứ khác. Cá nhân tôi không nghĩ rằng đó là một thiết kế tốt, nhưng nó như thế nào. Tôi không biết bất kỳ tài liệu tham khảo tốt nào, xin lỗi. – starmole

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