Jump to content

Батут (компьютерный)

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

Низкоуровневое программирование

[ редактировать ]

Батуты (иногда называемые векторами косвенного перехода ) — это ячейки памяти, содержащие адреса, указывающие на процедуры обслуживания прерываний , процедуры ввода-вывода и т. д. Выполнение прыгает на батут, а затем немедленно выскакивает или отскакивает, отсюда и термин «батут» . У них много применений:

Программирование высокого уровня

[ редактировать ]
  • В некоторых реализациях Lisp трамплин — это цикл, который итеративно вызывает функции, возвращающие thunk ( стиль передачи продолжения ). Одного батута достаточно для осуществления всех передач управления программой; программа, выраженная таким образом, является батутом или в батутном стиле ; преобразование программы в стиль батута — это прыжки на батуте. Программисты могут использовать трамплинные функции для реализации хвостовых рекурсивных вызовов функций в стек-ориентированных языках программирования . [1]
  • В Java . батут означает использование отражения , чтобы избежать использования внутренних классов , например, в прослушивателях событий Затраты времени на вызов отражения обмениваются на затраты пространства внутреннего класса. Батуты в Java обычно включают создание GenericListener для передачи событий внешнему классу. [2]
  • В Mono Runtime батуты — это небольшие рукописные фрагменты ассемблерного кода, используемые для выполнения различных задач. [3]
  • При взаимодействии фрагментов кода с несовместимыми соглашениями о вызовах используется батут для преобразования соглашения вызывающего абонента в соглашение вызываемого абонента.
    • Во встроенных системах батуты — это короткие фрагменты кода, которые запускают другие фрагменты кода. Например, вместо того, чтобы писать обработчики прерываний полностью на языке ассемблера, другой вариант — написать обработчики прерываний в основном на C и использовать короткий трамплин для преобразования соглашения о вызовах прерываний на языке ассемблера в соглашение о вызовах C. [4]
    • При передаче обратного вызова в систему, которая ожидает вызова функции C , но хочет, чтобы она выполнила метод конкретного экземпляра класса, написанного на C++ , используется короткий батут для преобразования соглашения о вызове функций C в C++. соглашение о вызове методов. Один из способов написать такой батут — использовать thunk . [5] Другой метод — использовать общий прослушиватель . [2]
  • В Objective-C батут — это объект, возвращаемый методом, который захватывает и реифицирует все отправленные ему сообщения, а затем «перебрасывает» эти сообщения на другой объект, например, в обмене сообщениями более высокого порядка . [6]
  • В GCC компиляторе батут относится к методу реализации указателей на вложенные функции, когда -ftrampolines опция включена. [7] Батут — это небольшой фрагмент кода, который создается «на лету» в стеке, когда берется адрес вложенной функции. Батут устанавливает указатель статической ссылки, который позволяет вложенной функции получать доступ к локальным переменным вмещающей функции. Указатель функции тогда является просто адресом батута. Это позволяет избежать использования «толстых» указателей на функции для вложенных функций, которые содержат как адрес кода, так и статическую ссылку. [8] [9] [10] Однако это противоречит желанию сделать стек неисполняемым по соображениям безопасности.
  • В эзотерическом языке программирования Befunge батут — это инструкция, позволяющая пропустить следующую ячейку в потоке управления .

Стеки без выполнения

[ редактировать ]

Некоторые реализации батутов приводят к потере стеков без выполнения (стек NX). в коллекции компиляторов GNU В частности, (GCC) вложенная функция создает батут в стеке во время выполнения, а затем вызывает вложенную функцию через данные в стеке. Батут требует, чтобы стек был исполняемым.

Стеки без выполнения и вложенные функции в GCC являются взаимоисключающими. Если при разработке программы используется вложенная функция, то стек NX незаметно теряется. GCC предлагает -Wtrampolines предупреждение о состоянии.

Программное обеспечение, разработанное с использованием безопасного жизненного цикла разработки, часто не позволяет использовать вложенные функции из-за потери стеков NX. [11]

См. также

[ редактировать ]
  1. ^ Бейкер, Генри Г. (сентябрь 1995 г.). «CONS не должен аргументировать CONS, Часть II: Чейни о MTA» Уведомления ACM SIGPLAN . 30 (9): 17–20. дои : 10.1145/214448.214454 . S2CID   20720831 . Архивировано из оригинала 11 ноября 2016 г.
  2. ^ Перейти обратно: а б Мюллер, Ганс (31 января 2005 г.). «Утверждение контроля над графическим интерфейсом: команды, значения по умолчанию и пакеты ресурсов» . сегодня.java.net . Батуты . Проверено 6 ноября 2015 г. [1]
  3. ^ «Батуты» . Монопроект. 8 октября 2022 г.
  4. ^ Стангвик, Эйнар Отто (16 августа 2006 г.). «Мысли в Win32 с C++» . Архивировано из оригинала 15 октября 2012 г.
  5. ^ Вейхер, Марсель (2004). «Обмен сообщениями более высокого порядка (HOM)» (PDF) . Архивировано (PDF) из оригинала 27 мая 2018 г. Проверено 26 мая 2018 г.
  6. ^ фуз (18 ноября 2011 г.). «Реализация вложенных функций» . StackOverflow . Архивировано из оригинала 29 марта 2016 г. Проверено 26 мая 2018 г.
  7. ^ «Батуты для вложенных функций» . Использование коллекции компиляторов GNU (GCC) . 2018 [2002]. 18.11. Архивировано из оригинала 27 мая 2018 г. Проверено 26 мая 2018 г.
  8. ^ «Вложенные функции» . Использование коллекции компиляторов GNU (GCC) . 2018 [2002]. 6.4. Архивировано из оригинала 27 мая 2018 г. Проверено 26 мая 2018 г.
  9. ^ Брейэль, Томас М. (2013). «Лексические замыкания для C++» (PDF) . Архивировано (PDF) из оригинала 12 декабря 2017 г. Проверено 26 мая 2018 г.
  10. ^ Уолтон, Джеффри; Манико, Джим; Уолл, Кевин (02 марта 2018 г.) [2013]. «Усиление защиты инструментальной цепочки на основе C» . Открытый проект безопасности веб-приложений (OWASP). Архивировано из оригинала 27 мая 2018 г. Проверено 02 марта 2018 г.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 12a03e397c6a3452b9de780074047ce9__1719577560
URL1:https://arc.ask3.ru/arc/aa/12/e9/12a03e397c6a3452b9de780074047ce9.html
Заголовок, (Title) документа по адресу, URL1:
Trampoline (computing) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)