2016-12-06 3 views
0

Можно ли написать программу, которая вводит пользовательский ввод во время выполнения, помеченную как n, а затем выполняет набор инструкций n-кода, определенный по исходному коду, одну итерацию сразу после другой, вместо того, чтобы увеличивать счетчик переменную и сравнить ее с пользовательским вводом после каждой итерации? Другими словами, можете ли вы просто сказать процессору «делать это n раз», если процессор не инициирует счетчик, который обновляет себя и проверяется на n после каждой итерации?Итерация вводимое пользователем количество раз без сравнения?

+0

Ваш вопрос о уровне инструкций процессора (любого оборудования) или любом языке программирования (какой бы высокий уровень)? – kostix

+0

Я имею в виду, если вы имеете в виду последний, сам ответ может быть неоднозначным, поскольку достаточно высокоуровневый язык просто * скроет * факт подсчета за какой-то петлевой конструкцией. Например, вы можете сделать это в простой оболочке bourne: 'read n; для i in \ 'seq 1 $ n \'; do echo $ i; done' - как вы можете видеть, нет счетчика, только цикл, и все же вы повторяете ровно 'n' раз - как было введено. – kostix

+0

Если вы захотите узнать, имеет ли какая-либо существующая арка H/W некоторая команда ЦП, которая неявно перебирает кусок кода, вопрос становится более интересным. В верхней части головы я вспоминаю «LOOPNE»/«LOOPNZ» x86, но они уменьшают значение в специальном регистре, который изначально содержит количество итераций. Если с вами все в порядке - свойство декремента делается неявно * выполняется, тогда это ответ ;-) В противном случае, пожалуйста, сушите свой вопрос. – kostix

ответ

0

Вид. Что вы можете сделать, так это взять список инструкций для выполнения, повторить их n раз (обязательно исправить любые абсолютные прыжки), добавив function prologue and epilogue, сохранив результат до area of memory that is allowed to execute code и назвав начало этой области как функцию ,

Обратите внимание, что выполнение такого рода генерации действительно сложно сделать правильно на таких языках, как C. Вам, вероятно, придется либо опуститься, либо написать свой код (или, по крайней мере, некоторые из них) в сборке, либо пойти выше и используйте язык типа C#, который позволяет вам манипулировать некоторым представлением кода, которое затем скомпилируется в машинный код.

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

Компиляторы иногда частично выполняют эту оптимизацию автоматически. Это называется loop unrolling.

 Смежные вопросы

  • Нет связанных вопросов^_^