Що таке "громовідвід"?


130

Я бачив, що він використовується в програмуванні (конкретно в домені C ++) і поняття не маю, що це таке. Імовірно, це модель дизайну, але я можу помилитися. Чи може хтось надати хороший приклад грози?


10
Так само, як FYI, груди також іноді називають "батутом" (в загальному випадку, можливо, не в домені C ++).
Майкл Берр

@MichaelBurr, єдиний контекст, який я бачив, вживаний термін "батут" - це "Детури", і в цьому контексті батут не є громом.
користувач34660

1
Термін - це тип речі, який не має конкретного визначення, тому він змінюється у визначенні.
користувач34660

Відповіді:


132

thunkЗазвичай відноситься до невеликого фрагмента коду , який називається як функція, роблять деякі невеликі речі, а потім JUMPS в інше місце (зазвичай функція) замість повернення в зухвалій. Якщо припустити, що ціль JUMP - це нормальна функція, коли вона повернеться, вона повернеться до абонента, що телефонує.

Thunks можна використовувати для ефективної реалізації багатьох корисних речей

  • переклад протоколу - при виклику з коду, який використовує одну умову виклику, до коду, який використовує інший режим виклику, а thunkможе бути використаний для відповідного перекладу аргументів. Це працює лише в тому випадку, якщо конвенції про повернення сумісні, але це часто буває

  • управління віртуальними функціями - при виклику віртуальної функції багатонаспадкованого базового класу в C ++, потрібно вправити thisпокажчик, щоб він вказав на потрібне місце. А thunkможе це зробити.

  • динамічне закриття - коли ви будуєте динамічне закриття, функція закриття повинна мати можливість потрапляти в контекст, де вона створена. Невелике thunkможе бути побудовано (як правило, на стеку), яке встановлює інформацію про контекст у деяких регістрах, а потім переходить до статичного фрагмента коду, який реалізує функцію закриття. Ефективна передача тут фактично надає один або кілька прихованих додаткових аргументів функції, які не надаються сайтом виклику.


13
Це найкраще пояснення, тому що це пояснює те , що перетворювач є замість того , що він зазвичай робить в типових випадках використання для виконання різних речей. Інші відповіді занадто зосереджені на конкретних реалізаціях замість загальної ідеї.
SasQ

Не впевнений у інших компіляторах, але, зокрема, Visual Studio дуже любить громити. Наскільки я знаю, він використовує: налаштування громозахисників (для налаштування this), закриття конструктора за замовчуванням / копіювання (для кращої інтеграції CRT для наданих користувачем параметрів за замовчуванням, головним чином для експорту DLL або побудови масивів), vcallзагрожує (щоб переконатися вказівник на -member-функції працюють належним чином з віртуальними функціями), vtordispthunks (для класів, які успадковують та змінюють віртуальні функції з віртуальних баз, а також мають передбачені користувачем цитри та / або dtors), нативні обгортки (для виклику керованого C ++ / CLI
Justin Time - Відновіть Моніку

функції з нативного коду ISO C ++), а також щось, що називається " UDT returning" (що, здається, є пристосуванням для коригування визначених користувачем типів, повернених операторами, але я не впевнений, як його генерувати; я думаю, це застаріле). Напевно, є й інші. Напевно, ви ніколи не можете сказати Microsoft thunkні; Декарт був би гордий.
Час Джастіна - Поновіть Моніку

80

Слово громовідвід має щонайменше три споріднених значення в інформатиці. "Громом" може бути:

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

Я зазвичай бачив, як це використовується в третьому контексті.

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


3
Цікаво; Я зазвичай чую другу форму, але, мабуть, це залежить від того, якою роботою ви займаєтесь частіше
Майкл Мрозек

Зокрема, пов'язані з тим, що автоматично генеруються дуже короткі блоки машинного коду - навіть перший випадок, як правило, лише дає контекст попередньо складеній функції реалізації.
Саймон Бучан

21

Термін «громовідвід» спочатку посилався на механізм, який застосовується Королівською радіолокаційною установою у введенні поіменних назв в їх Algol60 компіляторі . Загалом, це стосується будь-якого способу спонукання до динамічної поведінки при посиланні на очевидно статичний об'єкт. Термін був винайдений Брайаном Віхманом, який, коли його попросили пояснити пропуск по імені, сказав: "Ну, ви виходите, щоб завантажити значення з пам'яті, а потім раптом - загрожує - там ви оцінюєте вираз".

Громадяни були введені в апаратне забезпечення (пор. KDF9, основні рамки Burroughs). Існує кілька способів їх впровадження в програмне забезпечення, все дуже машинне, мовне та компіляторне.

Цей термін став узагальненим за межі пропуску, включаючи будь-яку ситуацію, в якій мабуть або номінально статична посилання на дані індукує динамічну поведінку. Пов'язані терміни включають "батут" та "майбутнє".


2
Дякую за етимологію. Я ненавиджу терміни програмування, визначення яких здається довільним пошуком у таблиці.
Росс Роджерс

17

Деякі компілятори для об'єктно-орієнтованих мов, такі як C ++, генерують функції, що називаються "thunks", як оптимізація віртуальних викликів функцій при наявності багаторазового або віртуального успадкування.

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


7

Існує значна різниця у використанні. Майже загалом, громовідвід - це функція, яка (принаймні концептуально) незвично мала і проста. Зазвичай це якийсь адаптер, який дає вам правильний інтерфейс до чогось чи іншого (деякі дані, інша функція тощо), але, принаймні, це сприймається як мало іншого.

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


2
Мені звучить як протилежне до синтаксичного цукру :)
Laserallan

2
Синтаксичний цукор для компіляторів тоді? Майже, але не зовсім, зовсім на відміну від синтаксичного цукру.
Дункан

2
Можливо, синтаксичний юзер?
Час Джастіна - Поновіть Моніку

7

Це питання вже було задано на SO, дивіться:

Що таке "громовідвід", як використовується в Схемі або взагалі?

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


5

Мені було страшно, коли я не знайшов загального визначення «інформатики» цього терміна, яке б відповідало його фактичному використанню, як відомо мені історично. Перша зустріч у реальному житті я можу згадати, де її насправді називали, що було в ОС / 2 дні та 16-32 бітовий перехід. Здається, "громити" - це як іронія в його застосуванні сьогодні.

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

Тож сенс - це як синестезія перекидання з одного середовища в інше, створюючи (метафорично / як подібність) звук «громовідводу».


1
Цікава порада. Мені теж було цікаво про власне етимологію цього слова, і я уявляв людей, що грають у "кущовий телеграф", де одна з осіб у потоці мовчки (а в багатьох випадках несвідомо) перетворює повідомлення на шляху.
SasQ

5

Я піду поглянути на це, але я подумав, що подумав - це процес, використовуваний 32-розрядним процесором для запуску застарілого 16-бітного коду.

Раніше я використовував це як аналогію щодо того, як ви повинні обмежувати, як швидко ви говорите і які слова вживаєте, коли розмовляєте з тупими людьми.

Так, це у посиланні на Вікіпедію (частина про 32-бітну, а не мою нердалогію ).

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

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

(наголос додав я)


1

Найбільш раннє використання "грому", про яке я знаю, - з кінця 50-х років стосовно посилання на оцінку аргументів Algol60 "по імені" у викликах функцій. Спочатку Algol був мовою специфікацій, а не мовою програмування, і виникало питання про те, як можна реалізувати на комп’ютері передачу імені.

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

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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.