В.В.Крылов. Наука о программах. // Микропроцессорные средства и системы. М., #1, 1985, c.42-43


 

Дискуссионное письмо в редакцию


Наука о программах

В связи с выступлением на страницах "МП" (№ 3, 1984) Г. С. Цейтина и О. К. Тихомирова о психологических аспектах программирования и опубликованными в этом же номере этюдами Л. В. Городней и А. К. Кирпотина из повседневной практики программистов, хотел бы в несколько более общем контексте кратко выстказать свою точку зрения на проблемы развития науки о программах.

Насыщение цивилизации орудиями труда всё в большей степени приводит в действие внутренний психологический механизм, иногда определяемый как "принцип свиньи": если что-то хорошо, то чем его больше, тем лучше. В прошлом веке, когда была предложена первая телеграфная линия, высказывались серьёзные сомнения в её целесообразности. Однако в наше время к моменту, когда ЭВМ вышла за пределы исследовательских лабораторий и вступила в сферу практического использования, сомнений в её полезности не было.

Сейчас мы размышляем уже не о том, в какой степени нужны ЭВМ, мы говорим о дальнейшем развитии индустрии ЭВМ, сожалеем о том, что пока нет достаточно мощной отрасли, специализирующейся в выпуске компьютеров. При этом всё в большей мере осознаётся тот факт, что казавшийся на первых этапах становления вычислительной техники эфемерным и второстепенным программный продукт начинает постепенно становиться самой трудоёмкой составляющей средств компьютерной техники. Эксперты считают, что сохранение существующих темпов создания программ может привести к тому, что всё население Земли будет заниматься разработкой и сопровождением разнообразных программ.

Совершенно естественным в этой связи оказывается вопрос: как повысить производительность труда людей, занимающихся разработкой программного продукта? Как и во многих других аналогичных ситуациях надежды при этом обращаются к науке, так как до сих пор программирование рассматривается всё ещё как специфическое ремесло. Однако здесь мы сталкиваемся с принципиально различными точками зрения на программирование.

Д. Кнут назвал свой многотомный труд "Искусство программирования". Открывая эту книгу, автор пишет, что "процесс составления программы для цифровой вычислительной машины особенно привлекателен тем, что он не только даёт экономические результаты, но и доставляет эстетические переживания, во многом близкие тем, которые испытывают при сочинении стихов или музыки". Эти слова несомненно отражают тот факт, что одна из точек зрения во многом исходит из того, чтобы считать программирование уделом творческих личностей --- художников.

История ЭВМ подарила нам также и другие образы профессиональных программистов, образы одержимых программистов. На западе их называют "хакеры", от слова "to hack" --- рассекать, кромсать. Вот что пишет о хакерах Дж. Вейценбаум: "Хакер действует без определённой цели: он не в состоянии поставить перед собой ясно сформулированную долгосрочную цель и выработать план её достижения, поскольку он обладает лишь уменьем, но не знанием. Он не располагает ничем, что он мог бы анализировать: короче говоря, у него нет предмета для построения теорий. Его мастерство, таким образом, бесцельно. Оно просто не имеет никакого отношения к чему-нибудь, кроме того инструмента, с помощью которого оно может быть реализовано".

Если проанализировать психологическую ситуацию, в которой окзаывается профессиональный программист, то она довольно своеобразна. С одной стороны, программист считает, что может заставить ЭВМ делать всё, что он хочет. С другой стороны, ЭВМ постоянно предоставляет ему неопровержимые свидетельства его неудач. И всякий раз он воспринимает это как свой личный позор. Здесь нет выхода. Если инженер традиционных отраслей техники может смириться с тем, что существуют вещи, которых он пока не знает, то программист действует в мире, созданном им самим. Поэтому ЭВМ бросает вызов могуществу самого программиста, как личности, а не его знаниям.

Можем ли мы и дальше мириться с таким положением? Представляется, что эпоха микропроцессоров, персональных компьютеров, супер ЭВМ требует научного подхода, основу которого составляет анализ и синтез.

