Имеется еще один принципиально важный источник сложности, затрудняющий "взаимопонимание" с компьютерами. Речь идет об отсутствии в современных компьютерах модели реального мира, согласованной с представлениями о мире у программистов и пользователей. Поэтому в общем случае компьютер не в состоянии контролировать указания программиста или действия пользователя с прагматической точки зрения (контролировать соответствие между действиями и теми целями, ради которых эти действия совершаются, - цели компьютеру неизвестны).
Из-за этого самая "мелкая", с точки зрения создателя программы, описка может привести к совершенно непредсказуемым последствиям (широко известен случай, когда из-за одной запятой в программе на Фортране взорвалась космическая ракета, направлявшаяся на Венеру; пропали усилия, стоившие миллиарды долларов).
Итак, в качестве второго источника сложности в современном программировании следует назвать незнание компьютером реального мира. Лишенный необходимых знаний, компьютер не может не только скорректировать неточно указанные в программе действия, но и проинформировать об отклонениях от направления на цель работы. Традиционное для компьютеров управление посредством указания действий, а не целей требует учета мельчайших нюансов всех обстоятельств, в которых может оказаться исполнитель в процессе предоставления нужной услуги. Это резко увеличивает число объектов, с которыми приходится иметь дело при создании программ. Отсюда повышение сложности программирования, увеличение размера программ, понижение их надежности и робастности.
Со вторым источником сложности борются, развивая методы представления в компьютерах знаний о реальном мире и эффективном учете этих знаний при создании и исполнении "дружественных" программ.
1.14. Два основных средства борьбы со сложностью. Основной критерий качества ЯП
Рассмотренные источники сложности оказывают определяющее влияние на теорию и практику в области ЯП. Важнейшим средством борьбы с семантическим разрывом служит аппарат абстракции-конкретизации, имеющийся в том или ином виде в любом ЯП. Именно этот аппарат - основа проблемной ориентации языковых выразительных средств.
Например, в Фортране характерное средство абстракции - подпрограмма, а соответствующее средство конкретизации - обращение к ней с фактическими параметрами. Поэтому естественный ПОЯ, создаваемый посредством Фортрана, - набор (пакет) проблемно-ориентированных подпрограмм. В более современных ЯП применяют более развитые средства абстракции (абстрактные типы данных, кластеры, фреймы) и соответствующие средства конкретизации (о которых мы еще поговорим). Становятся более богатыми и возможности строить ПОЯ.
Важнейшим средством борьбы с незнанием реального мира служит аппарат прогнозирования-контроля. Имеются ЯП, в которых этот аппарат практически отсутствует (Апл, Форт, Лисп) или очень слаб (любой ассемблер). Однако именно этот аппарат - основа повышения надежности и робастности программ. Последнее не означает, что "дружественные" программы невозможно писать на ЯП со слабым прогнозированием-контролем. Просто в этом случае создание подходящего аппарата полностью возлагается на программиста.
Например, в Фортране характерное средство прогнозирования - встроенные (предопределенные) типы данных. Соответствующий контроль предусмотрен семантикой языка, но средств управления таким контролем нет (новые типы данных вводить нельзя). В таких ЯП, как Паскаль или Ада, этот аппарат более развит, а в так называемых языках искусственного интеллекта он прямо предназначен для представления достаточно полных знаний о мире, целей деятельности и контроля действий как самой программы, так и пользователя.
Упражнение. Приведите примеры средств абстракции-конкретизации и прогнозирования-контроля в известных вам ЯП. Постарайтесь подобрать симметричные, взаимно дополнительные средства. Убедитесь, что эта дополнительность обеспечена не всегда.
Теперь мы готовы сформулировать следующий основной критерий качества ЯП (как инструмента, т. е. с технологической позиции): язык тем лучше, чем менее сложно построенное на его основе производство программных услуг.
На этом оставим пока технологическую позицию и займемся семиотической.
1.15. Язык программирования как знаковая система
Продолжим уточнение понятия "язык программирования". Наше новое интенсиональное определение ЯП таково:
язык программирования - это знаковая система для планирования поведения компьютеров.
Итак, не любой "инструмент", а "знаковая система" и не для произвольных "исполнителей", а только для компьютеров. К ограничению класса исполнителей в этом определении мы подготовились заранее, а вот о знаковых системах еще подробно не говорили.
Знаковая система - это совокупность соглашений (явных или неявных), определяющих класс знаковых ситуаций. Понятие знаковой ситуации в семиотике относят к первичным понятиям, представление о которых создают с помощью примеров, а не явных определений. Необходимые компоненты знаковой ситуации - знак и денотат. Говорят, что знак обозначает денотат (знак называют также обозначением или именем, а денотат - обозначаемым или значением). Так, в модели передачи сообщения само сообщение служит знаком, его смысл - денотатом.
Вот еще знаковые ситуации (первым укажем знак, вторым - денотат): буква и соответствующий звук, дорожный знак ("кирпич") и соответствующее ограничение ("въезд запрещен"), слово и соответствующее ему понятие. Каждый без затруднений пополнит этот список.
Когда класс знаковых ситуаций определяется совокупностью соглашений (правил), устанавливающих закономерную связь между структурой знака и его денотатом, говорят, что эти соглашения образуют знаковую систему (или язык). При этом правила, определяющие структуру допустимых знаков, называются синтаксисом языка, а правила, определяющие соответствующие допустимым знакам денотаты, называются семантикой языка. (Науку о синтаксисах языков называют синтактикой, а слово "семантика" используется для обозначения как конкретных правил некоторого языка, так и общей науки о таких правилах).
Одним из примеров знаковой системы служит позиционная система счисления (например, десятичная). Правила, определяющие перечень допустимых цифр и их допустимое расположение (например, справа налево без разделителей), - это синтаксис. Правила вычисления обозначаемого числа - семантика. При этом запись числа в позиционной системе - знак, а само обозначаемое число - денотат. Известные вам ЯП - также знаковые системы.
Упражнение. Приведите пример синтаксического и семантического правила из таких знаковых систем, как Фортран, Бейсик, Паскаль, Ассемблер.
В общем случае в ЯП знаки - это элементы программ (в том числе полные программы), а денотаты - элементы и свойства поведения исполнителя (атрибуты его поведения), в частности, данные, операции, управление, их структура, их связи и атрибуты. Например, знаку, составленному из шести букв "arctan" (элементу программы на Фортране), использованному в этой программе в подходящем контексте, соответствует в качестве денотата такой элемент поведения исполнителя, как вычисление арктангенса.
Знаку, составленному из двух букв "DO" (элементу программы на Фортране), в одном контексте в качестве денотата может соответствовать такой элемент поведения, как вход в цикл, а в другом - переменная вещественного типа, в третьем - массив целого типа.
Упражнение. Выпишите подходящие контексты.
Итак, знаковая система - это правила образования знаков (синтаксис) и согласованные с ними правила образования денотатов (семантика). Подчеркнем, что правила использования денотатов для целей, выходящих за рамки семантики (т. е. прагматика), обычно не включаются в знаковую систему. Например, в Фортране нет каких-либо правил, ограничивающих применение соответствующих вычислительных процессов для неблаговидных целей.
Теперь уточненное определение ЯП как знаковой системы для планирования поведения компьютеров должно быть полностью понятным.
1.16. Разновидности программирования
Чтобы создать себе более удобную основу для формирования оценок, принципов и требований, примем соглашения, сужающие область наших рассмотрений.
Во-первых, программировать можно с разной целью. Например для развлечения и обучения ("игровое" программирование, его характерное свойство - интерес не столько к программе-результату, сколько к самому процессу программирования); для отработки идей, приемов, инструментов, методов, критериев, моделей ("экспериментальное" программирование, его характерное свойство - созданная программа не предназначена для применения без участия автора, т. е. результат такого программирования неотчуждаем). В дальнейшем будем рассматривать только "индустриальное" программирование, цель которого - создание программных изделий (программных продуктов) на заказ или на продажу. Характерное свойство - отчуждаемость результата.
Во-вторых, может быть различным характер использования заготовок программ. По этому критерию различают по крайней мере три разновидности программирования:
сборочное - программа составляется из заранее заготовленных модулей (так обычно сейчас работают пакеты прикладных программ);
конкретизирующее - программа получается в результате преобразования универсальных модулей-заготовок (в результате их специализации) в расчете на конкретные условия применения; цель специализации - повышение эффективности (снижение ресурсоемкости) универсальной программы;
синтезирующее - роль заготовок относительно невелика.
В дальнейшем нас, как правило, будет интересовать лишь синтезирующее индустриальное программирование, а также элементы сборочного программирования (когда речь пойдет о модульности).
В-третьих, на различных стадиях жизненного цикла программного изделия (из которого мы выделим стадии проектирования, эксплуатации и сопровождения) предъявляются различные, иногда противоречивые, требования к ЯП. Например, сложность программирования не столь существенна на стадии эксплуатации программы, как ее ресурсоемкость. На стадии проектирования важно удобство написания программ, а на стадии сопровождения - удобство их чтения. В первую очередь будем интересоваться стадией проектирования программного изделия, так как на ней в той или иной форме следует учитывать и требования всех остальных стадий жизненного цикла.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |


