Там, где методы не совсем сообщения (Java, C++) обработать получение произвольного сообщения.
Бывают также системы, где методы совсем не сообщения (CLOS). Там нельзя указать, кто является получателем сообщения, так как обработка зависит от нескольких аргументов, а не одного.
Метод — конкретный кусок кода.
При посыле сообщения, диспетчер ищет подходящий метод и вызывает его. (В некоторых реализациях ООП он может вызвать сразу несколько методов.)
разница в том, что вызов метода — это конкретный указатель на код, который типично резолвится при компиляции. а сообщения диспетчеризуются в рантайме. можно посылать сообщения не зная тип объекта, проверять отвечает ли объект на сообщение заданного типа, и т.п.
Ещё раз: представь, что в эрланге можно посылать не любые сообщения, а только вида
{#atom(), #atom(), #any()}.
Тогда получается соответствие:
reinterpret_cast<t*> a -> b(d);
Λ
|
V
a ! {t, b, d}.
Необходимость в данном случае кастовать в t* (и, соотв., посылать атом t в каждом сообщении) определяется только особенностью типизации и рантайма крестов. В каком-нибудь пайтоне этого можно было не делать. А если бы там можно было перегрузить точку для любого терма, ограничений на сообщения не было бы вообще и внешнее сходство было бы полным.
Ну и да, тупишь здесь только ты.
, что вызов метода — это конкретный указатель на код, который типично резолвится при компиляции.
ты сначала определись — таки эрланг, или C++. когда покажешь, как дернуть по указателю void * метод с известной сигнатурой, но неизвестным классом — возвращайся. можешь после окончания 2го семестра, когда виртуальные методы освоишь.
ты не поверишь, но она как раз и содержит указатели, которые резолвятся во время компиляции. (во всяком случае, в C++ — я не знаю как это в других подобных языках реализовано на низком уровне)
Судя по тому, что ты просишь вызвать метод у void*, a не какого-то базового интерфейса, про ООП в крестах ты не знаешь ничего. Продолжая аналогию с эрлангом, ты бы ещё попросил в нём послать сообщение функции или списку.
Судя по игнорированию замечания про питон — ООП в динамических языках нам тоже неведом.
ты еще спроси зачем скомпилированный код тащить в рантайм.
Не знаешь что ответить — переходи к петросянству. Срач начинает быть очень скучным.
Хватит спорить попусту. Речь была про то, что vmt заполняется «статически». Вызов происходит динамически(но, кстати, по статическому смещению в vmt). Вы оба не слишком корректно выразились.
С тем же успехом я могу сказать, что паттерн-матчинг (или чем ещё можно обрабатывать сообщения) «статически» превращается в jmp по статическим указателям. Смысла будет столько же, а именно — близко к нулю.
Смысл тут будет в том, что сама статическая структура vmt будет создана под «сообщения», а заполнятся будет уже «методами». Ну это если вдруг вводить термин сообщение в язык, которому это чуждо. В objective-c разница более ощутима. Посылаем сообщение, а рантайм ищет нужный метод у объекта. Сообщение там ещё называется селектором метода иногда.
не, селектор — это тип сообщения, например @selector(myMethod::). само сообщение — это пакет, содержащий селектор+параметры (определяется реализацией конкретного языка/рантайма)
объяснишь, что waker плёл про динамическую диспетчеризацию vs статические указатели?
я плел, что посредством динамической диспетчеризации можно посылать сообщения объектам неизвестного типа. вообще совсем неизвестного. как в примере выше. также, можно узнавать, отвечает ли данный объект на сообщение данного типа. но ты прочитал что-то другое между строк, и решил придраться. (сорри, уже иду спать, так что мое участие в сраче закончилось).
известно, что указатель указывает на объект, в котором такой метод есть. пусть он даже виртуальный. но класс неизвестен.
динамическая типизация: obj.meth()
статическая типизация: выяснить название соотв. интерфейса, кастануть и вызвать. если такового нет и нет возможности выпороть автора кода — «увольняться с этой долбаной, долбаной...».
целый тред увиливал, а теперь объясни: чем тебе подсмотр указателя метода в таблице не обработка сообщения? только без сливов про «вызов метода — это конкретный указатель на код», а то реально тянет послать учиться.
Мы посылаем объекту сообщение. Обрабатывает сообщение соответствующий метод объекта. Во многих языках это не разделено вообще, в некоторых не принципиально. Потому в литературе и статьях часто используют оба термина в одном и том же смысле.
VMT имеет только известные в статике смещения(и при вызове через VMT происходит обращение по этому смещению), да и сама таблица для каждого класса заполняется в статике.
Строго говоря, там никакой диспетчеризации нет - мы просто вызываем метод по указателю. В этом и было одно из преимуществ крестовой модели - дешевый вызов виртуальных методов.
вызов метода выполняется в контексте вызывающего объекта, а сообщение обрабатывается методом в контексте вызываемого объекта. Особо разница будет ощутима на потоках