Pascal был впервые реализован для CDC Cyber-1960-х и 1970-х годов мейнфрейма, который сегодня, как и многие процессоры, имеет отличную последовательную производительность выполнения команд, но также значительно снижает производительность для филиалов. Эти и другие характеристики кибер-архитектуры, вероятно, сильно повлияли на дизайн Паскаля в петлях for
.
Короткие ответы заключается в том, что разрешение присвоения переменной цикла потребует дополнительного защитного кода и перепутанной оптимизации для переменных цикла, которые обычно можно обрабатывать в 18-разрядных индексных регистрах. В те дни производительность программного обеспечения была высоко оценена из-за расхода оборудования и невозможности ускорить его каким-либо другим способом.
Длинный ответ
Контроль Корпорация Data 6600 семья, которая включает в себя Cyber, является архитектура RISC с использованием 60-разрядных слов центральной памяти, на которые ссылается 18-битовые адреса. Некоторые модели имели (дорогостоящий, поэтому необычный) вариант, Compare-Move Unit (CMU), для непосредственного обращения к 6-разрядным символьным полям, но в противном случае не было поддержки «байтов» любого типа. Поскольку CMU нельзя было рассчитывать в целом, большинство Cyber-кода было создано для его отсутствия.Десять символов на слово были обычным форматом данных, пока поддержка символов нижнего регистра не сменилась предварительным 12-разрядным представлением символов.
Инструкции рассчитаны на 15 бит или 30 бит, за исключением того, что инструкции CMU имеют длину 60 бит. Таким образом, до 4 инструкций, упакованных в каждое слово, или два 30 бит, или пару из 15 бит и один 30 бит. 30-битные инструкции не могут охватывать слова. Поскольку адресации ветви могут ссылаться только на слова, цели перехода выровнены по словам.
Архитектура не имеет стека. Фактически, инструкция вызова процедуры RJ
по существу не является повторной процедурой. RJ
изменяет первое слово вызываемой процедуры путем записи перехода к следующей инструкции после того, как инструкция RJ. Вызываемые процедуры возвращаются к вызывающему абоненту, перепрыгивая на их начало, которое зарезервировано для обратной связи. Процедуры начинаются со второго слова. Для реализации рекурсии большинство компиляторов использовали вспомогательную функцию.
В файле реестра имеется восемь экземпляров каждого из трех видов регистра, A0..A7 для обработки адресов, B0..B7 для индексирования и X0..X7 для общей арифметики. Регистры A и B - 18 бит; Регистры X - 60 бит. Установка A1-A5 имеет побочный эффект загрузки соответствующего регистра X1-X5 содержимым загруженного адреса. Установка A6 или A7 записывает соответствующее содержимое X6 или X7 в адрес, загруженный в регистр A. A0 и X0 не связаны. Регистры B могут использоваться практически в каждой инструкции в качестве значения для добавления или вычитания из любого другого регистра A, B или X. Следовательно, они отлично подходят для небольших счетчиков.
Для эффективного кода регистр B используется для переменных цикла, поскольку на них могут использоваться прямые инструкции сравнения (B2 < 100 и т. Д.); сравнение с X-регистрами ограничено отношениями к нулю, поэтому сравнение X-регистра на 100, скажем, требует вычитания 100 и тестирования результата менее нуля и т. д. Если было разрешено присвоение переменной цикла, 60-битное значение должен быть проверен диапазоном перед назначением регистру B. Это настоящая хлопот. Г-н Вирт, вероятно, полагал, что и хлопот, и неэффективность не стоили полезности - программист всегда может использовать цикл while
или repeat
... until
в этой ситуации.
Дополнительная странность
несколько уникальных к Pascal особенности языка непосредственно связаны с аспектами Cyber:
pack
ключевое слово: либо один «символ» потребляет 60-разрядное слово , или он упакован десять символов на слово.
- (необычный) Тип
alfa
: packed array [1..10] of char
- внутренние процедуры
pack()
и unpack()
иметь дело с упакованными символов. Они не выполняют преобразование на современных архитектурах, а только преобразование типов.
- странность
text
файлов против file of char
- нет явного символа новой строки. Управление записью было явно вызвано с помощью
writeln
- Хотя
set of char
был очень полезен на CDC, он не поддерживался на многих последующих 8-разрядных машинах из-за избыточного использования памяти (32-байтовые переменные/константы для 8-разрядного ASCII). Напротив, одно Cyber-слово могло бы управлять нативным набором из 62 символов, опуская новую строку и что-то еще.
- полная оценка выражения (по сравнению с ярлыками).Они были реализованы не путем прыжка и установки одного или нуля (как это делают большинство генераторов кода), а с помощью инструкций CPU, реализующих логическую арифметику.
Это лучший ответ до сих пор. – MaD70
«Оператор for используется, когда число итераций известно заранее» - Wirth 1973, язык программирования Pascal (Пересмотренный отчет) http://maben.homeip.net/static/S100/software/pascal/1973%20The%20Programming%20Language%20Pascal.pdf –