Можем ли мы сегодня утверждать, что такая наука о программах уже существует? Исторически первые ЭВМ были предназначены для решения математических задач. Поэтому именно математики стояли у истоков традиционного программирования, теоретическую основу которого составила теория нормальных алгоритмов Маркова, алгоритмических схем Ляпунова и Янова. Принято считать, что наука начинается с квантификации, введения количественных понятий. В науке, предметом которой явились программы, первым таким научно измеряемым понятием стал объём памяти, используемой для размещения программы.

А. П. Ершовым была впервые доказана эквивалентность задачи экономии памяти задаче раскраски графа. С. С. Штаркманом и А. П. Ершовым был предложен подход, основанный на составлении логической шкалы рабочих ячеек и обратном просмотре команд.

Принципиальный вклад в решение задачи об экономии памяти внёс С. С. Лавров, которым было введено понятие операторной схемы и показано, что выбор варианта распределения памяти эквивалентен преобразованиям графа. В настоящее время работы этого направления развивают алгоритмическую технику экономии памяти: в контексте более широких преобразований программ распространяют теорию на более содержательные классы операторных схем и программ, развивают методы эффективного программирования условий.

Математическая теория лежит и в основе школы В. М. Глушкова, исходящей из понятия системы, алгоритмических алгебр, тесно связанного с общей теорией автоматов. Программа, согласно этому подходу, отождествляется с таким автоматом. На этой основе удалось доказать ряд строгих утверждений о построении регулярных форм программ, оптимизировать процессы трансляции и микропрограммную реализацию команд ЭВМ.

Попытки охватить теорией более сложные программные конструкции привели к введению в теорию представлений программ как цепочек предложений формальных языков и грамматик. В. М. Глушковым и его сотрудниками была изучена связь между автоматами и грамматиками, построена теорема об эквивалентности множества всех автоматных грамматик языков и регулярных цепочек конечных детерминированных автоматов. Развита теория параметрических систем программирования, состоящая в эффективном решении проблемы синтаксического анализа для широкого класса языков программирования. Проблема формализации синтаксического описания языка решена путём задания метаязыков синтаксиса и семантики.

  Работы этих направлений позволили подвинуть вперёд разработку трансляторов, систем микропрограммирования. Выросла эффективность работы по созданию сложных программных структур автоматизации программирования. Аксиоматический алгебраический подход к программам продолжает развиваться в направлении отыскания достаточно общих и в то же время богатых структур, адекватным программам, с целью нахождения регулярных методов их синтеза и анализа.

К сожалению, абстрактность математического подхода не позволяет учитывать при проектировании программ многих важных характеристик, не относящихся к их алгебраической сущности. Например, необходимость ясного документирования программ, тестирования, сопровождения программ объёмом в тысячи и сотни тысяч команд приводило программистов к некоторым интуитивным принципам, неочевидным с математической точки зрения.  Так появляется "прагматическая" наука о программах, "технология программирования". Понимание необходимости расчленения программы на самостоятельные, удобочитаемые части привело к появлению технологии модульного программирования. В 1961 г. Дейкстрой были сформулированы в общем виде правила структурного подхода к проектированию программ.

Сейчас под структурным программированием понимают "проектирование, написание и тестирование программ в соответствии с определённой дисциплиной". Мак Кракен, однако, сказал об этом: "Не многие рискнули бы дать определение. Не ясно, существует ли оно вообще". Когда Кнут попросил Хоара дать краткое определение структурного программирования, Хоар ответил, что это --- "систематическое использование абстракции для управления массой деталей и способ документирования, который помогает проектировать программу".

В основу абстракций структурного программирования положены работы Бома и Джакопини, строго показавших, что любая программа может быть построена композицией всего лишь трёх базовых структур: следования, развилки и цикла. Структурированная программа представляет собой иерархию этих базовых структур. Построены правила преобразования неструктурированных программ в структурированные. Существенной стороной подхода структурного программирования является его прагматизм. Многие языки программирования стали основываться на концепции структурного подхода: АДА, Модула II, Паскаль и др. Структурный подход можно по праву назвать "технологической наукой о программах".

