24
ГЛАВА 1. ПОНЯТИЯ
сти, и надежности программ
9
.
Для большинства существующих языков характерно, что программист
может (и должен!) думать о выполнении программы как о работе автомата,
имеющего активный процессор и пассивную память (возможно, разнород-
ную), связанные каналом. Появление в языке структуры памяти и так назы-
ваемых высокоуровневых конструкций, а также возможности использования
библиотек — это всего лишь повышение уровня абстрактного вычислителя
языка, который, тем не менее, трактуется как автомат фон Неймановского ти-
па, пусть даже с весьма сложными командами. Если язык предусматривает
возможность отхода программиста от фон Неймановского образа мышления,
то мы называем этот язык нетрадиционным. С этой точки зрения такие со-
временные языки, как
С++
или
Ada
, остаются традиционными, а, к примеру,
такой “патриарх языкотворчества”, как
LISP
— нетрадиционен.
Данное разграничение традиционных и нетрадиционных языков нельзя
рассматривать в качестве точного определения. Достаточно развитый язык
позволяет выражать алгоритмы в разных стилях, и программист может себе
позволить строить тексты программ (фрагментов программ) в соответствии с
особенностями решаемой задачи, отходя от тех правил,которые поддержива-
ются явно языком. Но если в языке не хватает возможностей, адекватных для
такого построения, а это, вообще говоря, обычная ситуация, то приходится
прибегать к моделированию нужных возможностей подручными средствами.
Когда при этом требуется забота об эффективности, а это опять-таки обыч-
но, необходимо учитывать реалии конкретного компьютера. Как следствие,
весьма вероятны нарушение адекватности моделирования и потеря нагляд-
ности решения.
В заключение настоящего раздела приведем перечень (далеко не полный!)
языков, которые мы относим к классу традиционных, сопровождая его не-
большими комментариями.
1. FORTRAN. Самый почтенный долгожитель среди языков программи-
9
Как уже отмечалось, отклонение от принципа однородности памяти для повышения эф-
фективности используется и в оборудовании. Сегментация, быстрые регистры, кэширова-
ние — далеко не единственные решения этого плана. Нарушение принципа здесь лишь ча-
стичное: ячейка любого из видов по-прежнему способна принимать значения разного типа,
по-прежнему смысл значения раскрывается только процессором. Заслуживают упоминания
и более радикальные архитектуры, предусматривающие тегирование (см. стр. 62), а также
полное отделение в памяти областей, в которые можно записывать данные и команды (в
обычном режиме выполнения программ процессору не разрешается записывать что-либо в
область команд, в результате повышается надежность программ).