LINUX.ORG.RU

Динамическое связывание в языках программирования


0

2

Интересуюсь информацией о «динамическом связывании» функций в традиционных компилируемых языках (не скриптах). Вот два самых известных подхода:

1. сигналы и слоты в QT Сигнал - внешне - «прототип» функции без реализации. Слот - реальная функция-обработчик. Вызов сигнала преобразуется в вызов специальной qt-шной функции отправки сигнала. Вызов происходит с использованием специальных таблиц метаинформации, генерируемых moc-компилятором.

2. сообщения в ObjectiveC В отличие от QT, отдельных именованных «сингалов» и понятий connect/disconnect как таковых нет; методы классов в ObjC («обработчики сообщений») - это по сути аналог слотов; подобно QT, вызывается функция objc_msgSend(). В отличие от QT, вызов происходит путем сопоставления «селекторов», т.е. не символьных имен функций, а 32-битных чисел, что должно давать увеличение скорости вызовов.

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

Интересно следующее:

* Какие еще реализации динамических вызовов существуют? В каких языках? Как реализованы? (интересует, опять таки, не интерпретируемые скрипты, в которых возможно что угодно:) )

* В каких случаях динамические вызовы позволяют делать что-то такое, что невозможно сделать с помощью указателей на функции/методы («делегатов»)? простейший пример - добавление методов в класс в рантайме в ObjC.


а зачеми всё это надо на практике? Пишут же на языке С (или на минимуме из С++ — улучшенном С) и получают отличные программы без всех этих гламурно-скриптовых наворотов.

anonymous
()

А что тут крайне интересного-то? Вызов и передача параметров просто происходит через вспомогательные функции и становится более безопасным и контролируемым.
То же самое можно сделать и вручную в том же с++.

note173 ★★★★★
()
Ответ на: комментарий от note173

Интересно, в каких еще языках используется нечто подобное и как это сделано с точки зрения синтаксиса. Реализация понятна, но если так рассжудать - любая фича языка программирования сводится к ассемблерным командам:)

x-code
() автор топика
Ответ на: комментарий от vladimir-vg

>Виртуальные методы, например.

А существуют языки, в которых есть какие-то расширенные или необычные возможности работы с виртуальными методами?

x-code
() автор топика
Ответ на: комментарий от x-code

> А существуют языки, в которых есть какие-то расширенные или необычные возможности работы с виртуальными методами?

К примеру в Smalltalk и Ruby все методы виртуальные.

Какие еще реализации динамических вызовов существуют? В каких языках? Как реализованы?

Не знаю то ли это, но например в Common Lisp есть CLOS. Там методы определяются отдельно от классов. (Т.е. свободно добавляются), а также там есть multiple dispatch — выбор метода в зависимости от классов нескольких аргументов, а не только первого.

(интересует, опять таки, не интерпретируемые скрипты, в которых возможно что угодно:) )

???

vladimir-vg ★★
()

в Qt тоже сопоставляются целые числа, насколько я понимаю, разглядывая результат moc-а

unC0Rr ★★★★★
()
Ответ на: комментарий от x-code

>Интересно, в каких еще языках

Вот и выросло поколение...^U Шмоллтолк, например, вешь иш динамического диспатча шоштоит. There are dynamic dispatchers... Dynamic dispatchers everywhere. And late bindings is fine too.

slackwarrior ★★★★★
()
Ответ на: комментарий от vladimir-vg

А есть попытки реализации мультиметодов в каких-то «си-подобных» языках со схожей областью применения? Возможно, какие-то экспериментальные расширения С/С++?

x-code
() автор топика
Ответ на: комментарий от x-code

> А есть попытки реализации мультиметодов

Вон wiki говорит что есть в Python. Ещё есть в Factor.

языках со схожей областью применения?

Какой областью?

в каких-то «си-подобных» Возможно, какие-то экспериментальные

Почему именно си-подобные? Зачем? Да и вообще, что понимаете под этим?

С++?

noway

vladimir-vg ★★
()
Ответ на: комментарий от vladimir-vg

си-подобные - просто потому что они привычнее, интересно посмотреть как выглядел бы синтаксис того же С++ если бы в нем было что-то подобное. python и ruby работают как интепртетаторы, а мне больше интересны эти возможности с точки зрения компиляции в машинный код, причем как можно более оптимальной с точки зрения производительности.

x-code
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.