Что такое "Thunk"? - PullRequest
       6

Что такое "Thunk"?

119 голосов
/ 15 апреля 2010

Я видел, как он используется в программировании (особенно в области C ++) и не знаю, что это такое. Предположительно, это шаблон дизайна, но я могу ошибаться. Кто-нибудь может привести хороший пример с толком?

Ответы [ 9 ]

116 голосов
/ 15 апреля 2010

A thunk обычно относится к небольшому фрагменту кода, который вызывается как функция, выполняет какую-то мелочь и затем JUMP s в другое место (обычно функцию) вместо возврата к своему вызывающему. Предполагая, что цель JUMP является нормальной функцией, когда она вернется, она вернется к вызывающей стороне thunk.

Thunks можно использовать для эффективной реализации множества полезных вещей

  • трансляция протокола - при вызове из кода, использующего одно соглашение о вызовах, для кода, использующего другое соглашение о вызовах, thunk может использоваться для соответствующего перевода аргументов. Это работает только в том случае, если соглашения о возврате совместимы, но это часто имеет место

  • обработка виртуальных функций - при вызове виртуальной функции многократно унаследованного базового класса в C ++ необходимо исправить указатель this, чтобы он указывал на правильное место. A thunk может сделать это.

  • динамические замыкания - при построении динамического замыкания функция замыкания должна иметь возможность добраться до контекста, в котором она была создана. Может быть создан небольшой thunk (обычно в стеке), который устанавливает контекстную информацию в некоторых регистрах и затем переходит к статическому фрагменту кода, который реализует функцию замыкания. В данном случае thank эффективно предоставляет один или несколько скрытых дополнительных аргументов функции, которые не предоставляются сайтом вызовов.

78 голосов
/ 15 апреля 2010

Слово thunk имеет как минимум три связанных значения в компьютерной науке. «Стук» может быть:

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

Я обычно видел его в третьем контексте.

http://en.wikipedia.org/wiki/Thunk

17 голосов
/ 18 июля 2015

Термин thunk первоначально относился к механизму, используемому Королевским радиолокационным учреждением , осуществляющим передачу по имени в их Algol60 компиляторе. В общем, это относится к любому способу вызвать динамическое поведение при обращении к явно статическому объекту. Термин был изобретен Брайаном Вихманом, который, когда его попросили объяснить, передавал по имени, сказал: «Ну, вы выходите, чтобы загрузить значение из памяти, а затем внезапно - огромное - там вы оцениваете выражение».

Thunks были помещены в аппаратные средства (ср. KDF9, мэйнфреймы Burroughs). Есть несколько способов реализовать их в программном обеспечении, все в зависимости от компьютера, языка и компилятора.

Термин стал обобщать не только по имени, но и включать любую ситуацию, в которой явно или номинально статическая ссылка на данные вызывает динамическое поведение. Родственные термины включают «батут» и «будущее».

17 голосов
/ 15 апреля 2010

Некоторые компиляторы для объектно-ориентированных языков, таких как C ++, генерируют функции, называемые "thunks", в качестве оптимизации вызовов виртуальных функций при наличии множественного или виртуального наследования.

Взято из: http://en.wikipedia.org/wiki/Thunk#Thunks_in_object-oriented_programming

7 голосов
/ 15 апреля 2010

Существуют значительные различия в использовании. Практически повсеместно thunk - это функция, которая (по крайней мере концептуально) необычайно мала и проста. Обычно это какой-то адаптер, который дает вам правильный интерфейс к чему-то или другому (некоторые данные, другая функция и т. Д.), Но, по крайней мере, считается, что он мало что делает.

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

5 голосов
/ 15 апреля 2010

Я собираюсь это выяснить, но я подумал, что thunking - это процесс, используемый 32-разрядным процессором для запуска устаревшего 16-разрядного кода.

Я использовал раньшеэто как аналогия с тем, как вы должны ограничивать то, как быстро вы говорите, и какие слова вы используете, когда говорите с тупыми людьми.

Да, это в ссылке на Википедию (часть о 32-битной, а не моей nerdalogy ).

https://en.wikipedia.org/wiki/Thunk

Большая часть литературы по интернациональной совместимости касается различных платформ Wintel, включая MS-DOS, OS / 2, [8]Windows [9] [10] и .NET, и переход с 16-битной на 32-битную адресацию памяти .Поскольку клиенты мигрировали с одной платформы на другую, для поддержки устаревшего программного обеспечения, написанного для более старых платформ, были важны громадины.

(выделено мной)

4 голосов
/ 26 января 2012

Я был огорчен тем, что не нашел общего «компьютерного» определения этого термина, соответствующего де-факто его употреблению, известного мне исторически. Первое реальное столкновение, которое я могу вспомнить, где оно фактически называлось, было в OS / 2 дня и 16-32-битном переходе. Похоже, что "гром" - это ирония в его применении сегодня.

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

Таким образом, смысл подобен синестезии, когда вы отбрасываетесь из одной среды в другую, превращая (метафорически / в качестве сравнения) в "громкий" звук.

4 голосов
/ 15 апреля 2010

Этот вопрос уже задавался на SO, см .:

Что такое «толчок», используемый в Схеме или в целом?

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

0 голосов
/ 21 января 2018

Per Определение Кайла Симпсона, thunk - это способ абстрагировать компонент time от асинхронного кода.

...