Языки прграммирования
Отладка
Классификация ошибок в программе
Синтаксическая ошибка
Связана с нарушением синтаксических правил.
Ошибка времени выполнения (run-time error)
происходит при выполнении (синтаксически верной) программы, когда она производит какое-либо недопустимое действие (деление на ноль и др.).
Логическая ошибка
Ошибка при разработке и написании алгоритма. При этом программа не содержит ни синтаксических ошибок, ни ошибок времени выполнения, но делает не то, что хотел автор программы.
Отладка (Debugging) это процесс локализации и исправления ошибок, выявленных во время тестирования программы.
Разновидности отладки:
«Сухая» отладка – по листингу (тексту) программы, без использования компьютера, отладчика и др.
Использование отладчика (Debugger) – программы, позволяющей отслеживать процесс выполнения программы по ее исходному тексту и просматривать текущие значения переменных.
Основные функции отладчика
Трассировка – пошаговое выполнение программы. Шагу соответствует одна строка исходного текста (в которой может быть более одного оператора).
|
|
Режим "без трассы подпрограмм" – пошаговое выполнение программы, при котором вызов подпрограммы отрабатывается как один оператор.
Режим "трасса подпрограмм" – пошаговое выполнение программы, при котором трасса включает все операторы подпрограмм.
Точка останова (breakpoint) приостанавливает выполнение программы. Может быть установлена только на выполняемом операторе (не на комментарии и др.).
Возможен просмотр значений переменных при пошаговом выполнении программы.
Программы на традиционных языках программирования, таких как Си, Паскаль, Java и т.п. состоят их последовательности модификаций значений некоторого набора переменных, который называется состоянием. Если не рассматривать операции ввода-вывода, а также не учитывать того факта, что программа может работать непрерывно (т.е. без остановок, как в случае серверных программ), можно сделать следующую абстракцию. До начала выполнения программы состояние имеет некоторое начальное значение σ0, в котором представлены входные значения программы. После завершения программы состояние имеет новое значение σ', включающее в себя то, что можно рассматривать как «результат» работы программы. Во время исполнения каждая команда изменяет состояние; следовательно, состояние проходит через некоторую конечную последовательность значений:
Состояние модифицируется с помощью команд присваивания, записываемых в виде v = E или v:= E, где v - переменная, а Е - некоторое выражение. Эти команды следуют одна за другой; операторы, if и while, позволяют изменить порядок выполнения этих команд в зависимости от текущего значения состояния. Такой стиль программирования называют императивным или процедурным.
|
|
Функциональное программирование представляет парадигму, отличную от рассмотренной модели. Функциональная программа представляет собой некоторое выражение (в математическом смысле); выполнение программы означает вычисление значения этого выражения. Считая, что результат работы императивной программы полностью и однозначно определен ее входом, можно сказать, что финальное состояние (или любое промежуточное) представляет собой некоторую функцию (в математическом смысле) от начального состояния, т.е.. В функционально программировании используется именно такая точка зрения: программа представляет собой выражение, соответствующее функции f. Функциональные языки программирования поддерживают построение таких выражений.
При сравнении функционального и императивного подхода к программированию можно отметить следующие свойства функциональных программ:
• Функциональные программы не используют переменные в том смысле, в котором они используются в императивном программировании. В функциональных программах не используется оператор присваивания.
• Как следствие из предыдущего пункта, в функциональных программах нет циклов.
• Выполнение последовательности команд в функциональной программе бессмысленно, поскольку одна команда не может повлиять на выполнение следующей.
• Функции можно передавать в другие функции в качестве аргументов и возвращать в качестве результата, и проводить вычисления, результатом которых будет функция.
• Вместо циклов функциональные программы широко используют рекурсивные функции.
Многие характеристики императивных языков программирования являются результатом абстрагирования от машинных кодов к языкам ассемблера, а затем к языкам типа Фортран и т.д. Более привлекателен подход, при котором языки программирования появляются как абстрактные системы для записи алгоритмов, а затем происходит их перевод на императивный язык компьютера.
Функциональный подход имеет ряд преимуществ перед императивным. Функциональные программы более непосредственно соответствуют математическим объектам, и следовательно, позволяют проводить строгие рассуждения. Установить значение императивной программы, т.е. той функции, вычисление которой она реализует, в общем случае довольно трудно. Значение функциональной программы может быть выведено практически непосредственно.
Следует сделать замечание относительно употребления термина «функция» в императивных языках. В математическом смысле «функции» импераивного языка не являются функциями, поскольку:
• Их значение может зависеть не только от аргументов;
• Результатом их выполнения могут быть разнообразные побочные
эффекты (например, изменение значений глобальных переменных)
• Два вызова одной и той же функции с одними и теми же аргумен
тами могут привести к различным результатам.
Функции в функциональных программах являются функциями в математическом смысле. Из этого следует, что вычисление любого выражения не может иметь никаких побочных эффектов, и порядок вычисления его подвыражений не оказывает влияния на результат. Функциональные программы легко поддаются распараллеливанию, поскольку отдельные компоненты выражений могут вычисляться одновременно.