Самомодифицирующийся код не следует рассматривать легкомысленно, но иногда он может привести к значительному увеличению производительности. Если вы занимаетесь программированием очень долго, вы, вероятно, использовали это, даже не осознавая этого.
До широкого использования 486 и выше многие ПК не имели аппаратной поддержки плавающего режима. Это ставило людей, пишущих программы с плавающей запятой, перед дилеммой. Если бы они скомпилировали свою программу для использования встроенных инструкций с плавающей запятой, она бы быстро работала на машине с процессором с плавающей запятой, а не на машинах без такового. Если бы они скомпилировали свою программу с программной эмуляцией с плавающей запятой, она бы работала на всех машинах, но медленно даже на машинах с аппаратным обеспечением с плавающей запятой.
Многие библиотеки компиляторов использовали интересный трюк с самомодифицирующимся кодом. По умолчанию команда ловушки помещалась там, где требовалась операция с плавающей запятой. Обработчик прерывания либо эмулирует инструкцию в программном обеспечении, либо, если он обнаруживает, что она выполняется на машине с аппаратным обеспечением с плавающей запятой, он модифицирует код, заменяя инструкцию прерывания соответствующей аппаратной инструкцией с плавающей запятой, и выполняет ее. Результатом стало программное обеспечение, которое работало на всех машинах и работало почти так же быстро на машине с оборудованием с плавающей запятой, как если бы код был скомпилирован для прямого использования оборудования с плавающей запятой (поскольку большинство операций с высокой интенсивностью операций с плавающей запятой выполняются в циклах, которые выполняются много раз. ).
person
Stephen C. Steel
schedule
24.04.2009