Подтвердить что ты не робот

Почему метод отправки иногда медленный?

Чтение некоторых старых сообщений в caml-списке. Я наткнулся на следующее сообщение Жака Гаррига: http://caml.inria.fr/pub/ml-archives/caml-list/2007/11/24e8215c8d844b05db58ed3f79c9645f.en.html

Цитата, о которой я забочусь, следующая:

Вызов метода на произвольных объектах может быть медленным. Это связано с тем, что из-за подтипирование, в некоторых ситуациях нет способа узнать, где метод будет в таблице, и нужно выполнить двоичный поиск.

Может кто-нибудь объяснить, почему это так? Почему именно подтипирование (наследование, которое я принимаю в этом случае) влияет на это? Это относится к реализации OCaml или к другим языкам страдает от этого?

Пожалуйста, укажите мне дополнительные ресурсы, связанные с этим, Google не справился со мной.

4b9b3361

Ответ 1

Может ли кто-нибудь объяснить, почему это так?

При номинальной типизации каждому методу может быть присвоено уникальное целое число во время компиляции, поэтому виртуальная функция может быть найдена путем индексирования в массив. При структурной типизации (как в OCaml) это невозможно сделать, так что хэш структуры (то есть имя метода) используется для поиска указателя функции виртуального метода в словаре.

Почему именно подтипирование (наследование, которое я принимаю в этом случае) влияет на это?

Подтипы являются обязательным условием для виртуальной отправки.

Возможно ли это для реализации OCaml или других языков?

Просто реализация OCaml. В F # я использовал генерацию отражения и времени выполнения для достижения такого же эффекта без такого повышения производительности при обращении к времени.

Ответ 2

Я думаю, что delnan комментирует, что в OCaml "Subtyping!= inheritance" содержит представление об объяснении.

$ rlwrap ocaml
        OCaml version 4.00.1

# let f o = o#x + o#y ;;
val f : < x : int; y : int; .. > -> int = <fun>
# 

Функция f выше принимает любой объект o, который имеет методы x : int и y : int. Не объекты, которые наследуются от некоторого класса c, в котором смещение для этих методов могло быть исправлено заранее, заметьте. Любой объект с этими методами. Я предполагаю, что это трудно реализовать, и может быть одним из случаев, о которых Жак ссылается в своем сообщении.