Что такое 'преобразователь'?

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

122
задан JoeG 14 April 2010 в 23:10
поделиться

6 ответов

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

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

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

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

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

120
ответ дан 24 November 2019 в 01:23
поделиться

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

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

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

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

78
ответ дан 24 November 2019 в 01:23
поделиться

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

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

17
ответ дан 24 November 2019 в 01:23
поделиться

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

Что такое "thunk", как используется в Scheme или вообще?

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

5
ответ дан 24 November 2019 в 01:23
поделиться

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

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

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

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

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

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

5
ответ дан 24 November 2019 в 01:23
поделиться

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

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

7
ответ дан 24 November 2019 в 01:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: