Процесс познания в синтаксическо-семантической модели
Понимание конкретной программы требует приложения заметных интеллектуальных усилий и использования всех трех рассмотренных выше типов долговременной памяти. Прежде всего программист должен понять синтаксис и отделить комментарии от текста программы, выделить имена переменных и процедур и упорядочить операторы в соответствии с их типами. Затем знания семантической структуры нижнего уровня определенным образом организуются: распознаются функции каждого оператора, границы программных модулей и различия между исполняемой и декларативной информацией. Далее выделяются концепции программирования высокого уровня, например инициирование массивов, знакомые и незнакомые алгоритмы, форматы вывода или условия возникновения ошибок. В конечном итоге читающий программу должен понимать соотношение между конкретной строкой кода и некоторой задачей в данной прикладной области, например поиском кратчайшего пути для автомобиля, доставляющего молоко, составлением платежной ведомости или определением дозы лекарства для больного.
Конечно, предложенная модель идеализирует действительность, но иногда знание прикладной области помогает программисту при поиске строки кода, определяющей, например, является ли маршрут доставки продукции оптимальным. Тот, кто знает прикладную область, способен изучить отдельные аспекты программирования, разбираясь в программах, написанных для решения задач в этой области. Подобным же образом программист может получить сведения о прикладной области путем изучения относящихся к этой области программ. Следовательно, программы есть одновременно и средство общения, и средство обучения.
В целом при чтении программ синтаксические детали быстро ассоциируются с семантикой нижнего уровня, знания организуются в структуры высокого уровня и далее преобразуются в компактные, не зависящие от языка понятия определенной области. После прочтения программы объемом 300 строк опытный программист в состоянии кратко изложить ее содержание, например: «данная программа реализует алгоритм Дейкстры для нахождения покрывающего дерева на примере северо-восточной системы трубопроводов». Другой программист, знакомый и с прикладной областью, и с концепцией программирования, может, используя это краткое описание, реконструировать семантически эквивалентную программу.
Способность квалифицированного программиста преобразовать программу в некоторую внутреннюю семантическую структуру была продемонстрирована на примере задачи запоминания и воспроизведения [73]. В этих опытах после двухминутного изучения квалифицированные программисты были способны успешно восстанавливать по памяти программу из 20 строк, хотя и допускали иногда синтаксические неточности. Им предлагалось произвести корректную замену номеров операторов, имен переменных (языка Фортран) или порядка выполнения операций в случаях, не влияющих на семантику программы.
Возможность независимого от языка внутреннего представления программ была продемонстрирована в нескольких необычных экспериментах. Успевающим студентам-выпускникам предоставляли программу из 22 строк на Паскале для изучения в течение 2 мин. Затем половине студентов предлагалось восстановить ее по памяти. Другой половине студентов было дано задание переписать эту программу на любом другом алгоритмическом языке, которым они владеют. Обе группы успешно воспроизвели программу. Участники эксперимента могли легко описать семантику программы без использования синтаксиса или ключевых слов какого-либо языка программирования.
Как приведенный здесь эксперимент, так и другие вносят свой вклад в развитие рассматриваемой модели. Однако для получения надежных прогнозов на ее основе предстоит еще большая работа.
Опытные программисты начинают составление программы с изучения прикладной задачи и, проектируя по принципу «сверху вниз», создают структурированный по уровням проект программы. Затем возможно итеративное улучшение концептуальной основы и в конце концов проработка синтаксических деталей используемого алгоритмического языка. Начинающие программисты, напротив, склонны сосредоточивать свое внимание на синтаксических деталях, не имея зачастую ясного представления ни о структуре программного обеспечения (применительно к прикладной задаче), ни о проектировании сверху вниз — от высокого уровня к более детальному нижнему уровню [1].