- •1. Программное средство как продукт технологии программирования
- •1.1. Программа как формализованное описание процесса обработки данных. Программное средство.
- •1.2. Неконструктивность понятия правильной программы.
- •1.3. Надежность программного средства.
- •1.4. Технология программирования как технология разработки надежных программных средств
- •1.5. Технология программирования и информатизация общества.
- •2. Источники ошибок в программных средствах
- •2.1. Интеллектуальные возможности человека.
- •2.2. Неправильный перевод как причина ошибок в программных средствах.
- •2.3. Модель перевода.
- •2.4. Основные пути борьбы с ошибками.
- •3. Общие принципы разработки программных средств
- •3.1. Специфика разработки программных средств.
- •3.2. Жизненный цикл программного средства.
- •3.3. Понятие качества программного средства.
- •3.4. Обеспечение надежности - основной мотив разработки программных средств.
- •3.5. Методы борьбы со сложностью.
- •3.6. Обеспечение точности перевода.
- •3.7. Преодоление барьера между пользователем и разработчиком.
- •3.8. Контроль принимаемых решений.
- •4. Внешнее описание программного средства
- •4.1. Назначение внешнего описания программного средства и его роль в обеспечении качества программного средства.
- •4.2. Определение требований к программному средству.
- •4.3. Спецификация качества программного средства.
- •4.4. Функциональная спецификация программного средства.
- •4.5. Методы контроля внешнего описания программного средства.
- •5. Методы спецификации семантики функций
- •5.1. Основные подходы к спецификации семантики функций.
- •5.2. Метод таблиц решений.
- •5.3. Операционная семантика.
- •5.4. Денотационная семантика.
- •5.5. Аксиоматическая семантика.
- •5.6. Языки спецификаций.
- •6. Архитектура программного средства
- •6.1. Понятие архитектуры программного средства.
- •6.2. Основные классы архитектур программных средств.
- •6.3. Архитектурные функции.
- •6.4. Контроль архитектуры программных средств.
- •7. Разработка структуры программы и модульное программирование
- •7.1. Цель модульного программирования.
- •7.2. Основные характеристики программного модуля.
- •7.3. Методы разработки структуры программы.
- •7.4. Контроль структуры программы.
- •8. Разработка программного модуля
- •8.1. Порядок разработки программного модуля.
- •8.2. Структурное программирование.
- •8.3. Пошаговая детализация и понятие о псевдокоде.
- •8.4. Контроль программного модуля.
- •9. Доказательство свойств программ
- •9.1. Обоснования программ. Формализация свойств программ.
- •9.2. Свойства простых операторов.
- •9.3. Свойства основных конструкций структурного программирования.
- •9.4. Завершимость выполнения программы.
- •9.5. Пример доказательства свойства программы.
- •10. Тестирование и отладка программного средства
- •10.1. Основные понятия.
- •10.2. Принципы и виды отладки.
- •10.3. Заповеди отладки.
- •10.4. Автономная отладка модуля.
- •10.5. Комплексная отладка программного средства.
- •11. Обеспечение функциональности и надежности программного средства
- •11.1. Функциональность и надежность как обязательные критерии качества программного средства.
- •11.2. Обеспечение завершенности программного средства.
- •11.3. Обеспечение точности программного средства.
- •11.4. Обеспечение автономности программного средства.
- •11.5. Обеспечение устойчивости программного средства.
- •11.6. Обеспечение защищенности программных средств.
- •12. Обеспечение качества программного средства
- •12.1. Общая характеристика процесса обеспечения качества программного средства.
- •12.2. Обеспечение легкости применения программного средства.
- •12.3. Обеспечение эффективности программного средства.
- •12.4. Обеспечение сопровождаемости.
- •13. Документирование программных средств
- •13.1. Документация, создаваемая в процессе разработки программных средств.
- •13.2. Пользовательская документация программных средств.
- •13.3. Документация по сопровождению программных средств.
- •14. Аттестация программного средства
- •14.1. Назначение аттестации программного средства.
- •14.2. Виды испытаний программного средства.
- •14.3. Методы оценки качества программного средства.
- •15. Оъектный подход к разработке программных средств
- •15.1. Объекты и отношения в программировании. Сущность объектного подхода к разработке программных средств.
- •15.2. Объектный и субъектный подходы к разработке программных средств.
- •15.3. Объектный подход к разработке внешнего описания и архитектуры программного средства.
- •16. Компьютерная поддержка разработки и сопровождения программных средств
- •16.1. Инструменты разработки программных средств.
- •16.2. Инструментальные среды разработки и сопровождения программных средств.
- •16.3. Инструментальные среды программирования.
- •16.4. Понятие компьютерной технологии разработки программных средств и ее рабочие места.
- •16.5. Инструментальные системы технологии программирования.
5.4. Денотационная семантика.
В денотационной семантике алгебраического подхода рассматривается также система равенств вида (5.3), которая интерпретируется как система функциональных уравнений, а определяемые функции являются некоторым решением этой системы. В классической математике изучению функциональных уравнений (в частности, интегральных уравнений) уделяется большое внимание и связано с построением достаточно глубокого математического аппарата. Применительно к программированию этими вопросами серьезно занимался Д. Скотт [5.3].
Основные идеи денотационной семантики проиллюстрируем на более простом случае, когда система равенств (5.3) является системой языковых уравнений:
X1= phi[1,1] U phi[1,2] U ... U phi[1,k1],
X2= phi[2,1] U phi[2,2] U ... U phi[2,k2],
. . . . . . . . . . . . . . . . . . . . . . . . . . .
Xn= phi[n,1] U phi[n,2] U ... U phi[n,kn],
(5.4)
причем i-ое уравнение при ki=0 имеет вид
Xi=Æ
Как известно, формальный язык - это множество цепочек в некотором алфавите. Такую систему можно рассматривать как одну из интерпретаций набора правил некоторой грамматики, представленную в форме Бэкуса-Наура (каждое из приведенных уравнений является аналогом некоторой такой формулы). Пусть фиксирован некоторый алфавит A={a1, a2, ... , am} терминальных символов грамматики, из которых строятся цепочки, образующие используемые в системе (5.4) языки. Символы X1, X2, ... , Xn являются метапеременными грамматики, здесь будут рассматриваться как переменные, значениями которых являются языки (множества значений этих метапеременных). Символы phi[i,j], i=1,...,n, j=1,...,kj, обозначают цепочки в объединенном алфавите терминальных символов и метапеременных:
phi[i,j] Î (A | {X1, X2, ... , Xn})* .
Цепочка phi[i,j] рассматривается как некоторое выражение, определяющее значение, являющееся языком (множеством цепочек в алфавите A). Такое выражение определяется следующим образом. Если значения X1, X2, ... , Xn заданы, то цепочка
phi= Z1 Z2 ... Zk , Zi Î (A | {X1, X2, ... , Xn}),
обозначает сцепление множеств Z1, Z2, ... , Zk , причем вхождение в эту цепочку символа aj представляет множество из одного элемента {aj}. Это означает, что phi определяет множество цепочек
{p1 p2 ... pk | pj Î Zj, j=1,...,k},
причем цепочка
p1 p2 ... pk
представляет собой последовательность выписанных друг за другом
цепочек p1, p2, ... , pk . Таким образом, каждая правая часть уравнений системы (5.4) представляет собой объединение множеств цепочек.
Решением системы (5.4) является набор значений (языков)
L1, L2, ... , Ln
переменных X1, X2, ... ,Xn, для которых все уравнения системы (5.4) превращаются в тождество.
Рассмотрим в качестве примера частный случай системы (5.4), состоящий из одного уравнения
X= a X U b X U c
с алфавитом A={a,b,c}. Решением этого уравнения является язык
L={ phi c | phi Î {a,b}*}.
Система (5.4) может иметь несколько решений. Так в рассмотренном примере помимо L решениями являются также
L1=L U {phi a | phi Î {a,b}*}
и
L2=L U {phi b | phi Î {a,b}*}.
В соответствии с денотационной семантикой в качестве определяемого решения системы (5.4) принимается наименьшее. Решение (L1,L2, ... ,Ln) системы (5.4) называется наименьшим, если для любого другого решения (L1',L2',...,Ln') выполняется
L1 Í L1', L2 Í L2', ... , Ln Í Ln'.
Так в рассмотренном примере наименьшим (а значит, определяемым денотационной семантикой) является решение L.
В качестве метода решения систем уравнений (5.3) и (5.4) можно использовать метод последовательных приближений. Сущность этого метода для системы (5.4) заключается в следующем. Обозначим правые части уравнений системы (5.4) операторами Ti(X1,X2,...,Xn). Тогда система (5.4) примет вид
X1=T1(X1,X2, ... ,Xn),
X2=T2(X1,X2, ... ,Xn),
. . . . . . . . . .
Xn=Tn(X1,X2, ... ,Xn).
(5.5)
В качестве начального приближения решения этой системы примем набор языков (L1[0], ... , Ln[0]) = (Æ, Æ,..., Æ). Каждое следующее приближение определяется по формуле:
(L1[i],...,Ln[i])= (T1(L1[i-1], ..., Ln[i-1]), . . . . . . . . (Tn(L1[i-1], ..., Ln[i-1])).
Так как операции объединения и сцепления множеств являются монотонными функциями относительно отношения порядка Н , то этот процесс сходится к решению (L1,...,Ln) системы (5.5), т.е.
(L1,...,Ln)= (T1(L1,...,Ln), ..., Tn(L1,...,Ln))
и это решение является наименьшим. Это решение называют еще наименьшей неподвижной точкой системы операторов
T1, T2, ... , Tn.
В рассмотренном примере этот процесс дает следующую последовательность приближений:
L[0]= Æ, L[1]= {c}, L[2]= {c,ac,bc},
L[3]= {c,ac,bc,aac,abc,bac,bbc},
. . . . . . . . . . . . . . . .
Этот процесс сходится к указанному выше наименьшему решению L.