Я бачив, що він використовується в програмуванні (конкретно в домені C ++) і поняття не маю, що це таке. Імовірно, це модель дизайну, але я можу помилитися. Чи може хтось надати хороший приклад грози?
Я бачив, що він використовується в програмуванні (конкретно в домені C ++) і поняття не маю, що це таке. Імовірно, це модель дизайну, але я можу помилитися. Чи може хтось надати хороший приклад грози?
Відповіді:
thunk
Зазвичай відноситься до невеликого фрагмента коду , який називається як функція, роблять деякі невеликі речі, а потім JUMP
S в інше місце (зазвичай функція) замість повернення в зухвалій. Якщо припустити, що ціль JUMP - це нормальна функція, коли вона повернеться, вона повернеться до абонента, що телефонує.
Thunks можна використовувати для ефективної реалізації багатьох корисних речей
переклад протоколу - при виклику з коду, який використовує одну умову виклику, до коду, який використовує інший режим виклику, а thunk
може бути використаний для відповідного перекладу аргументів. Це працює лише в тому випадку, якщо конвенції про повернення сумісні, але це часто буває
управління віртуальними функціями - при виклику віртуальної функції багатонаспадкованого базового класу в C ++, потрібно вправити this
покажчик, щоб він вказав на потрібне місце. А thunk
може це зробити.
динамічне закриття - коли ви будуєте динамічне закриття, функція закриття повинна мати можливість потрапляти в контекст, де вона створена. Невелике thunk
може бути побудовано (як правило, на стеку), яке встановлює інформацію про контекст у деяких регістрах, а потім переходить до статичного фрагмента коду, який реалізує функцію закриття. Ефективна передача тут фактично надає один або кілька прихованих додаткових аргументів функції, які не надаються сайтом виклику.
this
), закриття конструктора за замовчуванням / копіювання (для кращої інтеграції CRT для наданих користувачем параметрів за замовчуванням, головним чином для експорту DLL або побудови масивів), vcall
загрожує (щоб переконатися вказівник на -member-функції працюють належним чином з віртуальними функціями), vtordisp
thunks (для класів, які успадковують та змінюють віртуальні функції з віртуальних баз, а також мають передбачені користувачем цитри та / або dtors), нативні обгортки (для виклику керованого C ++ / CLI
UDT returning
" (що, здається, є пристосуванням для коригування визначених користувачем типів, повернених операторами, але я не впевнений, як його генерувати; я думаю, це застаріле). Напевно, є й інші. Напевно, ви ніколи не можете сказати Microsoft thunk
ні; Декарт був би гордий.
Слово громовідвід має щонайменше три споріднених значення в інформатиці. "Громом" може бути:
Я зазвичай бачив, як це використовується в третьому контексті.
Термін «громовідвід» спочатку посилався на механізм, який застосовується Королівською радіолокаційною установою у введенні поіменних назв в їх Algol60 компіляторі . Загалом, це стосується будь-якого способу спонукання до динамічної поведінки при посиланні на очевидно статичний об'єкт. Термін був винайдений Брайаном Віхманом, який, коли його попросили пояснити пропуск по імені, сказав: "Ну, ви виходите, щоб завантажити значення з пам'яті, а потім раптом - загрожує - там ви оцінюєте вираз".
Громадяни були введені в апаратне забезпечення (пор. KDF9, основні рамки Burroughs). Існує кілька способів їх впровадження в програмне забезпечення, все дуже машинне, мовне та компіляторне.
Цей термін став узагальненим за межі пропуску, включаючи будь-яку ситуацію, в якій мабуть або номінально статична посилання на дані індукує динамічну поведінку. Пов'язані терміни включають "батут" та "майбутнє".
Деякі компілятори для об'єктно-орієнтованих мов, такі як C ++, генерують функції, що називаються "thunks", як оптимізація віртуальних викликів функцій при наявності багаторазового або віртуального успадкування.
Взято з: http://en.wikipedia.org/wiki/Thunk#Thunks_in_object-oriented_programming
Існує значна різниця у використанні. Майже загалом, громовідвід - це функція, яка (принаймні концептуально) незвично мала і проста. Зазвичай це якийсь адаптер, який дає вам правильний інтерфейс до чогось чи іншого (деякі дані, інша функція тощо), але, принаймні, це сприймається як мало іншого.
Це майже як форма синтаксичного цукру, за винятком того, що (принаймні, як зазвичай використовується) синтаксичний цукор повинен виглядати так, як їх хоче бачити людський читач, і бажання - щось зробити так, як хоче компілятор бачити це.
Це питання вже було задано на SO, дивіться:
Що таке "громовідвід", як використовується в Схемі або взагалі?
З того, що я можу сказати, це схоже на лямбда-твердження, де ви, можливо, не захочете повертати значення, поки вам не потрібно буде його оцінювати; або він також може бути порівняний з одержувачем властивостей, який за допомогою дизайну виконує деякий код, щоб повернути значення, але при цьому має форму інтерфейсу, яка більше нагадує змінну, але також має поліморфну поведінку, яку можна замінити, успадковуючи чи шляхом заміни вказівника функції, який би оцінював і повертав значення під час виконання на основі часу компіляції або екологічних характеристик.
Мені було страшно, коли я не знайшов загального визначення «інформатики» цього терміна, яке б відповідало його фактичному використанню, як відомо мені історично. Перша зустріч у реальному житті я можу згадати, де її насправді називали, що було в ОС / 2 дні та 16-32 бітовий перехід. Здається, "громити" - це як іронія в його застосуванні сьогодні.
Моє грубе загальне розуміння полягає в тому, що громовідвід є заглушкою, яка просто нічого не робить або не проходить через якусь фундаментальну межу в натурі між системами, як у згаданих історичних випадках.
Тож сенс - це як синестезія перекидання з одного середовища в інше, створюючи (метафорично / як подібність) звук «громовідводу».
Я піду поглянути на це, але я подумав, що подумав - це процес, використовуваний 32-розрядним процесором для запуску застарілого 16-бітного коду.
Раніше я використовував це як аналогію щодо того, як ви повинні обмежувати, як швидко ви говорите і які слова вживаєте, коли розмовляєте з тупими людьми.
Так, це у посиланні на Вікіпедію (частина про 32-бітну, а не мою нердалогію ).
https://en.wikipedia.org/wiki/Thunk
Значна частина літератури з питань інтероперабельності пов'язана з різними платформами Wintel, включаючи MS-DOS, OS / 2, [8] Windows [9] [10] і .NET, і з переходом від 16-бітної до 32-бітної адреси пам'яті. . Оскільки клієнти мігрували з однієї платформи на іншу, грози були важливими для підтримки застарілого програмного забезпечення, написаного для старих платформ.
(наголос додав я)
Найбільш раннє використання "грому", про яке я знаю, - з кінця 50-х років стосовно посилання на оцінку аргументів Algol60 "по імені" у викликах функцій. Спочатку Algol був мовою специфікацій, а не мовою програмування, і виникало питання про те, як можна реалізувати на комп’ютері передачу імені.
Рішення полягало в тому, щоб пройти точку входу того, що по суті було лямбда. Коли виклик оцінював параметр, керування провалилося - спалах! - в контекст виклику, де оцінювали лямбда, і її результат став значенням параметра в наборі.
У теги апаратного забезпечення, такого як машини Берроуза, оцінка була неявною: аргумент може бути переданий як значення даних, як у звичайному проходному значенні, або через обробку для проходження по імені, з різними тегами метаданих аргументу . Апаратне забезпечення навантаження перевірило тег і повернуло просте значення, або автоматично викликало лямбда-тунк.
За визначенням Кайла Сімпсона , громовідвід - це спосіб абстрагувати компонент часу поза асинхронним кодом.