Лайфхаки по программированию от Алана Тьюринга (Mark I/II)

Тема в разделе "WASM.ARTICLES", создана пользователем aa_dav, 15 окт 2021.

  1. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    457
    Некоторое время назад я наткнулся на руководство по программированию от самого Алана Тьюринга на когда то новой и модной британской ЭВМ - Manchester/Ferranti Mark I/II: http://curation.cs.manchester.ac.uk/computer50/www.computer50.org… au/turing.pdf
    И там на странице 55 есть замечательная секция "Programming Hints".
    Ознакомимся чем и как дышала передовая программерская мысль в 1951 году...
    Но для начала скопирую сюда немного ликбеза, чтобы вообще понимать что там за ЭВМ была, несколько цитат из первой ссылки:

    В Mark I/II 20-битная инструкция как бы состоит из четырёх пятибитных алфавитно-цифровых символа. Как и в телеграфе весь алфавит и цифры в 32 значения не влазил, поэтому два символа были отведены под "изменение таблицы символов".
    Но самое странное как выглядела таблица текстовых символов, а выглядела она вот так:
    Код (Text):
    1. 0  00000   /   8    00010   %   16   00001   T   24   00011   O
    2. 1  10000   E   9    10010   D   17   10001   Z   25   10011   B
    3. 2  01000   @   10   01010   R   18   01001   L   26   01011   G
    4. 3  11000   A   11   11010   J   19   11001   W   27   11011   "
    5. 4  00100   :   12   00110   N   20   00101   H   28   00111   M
    6. 5  10100   S   13   10110   F   21   10101   Y   29   10111   X
    7. 6  01100   I   14   01110   C   22   01101   P   30   01111   V
    8. 7  11100   U   15   11110   K   23   11101   Q   31   11111   ?
    Здесь три колонки - номер по порядку, номер в бинарном коде и сам символ. Обратите внимание, что двоичные числа в команде Mark I было принято записывать с младшими разрядами справа!
    Кодировка такая странная потому что была взята просто из кодов телеграфного телетайпа тех лет - т.е. передовице телекома так сказать. Вот как эта таблица выглядела в телеграфным пунктам приёмо-передачи на стенке в рамочке:
    [​IMG]
    Так вот программы составлялись тупо этими вот буквенными кодами.
    Вот как выглядит первый пример программы из книги Тьюринга:
    Код (Text):
    1. // /CT/
    2. E/ DSTI
    3. @/ D//H
    4. A/ R//P
    5. :/ /C/S
    6. S/ :CT/
    7. I/ @CTI
    8. U/ :C/S
    9. %/ JS/P
    10. D/ A/
    11. R/ @/
    Сразу не пугайтесь - тут всё просто. Первая колонка - это номер строки программы. / - это нулевой символ, E - это первый, @ - второй - посмотрите снова на таблицу. Т.е. в первой колонке просто выписаны по порядку числа от 0 до 10 в кодировке этой монументальной машины.
    Сама программа находится во второй колонке - 20-битное число представлено четырьмя подряд идущими 5-битными буквами из которых первые две описывают номер ячейки памяти прошитый в инструкции, а последние две - код инструкции и так называемый код B-tube который позволяет делать индексации. Суровые манчестерские инженеры первые годы вот так вот и программировали - обложившись таблицами с перемешанными буквами.

    А вот теперь пойдём на страницу 55 руководства по второй ссылке в этом посте и посмотрим какие полезные приёмы и методики программирования пропагандировал в то время Алан Тьюринг:
    Manoevring space / Место для манёвра
    Редко когда кто сможет написать на страницу инструкции кода сразу в готовом виде - оставляйте между строками с инструкциями пустое место чтобы в случае чего вписать туда забытые команды. По опыту Тьюринга заполненными должны быть примерно 5/8 страницы, а 3/8 оставлены для возможности добавления. Пустые места следует оставлять между цельными последовательностями инструкций (т.е. выполняющих одно монолитное действие в несколько шагов).
    (конечно дело тут в том, что ассемблера с метками в то время не было, поэтому сдвиг программы даже на одно слово требовал ручного выправления всех адресов)
    Do programming directly in teleprint code / Программируйте прямо в кодах телетайпа
    Пишите программу сразу символами телетайпа!
    It is never too soon to learn the meanings of the 64 functions [i.e., the opcodes].
    Храните листочек с расшифровками букв опкодов под рукой и пользуйтесь постоянно и всего через неделю вы будете заглядывать в этот листочек очень редко.
    Counting procedure / Отсчитывающая процедура
    Очень часто в программировании возникает задача повторения одной и той же последовательности инструкций заданное количество раз.
    Тьюринг приводит общую схему решения такой задачи в двух вариантах - while и repeat.
    Discrimination by control transfer / Выбор с передачей управления
    Здесь Тьюринг рассматривает задачу case от целого числа. Используя индексные регистры машины он показывает как сделать goto по массиву переходов.
    Omission of counting / Пропуск повторов
    Иногда в случаях когда нужно совершить цикл малое число раз (например 3) и очень важна скорость, можно не делать инструкции цикла, а повторить инструкции подряд 3 раза.
    (в наше время техника известна как разворачивание цикла)
    Alternative entry / Альтернативная точка входа
    Иногда нужно иметь почти одинаковые процедуры отличающиеся незначительными деталями. Зачастую такое можно организовать реализовав одно и то же тело процедуры с разными точками входа в неё, где и гнездится желаемая разница.
    Changing sign in the accumulator / Смена знака аккумулятора
    В Mark I прямолинейная смена знака аккумулятора возможна только в две инструкции, но Тьюринг обращает внимание на то, что инструкция вычитающая аккумулятор из единицы зачастую может быть отличным решением (видимо когда можно в дальнейшем просто поправить соседнее константное слагаемое).
    Clearing the accumulator / Очистка аккумулятора
    Новичок может впасть в заблуждение, что перед каждой серией вычислений аккумулятор нужно очищать. Тьюринг показывает что некоторые инструкции делают это автоматически.
    Electronic space economy measures / Меры по сохранению места в электронной памяти
    Электронная память (на ЭЛТ) в Mark I работает заметно быстрее более обширной памяти на магнитном барабане, поэтому предлагаются методы по её экономии, такие как размещение полезных данных в адресной части безадресной инструкции - например использованию безадресной инструкции как числа точности которого в части адресных бит достаточно чтобы содержимое кода инструкции (младшие разряды числа) не сказывались значимо на результате.