В истории вычислений оптимальное программирование или оптимальное кодирование — это практика размещения инструкций компьютерной программы в памяти таким образом, чтобы минимизировать время, которое машина тратит на ожидание инструкций. Это представляет исторический интерес в основном из-за конструкции многих ранних цифровых компьютеров.
Большинство ранних компьютеров использовали некоторую форму последовательной памяти, в первую очередь память с линией задержки или магнитные барабаны . В отличие от памяти с произвольным доступом современных компьютеров, слова в последовательной памяти доступны по одному за раз; время, необходимое для доступа к конкретному слову, зависит от «расстояния» между ним и словом, которое в данный момент считывается. Если заданная линия задержки содержала n слов, среднее время чтения слова составляло бы n /2 слов. Без оптимального кодирования такая машина проводила бы большую часть своего времени в праздном ожидании инструкций и данных. [1]
Чтобы обойти эту проблему, многие машины, в частности ACE Алана Тьюринга и его потомки, включали поле, указывающее адрес следующей инструкции, которая должна быть выполнена, в их формате инструкций. Программист, использующий оптимальное кодирование, искал время, необходимое для выполнения текущей инструкции, вычислял, насколько далеко система памяти переместится за это время, а затем помещал следующую инструкцию для программы в это место. Таким образом, когда текущая инструкция завершалась, и компьютер искал следующую, как указано в инструкции, эта ячейка памяти как раз прибывала и могла быть немедленно прочитана. Например, если программист только что закодировал инструкцию по адресу 400, и для выполнения инструкции требовалось 4 слова, программист устанавливал поле «следующий адрес» инструкции на 404 и помещал туда следующую инструкцию.ADD
ADD
В Соединенных Штатах оптимальное кодирование чаще всего применялось на IBM 650 [2] и Bendix G-15 . Обе машины имели оптимизирующие ассемблеры (SOAP для IBM, POGO для Bendix), которые могли автоматизировать эту задачу.