2010-12-12 28 views
36

C++ có nhiều thừa kế. Việc thực hiện thừa kế nhiều ở cấp độ hội đồng có thể khá phức tạp, nhưng có tốt descriptions trực tuyến về cách thức này thường được thực hiện (vtables, fixups con trỏ, khối, vv).Giao diện java được triển khai bên trong như thế nào? (vtables?)

Java không có nhiều kế thừa thực hiện, nhưng nó có nhiều giao diện kế thừa, vì vậy tôi không nghĩ rằng việc triển khai thẳng về phía trước với một vtable duy nhất cho mỗi lớp có thể thực hiện điều đó. Làm thế nào để java thực hiện các giao diện nội bộ?

Tôi nhận thấy rằng trái với C++, Java được Jit biên soạn, vì vậy các phần mã khác nhau có thể được tối ưu hóa khác nhau và các JVM khác nhau có thể làm những việc khác nhau. Vì vậy, có một số chiến lược chung mà nhiều JVM thực hiện theo cách này hay không ai biết việc triển khai trong một JVM cụ thể? Ngoài ra JVM thường ảo hóa và gọi phương thức nội tuyến trong trường hợp không có vtables hoặc tương đương, vì vậy có thể không hỏi về chuỗi thực thi thực hiện các cuộc gọi phương thức ảo/giao diện, nhưng tôi cho rằng Các JVM vẫn giữ một số kiểu đại diện chung của các lớp xung quanh để sử dụng nếu chúng không thể ảo hóa mọi thứ. Giả định này có sai không? Có đại diện này nhìn trong bất kỳ cách nào giống như một C++ vtable? Nếu các giao diện như vậy có các vtables riêng biệt và các giao diện này được liên kết với vtables lớp như thế nào? Nếu vậy có thể đối tượng trường hợp có nhiều con trỏ vtable (để lớp/giao diện vtables) như trường hợp đối tượng trong C + + có thể? Do tham chiếu của một loại lớp và một loại giao diện cho cùng một đối tượng luôn luôn có cùng một giá trị nhị phân hoặc có thể những khác nhau như trong C + +, nơi họ yêu cầu sửa chữa con trỏ?

(để tham khảo: this question hỏi một cái gì đó tương tự về CLR, và dường như có một lời giải thích tốt trong this msdn article mặc dù có thể bị lỗi thời bởi bây giờ tôi đã không thể tìm bất cứ điều gì tương tự cho Java..)

Edit:

  • ý tôi là 'cụ' theo nghĩa của "Làm thế nào để trình biên dịch GCC thực hiện nguyên Ngoài/chức năng cuộc gọi/etc", chứ không phải theo nghĩa của "lớp Java ArrayList cài đặt giao diện Danh sách ".
  • tôi biết cách làm việc này ở cấp bytecode JVM, những gì tôi muốn biết là những loại mã và datastructures được tạo ra bởi JVM sau khi nó được thực hiện tải các tập tin lớp và biên dịch các bytecode.
+2

Bạn đề cập đến kế thừa giao diện và kế thừa thực hiện. Việc thừa kế thực hiện rất khó vì bạn cần có một thứ tự tìm kiếm xác định. Giao tiếp kế thừa là cách đơn giản hơn. Bạn chỉ cần có một bản đồ với tất cả các chữ ký phương thức cần được thực hiện. Không yêu cầu đơn đặt hàng tìm kiếm (vì không có triển khai nào được đính kèm). Không có trật tự ở đó. – extraneon

Trả lời

25

Tính năng chính của JVM HotSpot là inline caching. này không thực sự có nghĩa là phương pháp mục tiêu được sắp xếp theo hàng nhưng có nghĩa là một giả định được đưa vào mã JIT rằng mỗi cuộc gọi tương lai với phương pháp ảo hoặc giao diện sẽ nhắm mục tiêu thực hiện rất giống nhau (ví dụ rằng trang web gọi là đơn hình). Trong trường hợp này, một tấm séc được biên soạn vào mã máy cho dù giả định thực sự nắm giữ (tức là cho dù kiểu của đối tượng mục tiêu là như nhau vì nó là lần cuối cùng), và sau đó chuyển giao kiểm soát trực tiếp đến phương pháp mục tiêu - với không có bàn ảo nào cả. Nếu xác nhận không thành công, một nỗ lực có thể được thực hiện để chuyển đổi điều này thành trang web cuộc gọi megamorphic (nghĩa là với nhiều loại có thể); nếu điều này cũng không thành công (hoặc nếu nó là tiếng gọi đầu tiên), một tra cứu dài hơi thường xuyên được thực hiện, sử dụng vtables (đối với phương pháp ảo) và itables (đối với các giao diện).

Sửa: Các Hotspot Wiki có thêm chi tiết về khai vtable và itable.Trong trường hợp đa hình, nó vẫn đặt một phiên bản bộ nhớ cache nội tuyến vào trang cuộc gọi. Tuy nhiên, mã thực sự là một nhánh thực hiện tra cứu trong vtable, hoặc một itable. Có một cuống vtable cho mỗi vtable offset (0, 1, 2, ...). Interface calls thêm một tìm kiếm tuyến tính trên một mảng của nó trước khi nhìn vào itable (nếu tìm thấy) tại offset cho trước.

+0

Các trang Hotspot Wiki đó trên VirtualCalls và InterfaceCalls dường như là những gì tôi đang tìm kiếm. Tuy nhiên vẫn phải đi vòng quanh để đọc tất cả. – JanKanis

+1

Wiki đã được chuyển đến https://wikis.oracle.com/display/HotSpotInternals/Home –

+0

Wiki oracle đã bị đóng băng, tôi nghĩ https://wiki.openjdk.java.net/display/HotSpot/Main là nơi thông tin có thể cập nhật kết thúc. – JanKanis

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