Что такое таблица прыжков?

Может ли кто-нибудь объяснить механику прыжкового стола и зачем он нужен во встроенных системах?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
54
0
40 510
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Из Википедии:

In computer programming, a branch table (sometimes known as a jump table) is a term used to describe an efficient method of transferring program control (branching) to another part of a program (or a different program that may have been dynamically loaded) using a table of branch instructions. The branch table construction is commonly used when programming in assembly language but may also be generated by a compiler.

A branch table consists of a serial list of unconditional branch instructions that is branched into using an offset created by multiplying a sequential index by the instruction length (the number of bytes in memory occupied by each branch instruction). It makes use of the fact that machine code instructions for branching have a fixed length and can be executed extremely efficiently by most hardware, and is most useful when dealing with raw data values that may be easily converted to sequential index values. Given such data, a branch table can be extremely efficient; it usually consists of the following steps: optionally validating the input data to ensure it is acceptable; transforming the data into an offset into the branch table, this usually involves multiplying or shifting it to take into account the instruction length; and branching to an address made up of the base of the table and the generated offset: this often involves an addition of the offset onto the program counter register.

Таблица переходов описана как здесь, но вкратце это массив адресов, на которые ЦП должен перейти в зависимости от определенных условий. Например, оператор switch языка C часто реализуется как таблица переходов, в которой каждая запись перехода переходит к определенной метке «case».

Во встроенных системах, где использование памяти очень велико, многие конструкции лучше обслуживаются с помощью таблицы переходов, а не методов, интенсивно использующих память (например, массивных if-else-if).

Википедия довольно хорошо резюмирует:

In computer programming, a branch table (sometimes known as a jump table) is a term used to describe an efficient method of transferring program control (branching) to another part of a program (or a different program that may have been dynamically loaded) using a table of branch instructions. The branch table construction is commonly used when programming in assembly language but may also be generated by a compiler.

... Use of branch tables and other raw data encoding was common in the early days of computing when memory was expensive, CPUs were slower and compact data representation and efficient choice of alternatives were important. Nowadays, they are commonly used in embedded programming and operating system development.

Другими словами, это полезная конструкция для использования, когда ваша система чрезвычайно ограничена памятью и / или ЦП, как это часто бывает во встроенной платформе.

Таблицы переходов, более известные как таблица переходов, обычно используются только машиной.

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

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

И если вы говорите о том, что я думаю, они вам нужны не только во встроенных системах, но и в любом типе скомпилированной / интерпретируемой среды.

Брайан Джанфоркаро

Ответ принят как подходящий

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

Преимущества этого во встроенном программировании:

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

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

Таблица переходов, также известная как таблица переходов, представляет собой серию инструкций, каждая из которых безоговорочно ведет к другой точке кода.

Вы можете думать о них как о выражении switch (или select), в котором заполнены все кейсы:

MyJump(int c)
{
   switch(state)
   {
      case 0:
         goto func0label;
      case 1:
         goto func1label;
      case 2:
         goto func2label;
   }
}

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

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

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

Один из вариантов использования - взять микроконтроллер стоимостью 0,60 доллара и генерировать композитный (ТВ) сигнал для видеоприложений. Микро не является мощным - на самом деле его едва хватает для записи каждой строки развертки. Таблица переходов будет использоваться для рисования символов, потому что загрузка растрового изображения из памяти займет слишком много времени, а для выталкивания растрового изображения используется цикл for (). Вместо этого есть отдельный переход к букве и строке сканирования, а затем около 8 инструкций, которые фактически записывают данные непосредственно в порт.

-Адам

Насколько я понимаю, случаи переключения фактически скомпилированы в таблицы переходов? Это похоже на избыточное объяснение (таблицы переходов похожи на переключатели, которые похожи на таблицы переходов, которые похожи на переключатели ...)

ArtOfWarfare 13.12.2012 18:30

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

Вместо вложенного переключателя / корпуса

  switch (state)
     case A:
       switch (event):
         case e1: ....
         case e2: ....
     case B:
       switch (event):
         case e3: ....
         case e1: ....

вы можете создать двумерный массив или указатели на функции и просто вызвать handleEvent[state][event]

Другие вопросы по теме