Pascal впервые был реализован для CDC Cyber - мэйнфрейма 1960-х и 1970-х годов, который, как и многие современные ЦП, имел отличную производительность при последовательном выполнении команд, но также и существенное снижение производительности для филиалов. Эта и другие характеристики кибер-архитектуры, вероятно, сильно повлияли на дизайн Паскаля for
петель.
Краткий ответ заключается в том, что для присвоения переменной цикла потребуется дополнительный защитный код и неправильная оптимизация для переменных цикла, которые обычно могут хорошо обрабатываться в 18-битных индексных регистрах. В те дни производительность программного обеспечения высоко ценилась из-за затрат на оборудование и невозможности ускорить его каким-либо другим способом.
Длинный ответ
Семейство Control Data Corporation 6600, в состав которого входит Cyber, представляет собой архитектуру RISC, использующую 60-битные слова центральной памяти, на которые ссылаются 18-битные адреса. Некоторые модели имели (дорогой, поэтому необычный) вариант, модуль сравнения-перемещения (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 бит; Х регистров 60 бит. Настройка от А1 до А5 имеет побочный эффект загрузки соответствующего регистра X1-Х5 содержимым загруженного адреса. Настройка A6 или A7 записывает соответствующее содержимое X6 или X7 в адрес, загруженный в регистр A. A0 и X0 не связаны. Регистры B могут использоваться практически в каждой инструкции в качестве значения для добавления или вычитания из любого другого регистра A, B или X. Следовательно, они отлично подходят для небольших прилавков.
Для эффективного кода регистр B используется для переменных цикла, поскольку для них могут использоваться инструкции прямого сравнения (B2 <100 и т. Д.); сравнения с регистрами X ограничены отношениями с нулем, поэтому сравнение регистра X с 100, скажем, требует вычитания 100 и проверки результата на значение меньше нуля и т. д. Если было разрешено присвоение переменной цикла, 60-битное значение перед назначением в регистр B должен быть проверен диапазон. Это настоящая проблема. Герр Вирт, вероятно, полагал, что и хлопоты, и неэффективность не стоили утилиты - в такой ситуации программист всегда может использовать цикл <code>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 символов, пропуская символ новой строки и что-то еще.
- оценка полного выражения (по сравнению с ярлыками). Они были реализованы не путем прыжка и установки одного или нуля (как это делают большинство генераторов кода сегодня), а с помощью инструкций процессора, реализующих булеву арифметику.