103
Прежние прорывы разрешили второстепенные трудности
Если рассмотреть три наиболее плодотворных шага в произошедшем развитии
программных технологий, то обнаружится, что все они были сделаны в направлении
решения различных крупных проблем разработки программ, но эти проблемы
затрагивали второстепенные, а не относящиеся к сущности трудности. Можно также
видеть естественные пределы экстраполирования каждого их этих направлений.
Языки высокого уровня. Конечно, наибольшее значение для роста
производительности, надежности и простоты имело все более широкое
использование языков высокого уровня. Большинство исследователей считает, что
этим был достигнут, по крайней мере, пятикратный рост производительности при
одновременном выигрыше в надежности, простоте и легкости понимания.
Что делает язык высокого уровня? Он освобождает программу от значительной доли
необязательной сложности. Абстрактная программа состоит из концептуальных
конструкций: операций, типов данных, последовательностей и связи. Конкретная
машинная программа связана с битами, регистрами, условиями, переходами,
каналами, дисками и прочим. В той мере, в какой в языке высокого уровня
воплощены необходимые абстрактной программе конструкции и избегаются
конструкции низшего порядка, он ликвидирует целый уровень сложности,
совершенно не являющийся необходимым свойством программы.
Самое большее, что может сделать язык высокого уровня, — это предоставить все
конструкции, которые по замыслу программиста содержит абстрактная программа.
Конечно, уровень утонченности наших представлений о структурах данных, типах
данных и операциях неуклонно растет, но с постоянно убывающей скоростью. И
языки в своем развитии все больше приближаются к изощренности нашего
мышления.
Более того, с некоторого момента дальнейшая разработка языков высокого уровня
становится обузой, осложняющей, а не упрощающей интеллектуальные задачи
пользователя, редко использующего эзотерические конструкции.
Разделение времени. Большинство исследователей считает, что благодаря работе в
режиме разделения времени произошел большой рост производительности труда
программистов и качества создаваемых программных продуктов, хотя и не такой
значительный, как вызванный использованием языков высокого уровня.
Разделение времени помогает решить совсем другую задачу. Благодаря разделению
времени обеспечивается безотлагательность, и потому возможность иметь общее
впечатление о сложности. Из-за медленной оборачиваемости при пакетной
обработке мы неизбежно забываем мелочи, если не самое направление нашей
мысли, в тот момент, когда мы прервались и начали компиляцию и выполнение
программы. Этот обрыв мысли дорого обходится по времени, поскольку приходится
восстанавливать ее в памяти. В худшем случае, можно вообще потерять
представление о том, что происходит со сложной системой.
Медленная оборачиваемость, как и сложности машинных языков, является
второстепенной, а не существенной трудностью процесса программирования.
Предельный вклад, вносимый разделением времени, определяется непосредственно.
Главное — это сократить время отклика системы. По мере приближения его к нулю,
оно переходит порог скорости человеческого восприятия, составляющей около 100
миллисекунд. Дальше никакой выгоды получить уже нельзя.
Объединенные среды программирования. Считается, что Unix и Interlisp, первые
широко распространенные интегрированные среды программирования, повысили
производительность в несколько раз. Почему?
Они направлены на преодоление второстепенных трудностей совместного
использования программ путем использования общих библиотек, унифицированных
форматов файлов, каналов и фильтров. В результате концептуальные структуры,
которые, в принципе, всегда могут вызывать, обмениваться данными и использовать
друг друга, получают возможность осуществлять это практически.