Эта идея зародилась почти что случайно. Американцы работали над хранением команд внутри машины, так как это был единственный способ достаточно быстрой подачи команд. Алан же просто воспользовался принципом одиночной ленты старой Универсальной машины Тьюринга. Но в обоих случаях не рассматривалась возможность влиять на команды в ходе вычисления. Американцы приняли в расчет эту характеристику только в новом проекте 1947 г. Точно так же, концепция Универсальной машины Тьюринга 1936 г. в рабочем процессе на бумаге не предусматривала изменения «дескриптивного (описательного) числа», которым она оперировала. Эта машина была призвана считывать, декодировать и выполнять таблицу команд, хранимую на ее ленте. Она никогда не стала бы
Столь оригинальное восприятие проистекало из самой универсальности машины, которую предполагалось использовать для любого типа «определенного метода», не обязательно арифметического. Импульсы «1101», хранимые в линии задержки, могли не соотноситься каким-либо образом с числом «тринадцать», а воплощать шахматный ход или фрагмент кода (шифра). Либо, даже если машина занималась арифметическими вычислениями, импульсы «1101» могли не представлять «тринадцать», а указывать на возможную погрешность порядка 13 единиц или обозначать тринадцать в представлении чисел с плавающей запятой, либо еще что-либо, по выбору пользователя машины. Алан с самого начала сознавал, что сложение и умножение не сводились к подаче импульсов на вход сумматора или умножителя аппаратного обеспечения. Импульсы нужно было упорядочить, расшифровать, распределить и свести вместе снова сообразно той схеме, по которой они использовались. Особенно подробно Алан рассмотрел вопрос выполнения арифметических задач в формате с плавающей запятой; он показал, что даже простое сложение двух числе с плавающей запятой требует целой таблицы команд. Алан написал несколько таблиц такого типа. Таблица MULTIP, например, имела целью умножение двух чисел, закодированных и хранимых в формате с плавающей запятой, и кодирование и сохранение результата. Его таблицы зиждились на этой «очень действенной» возможности машины самой транслировать с языка ассемблера в машинный язык биты необходимых команд и затем выполнять их.
Но если даже такая простая операция, как умножение чисел с плавающей запятой, требовала набора команд, тогда процедура любого полезного масштаба должна была включать сведение множества таких наборов команд вместе. Алан представлял себе это не как связывание таблиц, а как иерархию, в которой второстепенные таблицы команд, типа MULTIP, обслуживали бы «главную» таблицу. В качестве конкретного примера главной таблицы он привел таблицу под названием CALPOL, задачей которой было вычисление пятнадцатой степени многочлена в формате с плавающей запятой. Каждый раз, когда требовалось произвести умножение или сложение, она должна была задействовать второстепенной таблицы. Осуществление этого процесса вызова и обратной отсылки второстепенных таблиц
Чтобы начать выполнение второстепенной операции (подпрограммы), нам необходимо отметить только место, где мы покинули главную программу. Когда второстепенная операция завершена, мы находим это место и продолжаем выполнять основную операцию. Каждая из этих второстепенных операций (подпрограмм) должна оканчиваться командой, определяющей упомянутое место. Вопрос — как скрывать и отыскивать это место? Есть несколько способов. Одни из них — сохранить список таких мест на одной или нескольких линий задержки стандартной длины… самое свежее место сокрытия должно быть в нем последним. Указание на нахождение этого последнего места будет храниться на короткой линии задержки, и эта отсылка будет меняться каждый раз, когда будет начинаться или завершаться второстепенная операция. Процессы сокрытия и отыскания довольно замысловаты, зато, к счастью, отпадает необходимость повторять каждый раз команды; сокрытие производится посредством стандартной таблицы команд BURY [скрыть], а отыскание — с помощью таблицы UNBURY [раскрыть].