Trình biên dịch thường chọn biểu diễn trung gian (IR), hoặc là đăng ký dựa trên stack hoặc vô hạn. Những lợi thế của những cây biểu hiện trên là gì?Ưu điểm của bytecode dựa trên stack hoặc máy đăng ký vô hạn
Trả lời
Cây biểu thức hoạt động cho các biểu thức, nhưng không hiệu quả để lập mô hình toàn bộ chương trình. Đặc biệt, một biểu diễn tốt của một chương trình thực sự là một biểu đồ (của các hoạt động và hành động) được kết nối bởi các luồng điều khiển và dữ liệu. Thông thường, mọi người nói về việc sử dụng "bộ ba" hình thành chính xác một biểu đồ như vậy.
Mã máy ngăn xếp dễ dàng cho giao diện người dùng để tạo, nhưng khó hơn cho quá trình phân bổ đăng ký cuối cùng cần thiết để tạo mã thực, vì nó có tập hợp các vị trí tạm thời ("ngăn xếp") với kiến trúc đích và làm cho các dataflows bất tiện để xử lý. ("mã nào sử dụng kết quả của phần bổ sung này?").
Máy đăng ký khó hơn một chút để tạo mã, nhưng có xu hướng bảo toàn luồng dữ liệu bằng cách sử dụng các thanh ghi vô hạn đó như các luồng dữ liệu cơ bản. Đó là dataflow và khả năng phân bổ nó dễ dàng để đăng ký thực (có một phân bổ đăng ký tiêu chuẩn "bằng màu đồ thị") làm cho nó tương đối dễ dàng để tạo ra mã tốt.
Nếu bạn quyết định tạo mã máy ảo trực tiếp từ các mã này, bạn sẽ nhận được các đặc tính hiệu suất khác nhau. Về cơ bản, các máy xếp chồng có xu hướng nhận được các dấu chân mã nhỏ hơn. Máy đăng ký vô hạn có xu hướng thực hiện diễn giải nhanh. Dalvik của Google khác với JVM vì lý do chính xác này. (Có thể họ không muốn bị kiện bởi Sun/Oracle trên các định dạng tệp lớp học nữa.)
Tôi đề xuất tài liệu sau: Virtual Machine Showdown: Stack Versus Registers. (PS: bất cứ điều gì với Anton Ertl như một tác giả có xu hướng là một thú vị đọc).
Tôi đã đăng chính xác câu trả lời! : D BTW, tôi cũng sẽ nói rằng ngăn xếp VM dễ dàng hơn để bắt đầu vì nó dễ dàng hơn để tạo mã cho họ ... –
Tôi thấy nó đáng thất vọng rằng câu trả lời của bạn so sánh Stack vs Đăng ký, trong khi câu hỏi yêu cầu về cây biểu hiện vs Stack/Đăng ký . –
@romkyns: Đủ công bằng. Trả lời sửa đổi. –
- 1. Tại sao các máy ảo dựa trên đăng ký lại tốt hơn các máy ảo dựa trên stack?
- 2. Ưu điểm của kiến trúc dựa trên ngăn xếp của lệnh JVM
- 3. Thanh toán dựa trên đăng ký
- 4. Cấp phép dựa trên đăng ký Android
- 5. Làm thế nào một đăng ký + ngăn xếp dựa trên máy ảo làm việc?
- 6. Ưu điểm của pdo trên mysql_ * hoặc mysqli_ *
- 7. Hết hạn đăng ký GCM của bạn?
- 8. Những ưu điểm của C# trên Python
- 9. Ưu điểm của [HandleError] trên Application_Error
- 10. Ưu điểm của LePUS3 trên UML là gì?
- 11. Làm cách nào để vô hiệu hóa/đăng ký tài khoản trên đăng ký django?
- 12. Ưu điểm của TypeScript
- 13. Ưu điểm của MySQLi trên MySQL
- 14. Ưu điểm của Tesla trên GeForce
- 15. Vô hiệu hóa đăng ký sao băng
- 16. Trong API GoogleCloudMessaging, cách xử lý gia hạn hoặc hết hạn ID đăng ký?
- 17. Máy ảo dựa trên đăng ký hoạt động như thế nào?
- 18. Cách tìm Hạn ngạch đăng ký Azure
- 19. Tôi có thể cấm hoặc hạn chế quốc gia dựa trên IP không?
- 20. Ưu điểm của Jikes RVM
- 21. jedis pubsub và timeouts: cách nghe vô hạn như người đăng ký?
- 22. Điều gì làm cho một lược đồ dựa trên heap chậm hơn một lược đồ dựa trên stack?
- 23. Đăng ký TechNet hoặc MSDN?
- 24. Ưu điểm của HashTable
- 25. Ưu điểm của Clojure
- 26. Ưu điểm & nhược điểm của DotNetNuke?
- 27. ưu điểm của std :: set vs vectơ hoặc bản đồ
- 28. ưu và khuyết điểm của việc triển khai javascript trên máy chủ?
- 29. Ưu điểm của các mẫu t4 trên các tệp Lớp
- 30. Có các biến dựa trên stack trong Python không?
Một lợi thế mà tôi có thể nghĩ đến là các cây biểu thức khó hơn một chút để biểu diễn dưới dạng một chuỗi byte, trong khi chương trình VM dựa trên stack rất tự nhiên được dịch sang luồng byte. –
@romkyns: đối với trình biên dịch IL, hầu như không quan trọng; tất cả những gì bạn cần là một tập hợp các cấu trúc dữ liệu được liên kết bởi các chỉ mục/con trỏ. –