Введение

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