· Защиту памяти,
· Два режима функционирования компьютера: привилегированный и рабочий (пользовательский),
· Два вида операций: привилегированные и ординарные, корректную реализацию прерываний и начального включения компьютера,
· Временное прерывание.
Защита памяти означает возможность программным путем задавать для каждой программы недоступные для нее участки памяти. В привилегированном режиме могут выполняться любые операции (как ординарные, так и привилегированные), а в рабочем режиме - только ординарные. Попытка выполнить привилегированную операцию, а также обратиться к защищенной памяти в рабочем режиме вызывает соответствующее прерывание. Причем к привилегированным операциям относятся операции изменения защиты памяти и режима функционирования, а также доступа к внешней информационной среде. Начальное включение компьютера и любое прерывание должно автоматически включать привилегированный режим и отмену защиты памяти. В этом случае управляющая программа (операционная система) может полностью защитить себя от влияния других программ, если все точки передачи управления при начальном включении и прерываниях будут принадлежать этой программе, если она никакой другой программе не позволит работать в привилегированном режиме (при передаче управления любой другой программе будет включаться только рабочий режим) и если она полностью защитит свою память (содержащую, в частности, всю се управляющую информацию, включая так называемые вектора прерываний) от других программ. Тогда никто не помешает ей выполнять любые реализованные в ней функции защиты других программ (в том числе и доступа к внешней информационной среде). Для облегчения решения этой задачи часть такой программы помещается в постоянную память, т.е. Неотделима от самого компьютера. Наличие временного прерывания позволяет управляющей программе защититься от зацикливания в других программах (без такого прерывания она могла бы просто лишиться возможности управлять).
Защита от отказов "своей" программы обеспечивается надежностью этой программы, на что ориентирована вся технология программирования, обсуждаемая в настоящем курсе лекций.
Защита от ошибок пользователя (помимо ошибок входных данных, см. Обеспечение устойчивости пс) обеспечивается выдачей предупредительных сообщений о попытках изменить состояние внешней информационной среды с требованием подтверждения этих действий, а также возможностью восстановления состояния отдельных компонент внешней информационной среды. Последнее базируется на осуществлении архивирования изменений состояния внешней информационной среды.
Защита от несанкционированного доступа обеспечивается использованием
Секретных слов (паролей). В этом случае каждому пользователю предоставляется определенные информационные и процедурные ресурсы (услуги), для использования которых требуется предъявления пс некоторого пароля, ранее зарегистрированного в пс этим пользователем. Другими слова, пользователь как бы «вешает замок» на выделенные ему ресурсы, «ключ» от которого имеется только у этого пользователя. Однако, в отдельных случаях могут быть предприняты настойчивые попытки взломать такую защиту, если защищенные ресурсы представляют для кого-то чрезвычайную ценность. Для такого случая приходится предпринимать дополнительные меры защиты от взлома защиты.
Защита от взлома защиты связана с использованием в пс специальных программистских приемов, затрудняющих преодоление защиты от несанкционированного доступа. Использование обычных паролей оказывается недостаточной, когда речь идет о чрезвычайно настойчивом стремлении (например, преступного характера) добиться доступа к ценной информации.
Другая разновидность такой защиты связана с защитой сообщений, пересылаемых по компьютерным сетям, преднамеренных (или злонамеренных) искажений. Такое сообщения может перехватываться на "перевалочных" пунктах компьютерной сети и подменяться другим сообщением от автора перехваченного сообщения. Такая ситуация возникает прежде всего при осуществлении банковских операций с использованием компьютерной сети. Путем подмены такого сообщения, являющего распоряжением владельца банковского счета о выполнении некоторой банковской операции деньги с его счета могут быть переведены на счет "взломщика" защиты (своеобразный вид компьютерного ограбления банка). Защиту от такого взлома защиты можно осуществить следующим образом. Наряду с функцией f определяющей компьютерную подпись владельца секретного слова x, которую знает адресат защищаемого сообщения (если только ее владелец является клиентом этого адресата), в пс определена другая функция stamp, по которой отправитель сообщения должен вычислить число s=stamp(x,r), используя секретное слово x и текст передаваемого сообщения r. Функция stamp также считается хорошо известной всем пользователям пс и обладает таким свойством, что по s практически невозможно ни восстановить число x, ни подобрать другое сообщение r с соответствующей компьютерной подписью.
Тестирование и отладка программного средства:
отладка пс - это деятельность, направленная на обнаружение и исправление ошибок
в пс с использованием процессов выполнения его программ. Тестирование пс - это
процесс выполнения его программ на некотором наборе данных, для которого
заранее известен результат применения или известны правила поведения этих
программ. Указанный набор данных называется тестовым или просто тестом. Таким
образом, отладку можно представить в виде многократного повторения трех
процессов: тестирования, в результате которого может быть констатировано
наличие в пс ошибки, поиска места ошибки в программах и документации пс и
редактирования программ и документации с целью устранения обнаруженной ошибки.
Другими словами:
Отладка = тестирование + поиск ошибок +
редактирование.
В зарубежной литературе отладку часто понимают только как процесс поиска и исправления ошибок (без тестирования), факт наличия которых устанавливается при тестировании. Иногда тестирование и отладку считают синонимами. В нашей стране в понятие отладки обычно включают и тестирование, поэтому мы будем следовать сложившейся традиции. Впрочем, совместное рассмотрение в данной лекции этих процессов делает указанное разночтение не столь существенным. Следует однако отметить, что тестирование используется и как часть процесса аттестации пc.
Успех отладки в значительной степени
предопределяет рациональная организация тестирования. При отладке отыскиваются
и устраняются, в основном, те ошибки, наличие которых в пс устанавливается при
тестировании. Как было уже отмечено, тестирование не может доказать
правильность пс, в лучшем случае оно может продемонстрировать наличие в нем
ошибки. Другими словами, нельзя гарантировать, что тестированием пc
практически выполнимым набором тестов можно установить наличие каждой имеющейся
в пc ошибки. Поэтому
возникает две задачи. Первая: подготовить такой набор тестов и применить к ним
пс, чтобы обнаружить в нем по возможности большее число ошибок. Однако, чем
дольше продолжается процесс тестирования (и отладки в целом), тем большей
становится стоимость пc.
Отсюда вторая задача: определить момент окончания отладки пс (или отдельной его
компоненты). Признаком возможности окончания отладки является полнота охвата
пропущенными через нс тестами (т.е. Тестами, к которым применено пс) множества
различных ситуаций, возникающих при выполнении программ пс, и относительно
редкое проявление ошибок в пс на последнем отрезке процесса тестирования.
Последнее определяется в соответствии с требуемой степенью надежности пc,
указанной в спецификации его качества.
.2.3 История создания языка с++
Язык с++ возник в начале 1980-х годов, когда сотрудник фирмы bell labs бьёрн страуструп придумал ряд усовершенствований к языку c под собственные нужды. Когда в конце 1970-х годов страуструп начал работать в bell labs над задачами теории очередей (в приложении к моделированию телефонных вызовов), он обнаружил, что попытки применения существующих в то время языков моделирования оказываются неэффективными, а применение высокоэффективных машинных языков слишком сложно из-за их ограниченной выразительности. Так, язык симула имеет такие возможности, которые были бы очень полезны для разработки большого программного обеспечения, но работает слишком медленно, а язык bcpl достаточно быстр, но слишком близок к языкам низкого уровня и не подходит для разработки большого программного обеспечения.
Вспомнив опыт своей диссертации, страуструп решил дополнить язык c (преемник bcpl) возможностями, имеющимися в языке симула. Язык c, будучи базовым языком системы unix, на которой работали компьютеры bell, является быстрым, многофункциональным и переносимым. Страуструп добавил к нему возможность работы
С классами и объектами. В результате практические задачи моделирования оказались доступными для решения как с точки зрения времени разработки (благодаря использованию симула-подобных классов), так и с точки зрения времени вычислений (благодаря быстродействию c). В первую очередь в c были добавлены классы (с инкапсуляцией), наследование классов, строгая проверка типов, inline-функции и аргументы по умолчанию. Ранние версии языка, первоначально именовавшегося «c with classes» («си с классами»), стали доступны с 1980 года.
Разрабатывая c с классами, страуструп написал программу cfront - транслятор, перерабатывающий исходный код c с классами в исходный код простого c. Это позволило работать над новым языком и использовать его на практике, применяя уже имеющуюся в unix инфраструктуру для разработки на c. Новый язык, неожиданно для автора, приобрёл большую популярность среди коллег и вскоре страуструп уже не мог лично поддерживать его, отвечая на тысячи вопросов.
При создании c++ бьёрн страуструп хотел:
· Получить универсальный язык со статическими типами данных, эффективностью и переносимостью языка c.
· Непосредственно и всесторонне поддерживать множество стилей программирования, в том числе процедурное программирование, абстракцию данных, объектно-ориентированное программирование и обобщённое программирование.
· Дать программисту свободу выбора, даже если это даст ему возможность выбирать неправильно.
· Максимально сохранить совместимость с c, тем самым делая возможным лёгкий переход от программирования на c.
· Избежать разночтений между c и c++: любая конструкция, допустимая в обоих языках, должна в каждом из них обозначать одно и то же и приводить к одному и тому же поведению программы.
· Избегать особенностей, которые зависят от платформы или не являются универсальными.
· «не платить за то, что не используется» - никакое языковое средство не должно приводить к снижению производительности программ, не использующих его.
· Не требовать слишком усложнённой среды программирования.
Выбор именно c в качестве базы для создания нового языка программирования объясняется тем, что язык c:
. Является многоцелевым, лаконичным и относительно низкоуровневым языком;
2. Подходит для решения большинства системных задач;
. Исполняется везде и на всём;
. Стыкуется со средой программирования unix.
Несмотря на ряд известных недостатков языка c, страуструп пошёл на его использование в качестве основы, так как «в c есть свои проблемы, но их имел бы и разработанный с нуля язык, а проблемы c нам известны». Кроме того, это позволило быстро получить прототип компилятора (cfront), который лишь выполнял трансляцию добавленных синтаксических элементов в оригинальный язык c.
По мере разработки c++ в него были включены другие средства, которые перекрывали возможности конструкций c, в связи с чем неоднократно поднимался вопрос об отказе от совместимости языков путём удаления устаревших конструкций. Тем не менее, совместимость была сохранена из следующих соображений:
· Сохранение действующего кода, написанного изначально на c и прямо перенесённого в c++;
· Исключение необходимости переучивания программистов, ранее изучавших c (им требуется только изучить новые средства c++);
· Исключение путаницы между языками при их совместном использовании («если два языка используются совместно, их различия должны быть или минимальными, или настолько большими, чтобы языки было невозможно перепутать»).
К 1983 году в язык были добавлены новые возможности, такие как виртуальные функции, перегрузка функций и операторов, ссылки, константы, пользовательский контроль над управлением свободной памятью, улучшенная проверка типов и новый стиль комментариев (//). Получившийся язык уже перестал быть просто дополненной версией классического c и был переименован из c с классами в «c++». Его первый коммерческий выпуск состоялся в октябре 1985 года.
Имя языка, получившееся в итоге, происходит от оператора унарного постфиксного инкремента c ++ (увеличение значения переменной на единицу).
До начала официальной стандартизации язык
развивался в основном силами страуструпа в ответ на запросы программистского
сообщества. Функцию стандартных описаний языка выполняли написанные
страуструпом печатные работы по c++ (описание языка, справочное руководство и
так далее).
1.3 основы теории и синтаксиса языка
программирования с++
.3.1синтаксис языка с++
Под синтаксисом языка программирования понимают правила построения корректных конструкций данного языка. Синтаксис языка можно описать формально. Для этого удобно использовать расширенную форму бэкуса-наура (бнф), которая состоит из ряда следующих обозначений и правил:
· Символы в кавычках переносятся в конструкцию языка так, как они записаны. Кавычки при этом отбрасываются. Например, "while" означает, что в конструкции языка присутствует while;
· Имена, записанные слитно русскими и латинскими буквами, обозначают различные конструкции языка. Например, оператор_цикла;
· Квадратные скобки охватывают элементы языка, которые могут повторяться 0 или 1 раз. Например, "ab"["c"] означает, что в конструкции языка может присутствовать или ab или abc;
· Фигурные скобки охватывают элементы языка, которые могут повторяться 0 или много раз. Например, "ab" {"c"} означает, что в конструкции языка может присутствовать или ab, или abc, или abcc и т.д.;
· Символ | обозначает или, то есть используется для задания альтернативных значений, из списка элементов, разделенных знаком |. Например, "ab"|"c"|"ff" означает, что в конструкции языка может присутствовать или ab или c или ff;
· Круглые скобки используются для группировки. Например, "a"("b"|"c")"d" означает, что в конструкции языка может присутствовать или abd или acd;
· Многоточие используется для обозначения очевидных пропущенных значений в перечислении;
· Символ = обозначает - слово есть. Например, буква = "a"|"b"|"c".
1.3.2 правила записи программы на языке си++
Программа перед обработкой компьютером должна быть помещена в файл на диске. Обычно этот файл имеет расширение <.c>.
Рассмотрим типичную структуру файла с программой
на языке си и правила его оформления на следующем простом примере:
/* включить описания функций стандартного ввода-вывода */
#include <stdio.h>
/* включить описания математических функций */
#include <math.h>
/* другие включаемые файлы */
/* собственно текст программы */main( void )/* <-- заголовок главной функции */
{num; /* <-- описание типов данных */
/*исполняемые операторы -* */= 2.345; /*присвоим переменной num
Значение 2.345 */( " sin(%f) = %f\n", num, sin(num) );/*вывод на экран */
}
Любой файл начинается с директив #include, вставляющих в текст программы так называемые заголовочные файлы, которые содержат описания функций, используемых в этом файле. В нашем примере это описания стандартных функций ввода-вывода <stdio.h> и математических функций <math.h>.