Итак, "математика программ" и "технология программ". В то же время программный продукт является неотъемлемой частью современного мира, объективной реальностью. Его как отчуждённый от человека продукт можно изучать экспериментально. Так появилась ещё одна "физическая наука о программах". В 1976 г. Хелстедом были опубликованы первые работы, посвящённые "термодинамике программ", позже названной "метрической теорией программ".

В основу этой теории положено приближённое комбинаторное соотношение, определяющее длину программы через число простых (различных) операторов и простых операндов. Это простое соотношение обладает удивительно мощным экстраполирующим свойством: достаточно знать, сколько будет обрабатываться данных и какими операторами, для того, чтобы предсказать, какой длины будет реализующая алгоритм программа.

Естественно, что это соглашение было подвергнуто всесторонней экспериментальной проверке. Уравнение длины проверялось многими исследователями, и нигде коэффициент корреляции с экспериментальными результатами для самых различных программ не составил меньше 0,95. На основе уравнения длины были предложены подходы к априорной оценке объёма памяти для программы, реализующей заданный алгоритм с учётом уровня языка реализации.

Введено корректное количественное определение уровня языка на проблемной области, уровня программы. Теория здесь дала возможность квантифицировать уровень "интеллектуального содержания" алгоритма, совершенство программы. В теории классифицируются все несовершенства программ, уменьшающие их эффективность, производится прогнозирование времени разработки программ, числа ошибок программирования априорно по заданному алгоритму.

Всё это представляется во многом неправдоподобным, даже неверным... Как, зная только алгоритм решения задачи, определить время его программирования, да ещё и оценить число ошибок, которые будут сделаны? На этот вопрос не даёт ответа никакая наука --- утверждают сегодня многие. Это утверждение тесно смыкается с ортодоксальным подходом к программированию, согласно которому наука ничего не может дать для практики программирования в силу её глубокой субъективности. В попытке внести ясность в эту проблему, автор предлагает провести аналогию с техникой и сравнить технические науки и изобретательство.

Здесь налицо диалектическое взаимодействие, которое никогда не будет односторонне разрешено. Вообще говоря, мы настолько глубоко вошли сейчас в мир, заполняемый программами, что пора уже поставить перед собой вопрос: кто же такой сегодняшний программист - инженер-проектировщик или рабочий, создающий непосредственно потребляемый продукт, часть ЭВМ? Нужны ли нормировщики в программировании?

Эти и многие другие вопросы, правильное их понимание дадут нам возможность уменьшить время тех неизбежных "человеческих мук", в процессе которых рождается новый цикл наук о законах человеческого мышления. Первыми вестниками этого процесса являются попытки создать науку о программах --- объективно отчуждённых продуктах человеческого интеллекта.

"Программирование --- зеркало разума" --- писал Джералд Вейнберг. Путь человечества к созданию науки о программах --- это путь к познанию самих себя как интеллектуальных субстанций. Из истории известно, что внедрение в столь интимную область протекало весьма болезненно. Вспомним хотя бы средневековые запреты на анатомирование трупов, когда люди делали первые попытки познать самих себя как физические объекты. В наше время каждая программа --- это в некотором роде тот же "труп", против анатомирования которого возражают сторонники программирования как искусства, это тот объект, который никогда нельзя будет свести к точной математической категории. "На ошибках учатся" --- это высказывание в программировнии следует понимать буквально.

Наука о программах, понимаемая с разных позиций, по-разному испытывает дифференциацию и интеграцию. Это начало наук о законах интеллектуального мира, созданного самим человеком.


В. В. Крылов, доктор технических наук, профессор,  зав.кафедрой Горьковского политехнического института
 


В.В.Крылов. Наука о программах. // Микропроцессорные средства и системы. М., #1, 1985, c.42-43