2011-08-10 43 views
8

Vtables có mặt khắp nơi trong hầu hết các triển khai OO, nhưng chúng có lựa chọn thay thế không? Các trang wiki cho vtables có một blurb ngắn, nhưng không thực sự nhiều thông tin (và stubbed liên kết).Các giải pháp thay thế cho vtable

Bạn có biết một số triển khai ngôn ngữ không sử dụng vtables không?

Có các trang trực tuyến miễn phí thảo luận về các lựa chọn thay thế không?

Trả lời

13

Có, có rất nhiều lựa chọn thay thế!

vtables chỉ có thể khi

  1. Tất cả các cuộc gọi phương pháp có thể được xác định tĩnh. Nếu bạn có thể gọi hàm bằng tên chuỗi hoặc nếu bạn không có thông tin về đối tượng bạn đang gọi, bạn không thể sử dụng vtables vì ​​bạn không thể ánh xạ từng phương thức tới chỉ mục trong một số bảng. Tương tự, nếu bạn có thể thêm các hàm vào một lớp trong thời gian chạy, bạn không thể gán tất cả các phương thức một chỉ mục trong vtable tĩnh.
  2. Thừa kế có thể được xác định tĩnh. Nếu bạn sử dụng kế thừa prototypal, hoặc kế hoạch thừa kế khác, nơi bạn không thể biết cấu trúc thừa kế trông như thế nào, bạn không thể tính toán trước chỉ mục của từng phương thức trong bảng hoặc phương thức của lớp cụ thể trong một vùng.

Thông thường, kế thừa được thực hiện bằng cách đặt tên bảng dựa trên chuỗi ánh xạ các chức năng để triển khai, cùng với con trỏ cho phép mỗi lớp tra cứu lớp cơ sở của nó. Phương thức công văn sau đó được thực hiện bằng cách đi bộ cấu trúc này tìm kiếm lớp thấp nhất tại hoặc trên lớp của đối tượng người nhận thực hiện phương thức. Để tăng tốc độ thực thi ip, các kỹ thuật như bộ nhớ đệm nội tuyến thường được sử dụng, nơi các trang gọi lưu trữ một phương thức đoán phương thức nào sẽ được gọi dựa trên loại đối tượng để tránh mất thời gian đi qua toàn bộ cấu trúc này. Ngôn ngữ lập trình tự sử dụng ý tưởng này, sau đó được tích hợp vào JVM HotSpot để xử lý các giao diện (thừa kế chuẩn vẫn sử dụng vtables).

Một tùy chọn khác là sử dụng truy tìm, trong đó trình biên dịch phát ra mã đoán xem loại đối tượng là gì và sau đó mã hóa phương thức để gọi vào theo dõi. Mozilla Firefox sử dụng điều này trong trình thông dịch JavaScript của nó, vì không có cách nào để xây dựng vtables cho mọi đối tượng.

Tôi vừa hoàn thành việc dạy một khóa học trình biên dịch và một trong các bài giảng của tôi là triển khai các đối tượng bằng các ngôn ngữ lập trình khác nhau và sự cân bằng liên quan. Nếu muốn, bạn có thể xem các trang trình bày here.

Hy vọng điều này sẽ hữu ích!

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