Что такое 'thunk'?

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


person fbrereto    schedule 14.04.2010    source источник
comment
Так же, как FYI, преобразователь также иногда называют «батутом» (в общем случае, возможно, не в домене C++).   -  person Michael Burr    schedule 15.04.2010
comment
@MichaelBurr, единственный контекст, в котором я видел термин «батут», - это «Объезды», и в этом контексте батут не является преобразователь.   -  person user34660    schedule 26.04.2017
comment
Термин - это тип вещи, который не имеет конкретного определения, поэтому он варьируется в определении.   -  person user34660    schedule 26.04.2017


Ответы (12)


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

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

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

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

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

person Chris Dodd    schedule 15.04.2010
comment
Это лучшее объяснение, потому что оно объясняет, что такое преобразователь является, а не то, что он обычно делает в типичных случаях использования для реализации различных вещей. Другие ответы слишком сосредоточены на этих конкретных реализациях, а не на общей идее. - person SasQ; 21.03.2014
comment
Не уверен насчет других компиляторов, но в частности Visual Studio, кажется, очень любит преобразователи. Насколько мне известно, он использует: переходники корректора (для настройки this), замыкания конструктора по умолчанию/копирования (для лучшей интеграции CRT предоставленных пользователем с параметрами по умолчанию, в основном для экспорта DLL или построения массивов), преобразователи vcall (чтобы убедиться, что указатель -to-member-functions правильно работают с виртуальными функциями), vtordisp thunks (для классов, которые наследуют и переопределяют виртуальные функции из виртуальных баз, а также имеют предоставляемые пользователем ctors и/или dtors), собственные оболочки (для вызова управляемых C++/CLI - person Justin Time - Reinstate Monica; 10.06.2016
comment
функции из собственного кода ISO C++) и что-то под названием UDT returning (что, по-видимому, является переходником для настройки пользовательских типов, возвращаемых операторами, но я не уверен, как его сгенерировать; я думаю, что это устарело). Вероятно, есть и другие. Я думаю, вы никогда не сможете сказать Microsoft thunk нет; Декарт бы гордился. - person Justin Time - Reinstate Monica; 10.06.2016

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

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

Обычно я видел, как оно используется в третьем контексте.

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

person Robert Harvey    schedule 14.04.2010
comment
Интересный; Обычно я слышу вторую форму, но, думаю, это зависит от того, какую работу вы выполняете чаще. - person Michael Mrozek; 15.04.2010
comment
В частности, это связано с автоматически генерируемыми очень короткими блоками машинного кода - даже первый случай обычно просто дает контекст предварительно скомпилированной функции реализации. - person Simon Buchan; 15.04.2010
comment
Я думаю, что № 1 относится к Chris Dodds ответу , но не так широк: он включает не только задержки, но и любые ' вещь'. Так что в нынешнюю эпоху, я думаю, большинство людей (веб-разработчики) сочли бы, что #1 является распространенным использованием. - person Ben Butterworth; 24.12.2020

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

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

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

person Ivan Godard    schedule 18.07.2015
comment
Спасибо за этимологию. Я ненавижу термины программирования, определение которых кажется произвольным поиском в таблице. - person Ross Rogers; 11.08.2015

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

Взято из: http://en.wikipedia.org/wiki/Thunk#Thunks_in_object-Oriented_programming< /а>

person OscarRyz    schedule 14.04.2010

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

Что такое "преобразователь", используемый в Схема или вообще?

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

person Jon Davis    schedule 14.04.2010

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

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

person Jerry Coffin    schedule 14.04.2010
comment
Звучит как противоположность синтаксическому сахару для меня :) - person Laserallan; 15.04.2010
comment
Синтаксический сахар для компиляторов? Почти, но не совсем, в отличие от синтаксического сахара. - person Duncan; 15.04.2010
comment
Возможно, синтаксический источник? - person Justin Time - Reinstate Monica; 10.06.2016

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

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

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

person 仁 人 卷    schedule 26.01.2012
comment
Интересный совет. Я тоже задавался вопросом об истинной этимологии этого слова, и я представил себе людей, играющих в лесной телеграф, где один из людей в потоке молча (и во многих случаях неосознанно) трансформирует сообщение по пути. - person SasQ; 21.03.2014

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

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

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

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

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

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

person MusiGenesis    schedule 14.04.2010

Самое раннее использование "преобразователя", о котором я знаю, относится к концу 50-х годов в отношении оценки аргумента передачи по имени Algol60 в вызовах функций. Изначально Алгол был языком спецификаций, а не языком программирования, и возник вопрос о том, как реализовать передачу по имени на компьютере.

Решение состояло в том, чтобы передать точку входа того, что по сути было лямбдой. Когда вызываемый объект оценил параметр, управление провалилось — thunk! - в контекст вызывающего объекта, где вычислялась лямбда, и ее результат становился значением параметра в вызываемом объекте.

В оборудовании с тегами, таком как машины Берроуза, оценка была неявной: аргумент мог быть передан как значение данных, как при обычной передаче по значению, или с помощью преобразователь для передачи по имени с разными тегами в метаданных аргумента. . Аппаратное обеспечение операции загрузки проверило тег и либо вернуло простое значение, либо автоматически вызвало лямбда-преобразователь.

person Ivan Godard    schedule 18.05.2020

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

person Alex Gordon    schedule 21.01.2018

В более ранней версии The New Hacker's Dictionary утверждалось, что thunk — это функция, не принимающая аргументов, и что это простое ночное решение особенно сложной проблемы, где thunk — предполагаемое прошедшее время думать, потому что они должны были подумать об этом давным-давно.

person user2492477    schedule 26.02.2021

В OCaml это функция, которая принимает единицу «()» в качестве параметра (не принимает никаких параметров, часто используется для побочных эффектов).

person GL2014    schedule 28.03.2021