Кафедры вс, к т. н. Поляков Артем Юрьевич Рассматриваемые вопросы Жизненный цикл программы и место отладки в нем




НазваниеКафедры вс, к т. н. Поляков Артем Юрьевич Рассматриваемые вопросы Жизненный цикл программы и место отладки в нем
Дата конвертации12.03.2013
Размер445 b.
ТипТехническое задание


ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ВЫСОКОГО УРОВНЯ Раздел 2. Отладка компьютерных программ

Старший преподаватель

Кафедры ВС, к.т.н.

Поляков Артем Юрьевич

Рассматриваемые вопросы

  • Жизненный цикл программы и место отладки в нем

    • Жизненный цикл программного обеспечения
    • Отладка программ
  • Инструменты отладки программ

    • утилиты сравнения исходного кода (diff) и системы управления версиями
    • сообщения компилятора
    • утилиты расширенной проверки синтаксиса и логики (lint)
    • программные отладчики
    • профилировщики


Жизненный цикл программного обеспечения

Стандарты жизненного цикла ПО:

ГОСТ 34.601-90, ISO/IEC 12207:1995
  • Формирование требований к АС

  • Разработка концепции АС

  • Техническое задание

  • Эскизный проект

  • Технический проект

  • Рабочая документация

  • Ввод в действие

  • Сопровождение АС.



Отладка программ

Макконнел, С. Совершенный код (Code complete)

«Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете»
  • "Отладка — это процесс определения и устранения причин ошибок. Этим она отличается от тестирования, направленного на их обнаружение..."

  • "В некоторых проектах отладка занимает до 50% общего времени разработки…"

  • "Большинство дефектов " – это "недосмотры и опечатки"

  • В каждой группе есть … программист, бесконечно сражающийся с демоническими компьютерами, таинственными дефектами компилятора, скрытыми дефектами языка…" и "…заколдованным текстовым редактором…"

  • "... Отладка включает в себя поиск дефекта и его исправление. Поиск и понимание дефекта обычно составляют 90% работы..."



Научный метод отладки

  • Сбор данных при помощи повторяющихся экспериментов.

  • Формулирование гипотезы, объясняющей релевантные данные.

  • Разработка эксперимента, призванного подтвердить или опровергнуть гипотезу.

  • Подтверждение или опровержение гипотезы.

  • Повторение процесса в случае надобности.



Метод поиска дефекта, основанный на научном методе

  • Стабилизация ошибки.

  • Определение источника ошибки.

    • Сбор данных, приводящих к дефекту.
    • Анализ собранных данных и формулирование гипотезы, объясняющей дефект.
    • Определение способа подтверждения или опровержения гипотезы, основанного или на тестировании программы или на изучении кода.
    • Подтверждение или опровержение гипотезы при помощи процедуры, определенной в п. 2 (с)
  • Исправление дефекта

  • Тестирование исправления

  • Поиск похожих ошибок



Инструменты отладки программ

    • утилиты сравнения исходного кода (diff)
    • системы управления версиями
    • сообщения компилятора
    • утилиты расширенной проверки синтаксиса и логики (lint)
    • программные отладчики
    • профилировщики


Утилиты сравнения исходного кода (diff)

    • В вычислительной технике diff — утилита сравнения файлов, выводящая разницу между двумя файлами.
    • Эта программа выводит построчно изменения, сделанные в файле (для текстовых файлов). Современные реализации поддерживают также двоичные файлы.
    • Вывод утилиты называется «diff», или, что более распространено, патч, так как он может быть применён с программой patch.
    • Вывод похожих утилит сравнения файлов также часто называется «diff».


Утилиты сравнения исходного кода (diff) (пример)



Утилиты сравнения исходного кода (diff) (пример)

    • $ diff –Naur bad.c good.c > good.patch


Системы управления версиями

    • Система управления версиями (от англ. Version Control System, VCS или Revision Control System) — программное обеспечение для облегчения работы с изменяющейся информацией.
    • Система управления версиями позволяет хранить несколько версий одного и того же документа, при необходимости, возвращаться к более ранним версиям, определять, кто и когда сделал то или иное изменение и многое другое.
    • Такие системы наиболее широко применяются при разработке программного обеспечения, для хранения исходных кодов разрабатываемой программы.


Типичный порядок работы с системой управления версиями

    • Начало работы с проектом: извлечение рабочей копии проекта или той его части, с которой предстоит работать.
    • Ежедневный цикл работы
      • Обновление рабочей копии: по мере внесения изменений в проект другими разработчиками рабочая копия на компьютере разработчика стареет, расхождение её с основной версией проекта увеличивается. Обновление позволяет синхронизировать рабочую копию и текущую версию проекта.
      • Модификация проекта: разработчик модифицирует проект, изменяя входящие в него файлы в рабочей копии в соответствии с проектным заданием. Эта работа производится локально и не требует обращений к серверу VCS.
      • Фиксация изменений: Завершив очередной этап работы над заданием, разработчик фиксирует (commit) свои изменения, передавая их на сервер. Фиксации присваивается номер, по которому внесенные изменения будут доступны в дальнейшем.


Существующие системы управлениями версиями

    • CVS (Concurrent Versions System, "Система Одновременных Версий") - одна из первых широко распространенных свободных централизованных систем управления версиями.
    • Subversion (также известная как "SVN") - свободная централизованная система управления версиями, официально выпущенная в 2004 году компанией CollabNet Inc. Subversion реализует все основные функции CVS и свободна от ряда недостатков последней. Используется многими сообществами разработчиков открытого программного обеспечения, в их числе: Apache, GCC, Python, Ruby, Mono, FreeBSD.
    • Git - свободная распределённая система управления версиями файлов. Проект был создан Линусом Торвальдсом для управления разработкой ядра Linux. Проекты, использующие Git: ядро и некот. дистрибутивы Linux, Drupal, GNU Core Utilities, Wine, Chromium, jQuery.


Хостинг систем управления версиями

    • SourceForge (Subversion, Git, Mercurial, Bazaar, CVS)
    • Google Code (Subversion, Git и Mercurial)
    • GitHub (Git)
    • Codebase
    • Tigris.org


Компилятор

    • Компилятор
      • Программа, переводящая текст программы на языке высокого уровня в эквивалентную программу на машинном языке.
    • Компиляция
      • трансляция программы на язык, близкий к машинному, и последующая её компоновка.
      • трансляция программы, составленной на исходном языке, в объектный модуль (осуществляется компилятором) и последующая её компоновка в готовый к использованию программный модуль.


Процесс преобразования исходных кодов в машинные кода из исходного



Советы по устранению синтаксических ошибок

Внимательно читайте сообщения, выводимые компилятором!



Советы по устранению синтаксических ошибок



Советы по устранению синтаксических ошибок

Не полагайтесь на номера строк в сообщениях компилятора.

компилятор Си является однопроходным. Он читает программу сверху вниз и никогда не возвращается назад. Поэтому иногда он обнаруживает ошибку в строке, располагающейся после той, что действительно содержит ошибку.
  • Если компилятор сообщил о загадочной синтаксической ошибке, изучите фрагменты, расположенные прямо перед ошибкой.

  • Обнаружив истинный дефект попробуйте определить почему компилятор указал не на ту команду. Понимание особенностей компилятора поможет находить дефекты в будущем.



Советы по устранению синтаксических ошибок

Не полагайтесь на номера строк в сообщениях компилятора.

Советы по устранению синтаксических ошибок

Не доверяйте второму сообщению об ошибке
  • Некоторые компиляторы обнаружив множественную ошибку выводят десятки бессмысленных сообщений о других ошибках



Советы по устранению синтаксических ошибок

Не доверяйте второму сообщению об ошибке

Советы по устранению синтаксических ошибок

Не доверяйте второму сообщению об ошибке

Советы по устранению синтаксических ошибок

  • Разделение программы на части особенно эффективно при поиске синтаксических ошибок.

  • Если вы столкнулись с неуловимой синтаксической ошибкой — закомментируйте часть кода и перекомпилируйте программу.

  • Если ошибка исчезнет — ее нужно искать в этой части кода



Отладка с помощью отладочных сообщений

  • Отладка программы требует полного понимания процессов, происходящих в процессе ее выполнения.

  • Одним из простейших в вместе с тем эффективных инструментов, которые позволяют отследить и лучше понять работу программы является журналирование программы.

  • Журналирование предполагает вывод на экран (или в файл) информации о событиях, возникающих в программе, и промежуточном состоянии программы, например: факт вызова функции и данные о ее аргументах, содержимое переменных и т.п.



Использование отладочных сообщений

  • Отладочные сообщения должны находиться в ключевых узлах программы и позволять отследить ход ее выполнения.

  • В случае поиска дефекта необходимо размещение дополнительных выводов, позволяющих детализировать информацию о потенциально дефектных фрагментах кода.

  • Необходимо соблюдать баланс между количеством выводимой информации и ее качеством, так как при визуальном осмотре важная информация может "утонуть" в потоке ненужных сообщений.



Технические аспекты, связанные с отладочными сообщениями

  • Отладочные сообщения могут сами по себе содержать ошибки.

  • Вывод на экран буферизируется построчно, т.е. сообщения лежат в буферах до тех пор, пока не обнаружен символ '\n' (Enter – перевод каретки).

  • В случае фатальной ошибки, приводящей к аварийному завершению программы (наиболее распространена ошибка сегментации (Segmentation Fault) отладочные сообщения, находящиеся в буферах, не будут выведены.

  • Часто бывает удобно иметь возможность оперативно отключать и включать отладочные выводы.



Эффективная реализация журналирования

#ifndef DEBUG_H

#define DEBUG_H

#include

#define PDEBUG(lev,fmt,args...)

#ifdef DEBUG

#undef PDEBUG

#define PDEBUG(lev,fmt,args...) \

if( lev<=DEBUG ) \

printf("%s: %d: " fmt " \n",__FUNCTION__,

__LINE__, ## args )

#endif

#endif



Применение журналирования

#include

#define DEBUG 100

#include "debug.h"

int main()

{

int i = 0;

while( i < 5 ){

PDEBUG(1, "i = %d", i);

i++;

}

}

Применение журналирования

#include

#define DEBUG 0

#include "debug.h"

int main()

{

int i = 0;

while( i < 5 ){

PDEBUG(1, "i = %d", i);

i++;

}

}

Пример отладки

#include

int main()

{

int i, x, sum;

scanf("%d",&x);

while( i

{

sum += i;

}

printf("sum=%d\n",sum);

}

Журналирование. Шаг №1.

#include

#define DEBUG 100

#include "debug.h"

int main()

{

int i, x, sum;

printf("Enter x: "); scanf("%d",&x);

PDEBUG(1,"sum = %d\n",sum);

while( i

PDEBUG(1,"sum = %d\n",sum);

sum += i;

}

printf("sum=%d\n",sum);

}

Журналирование. Шаг №1. (результаты)

Enter x: 10

main: 9: sum = -1216570528

main: 11: sum = -1216570528

main: 11: sum = 1861651284

main: 11: sum = 644905800

main: 11: sum = -571839684

main: 11: sum = -1788585168

main: 11: sum = 1289636644

main: 11: sum = 72891160

main: 11: sum = -1143854324

. . . <бесконечно>

Ctrl + C – принудительное завершение программы

Вывод: необходима инициализация sum

Журналирование. Шаг №2.

#include

#define DEBUG 100

#include "debug.h"

int main()

{

int i, x, sum = 0;

printf("Enter x: "); scanf("%d",&x);

PDEBUG(1,"sum = %d\n",sum);

while( i

PDEBUG(1,"sum = %d\n",sum);

sum += i;

}

printf("sum=%d\n",sum);

}

Журналирование. Шаг №2. (результаты)

$ ./sum_ex_dbg_1

Enter x: 10

main: 9: sum = 0

main: 11: sum = 0

main: 11: sum = -1216471052

main: 11: sum = 1862025192

main: 11: sum = 645554140

main: 11: sum = -570916912

. . . <бесконечно>

Ctrl + C – принудительное завершение программы

Вывод: необходимо добавить проверку счетчика i

Журналирование. Шаг №3.

#include

#define DEBUG 100

#include "debug.h"

int main()

{

int i, x, sum = 0;

printf("Enter x: "); scanf("%d",&x);

PDEBUG(1,"sum = %d, i=%d\n",sum,i);

while( i

PDEBUG(1,"sum = %d, i=%d\n",sum,i);

sum += i;

}

printf("sum=%d\n",sum);

}

Журналирование. Шаг №3. (результаты)

$ ./sum_ex_dbg_2

Enter x: 10

main: 9: sum = 0

main: 11: sum = 0, i = -1217404940

main: 11: sum = -1217404940, i = -1217404940

main: 11: sum = 1860157416, i = -1217404940

main: 11: sum = 642752476, i = -1217404940

main: 11: sum = -574652464, i = -1217404940

main: 11: sum = -1792057404, i = -1217404940

. . . <бесконечно>

Ctrl + C – принудительное завершение программы

Вывод: необходима инициализация счетчика i

Журналирование. Шаг №4.

#include

#define DEBUG 100

#include "debug.h"

int main()

{

int i = 0, x, sum = 0;

printf("Enter x: "); scanf("%d",&x);

PDEBUG(1,"sum = %d, i=%d\n",sum,i);

while( i

PDEBUG(1,"sum = %d, i=%d\n",sum,i);

sum += i;

}

printf("sum=%d\n",sum);

}

Журналирование. Шаг №4. (результаты)

$ ./sum_ex_dbg_3

Enter x: 10

sum = 0

sum = 0, i = 0

sum = 0, i = 0

sum = 0, i = 0

sum = 0, i = 0

sum = 0, i = 0

sum = 0, i = 0

sum = 0, i = 0

. . . <бесконечно>

Ctrl + C – принудительное завершение программы

Вывод: счетчик не изменяется. Добавить инкремент.

Журналирование. Шаг №5.

#include

#define DEBUG 100

#include "debug.h"

int main()

{

int i = 0, x, sum = 0;

printf("Enter x: "); scanf("%d",&x);

PDEBUG(1,"sum = %d, i=%d\n",sum,i);

while( i

PDEBUG(1,"sum = %d, i=%d\n",sum,i);

sum += i;

i++;

}

printf("sum=%d\n",sum);

}

Журналирование. Шаг №5. (результаты)

$ ./sum_ex_dbg_4

Enter x: 10

sum = 0

sum = 0, i = 0

sum = 0, i = 1

sum = 1, i = 2

sum = 3, i = 3

sum = 6, i = 4

sum = 10, i = 5

sum = 15, i = 6

sum = 21, i = 7

sum = 28, i = 8

sum = 36, i = 9

sum=45

Журналирование. Шаг №6. (отключение отладки)

#include

#define DEBUG 0

#include "debug.h"

int main()

{

int i = 0, x, sum = 0;

printf("Enter x: "); scanf("%d",&x);

PDEBUG(1,"sum = %d, i=%d\n",sum,i);

while( i

PDEBUG(1,"sum = %d, i=%d\n",sum,i);

sum += i;

i++;

}

printf("sum=%d\n",sum);

}

Журналирование. Шаг №6. (результаты)

$ ./sum_ex_fix1

Enter x: 10

sum=45

Программные отладчики

Современные отладчики непрерывно совершенствуются. Они позволяют:
  • прерывать выполнение программы на некоторой строке или при достижении конкретной строки n раз, а также при изменении некоторой переменной или присвоении ей конкретного значения;

  • возобновлять выполнение программы;

  • производить трассировку программы, т.е. выполнять ее пошагово;



Программные отладчики (2)

  • выполнять исследование данных, в частности анализировать значения переменных в любой момент выполнения программы;

  • изменять данные, в частности значения переменных;

  • отображать ход выполнения программы с привязкой к исходным кодам;

  • просматривать цепочку вызовов функций, т.е. содержимое стека вызовов;

  • подключаться к выполняющейся программе;



Пример отладки

#include

int main()

{

int i, x, sum;

scanf("%d",&x);

while( i

{

sum += i;

}

printf("sum=%d\n",sum);

}

Применение отладчика. Шаг №1.

Компиляция с флагом "-g"

$ gcc -o sum_ex sum_ex.c –g

Запуск отладчика

$ gdb sum_ex

GNU gdb (GDB) 7.2-ubuntu

Copyright (C) 2010 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law. Type "show copying"

and "show warranty" for details.

This GDB was configured as "i686-linux-gnu".

For bug reporting instructions, please see:

...

Reading symbols from sum_ex...done.

(gdb)



Применение отладчика. Шаг №2.

Пробный запуск программы (команда "r"):

(gdb) r

Starting program: sum_ex

Enter x: 10

. . . <бесконечно>

Ctrl + C – принудительное завершение программы

Program received signal SIGINT, Interrupt.

main () at sum_ex.c:10

10 while( i

(gdb)



Применение отладчика. Шаг №3.

Проверка значений x и i

. . .

10 while( i

(gdb) inspect i

$1 = -1208197132

(gdb) inspect x

$2 = 10

. . .

ВЫВОД: переменная i не инициализирована!



Применение отладчика. Шаг №4.

Просмотр исходного кода программы в отладчике

. . .

(gdb) l main

1 #include

2

3 int main()

4 {

5 int i, x, sum;

6

7 printf("Enter x: ");

8 scanf("%d",&x);

9

10 while( i

. . .



Применение отладчика. Шаг №5.

Установка точки останова на функции main

для пошаговой отладки

(gdb) b main

Breakpoint 1 at 0x804841d: file sum_ex.c, line 7.

Перезапуск программы заново

(gdb) r

The program being debugged has been started already.

Start it from the beginning? (y or n) y

Starting program: sum_ex

Breakpoint 1, main () at sum_ex.c:7

7 printf("Enter x: ");



Применение отладчика. Шаг №6.

Инициализация переменной i

(gdb) inspect i

$3 = -1208197132

(gdb) set var i = 0

(gdb) inspect i

$4 = 0

Продолжение работы программы:

(gdb) c

Continuing.

Enter x: 10

< программа зависла >



Применение отладчика. Шаг №7.

Ctrl + C – принудительное завершение программы

Program received signal SIGINT, Interrupt.

main () at sum_ex.c:10

10 while( i

(gdb) inspect i

$5 = 0

ВЫВОД: переменная i не изменила своего значения!



Применение отладчика. Шаг №8.

Проверка есть ли инкремент i в цикле

(gdb) l main

1 #include

2

3 int main()

. . .

9

10 while( i

(gdb) l

11 {

12 sum += i;

13 }

14 printf("sum=%d\n",sum);

15

16 }

(gdb)

Применение отладчика. Шаг №9.

Инкремент отсутствует. Требуется модифицировать программу, добавив в нее инициализацию i и ее инкремент в теле цикла. Для этого необходимо завершить

отладочную сессию

(gdb) q

A debugging session is active.

Inferior 1 [process 15015] will be killed.

Quit anyway? (y or n) y



Применение отладчика. Шаг №10.

Измененная программа

#include

int main()

{

int i = 0, x, sum;

printf("Enter x: "); scanf("%d",&x);

while( i

sum += i;

i++;

}

printf("sum=%d\n",sum);

}

Применение отладчика. Шаг №11.

Компиляция программы и ее запуск

gcc -o sum_ex_gdb1 sum_ex_gdb1.c -g

$ ./sum_ex_gdb1

Enter x: 10

sum=-1216803955

ВЫВОД: Программа больше не зацикливается, однако результат очевидно неправильный.

Требуется продолжить отладку.



Применение отладчика. Шаг №12.

Запуск отладчика

$ gdb sum_ex_gdb1

. . .

(gdb) b main

Breakpoint 1 at 0x804841d: file sum_ex_gdb1.c, line 5.

(gdb) r

Starting program:

sum_ex_gdb1

Breakpoint 1, main () at sum_ex_gdb1.c:5

5 int i = 0, x, sum;

(gdb) n

7 printf("Enter x: ");

(gdb) n
  • scanf("%d",&x);



Применение отладчика. Шаг №12. (продолжение)

. . .

7 printf("Enter x: ");

(gdb) n

8 scanf("%d",&x);

(gdb) n

Enter x: 5

10 while( i

(gdb) n

12 sum += i;

(gdb) inspect sum

$1 = -1208022176

ВЫВОД: Переменная sum не инициализирована



Критика программных отладчиков

"Интерактивный отладчик — великолепный пример инструмента, который не нужен: он поощряет хакерство методом проб и ошибок, а не систематичное проектирование и позволяет непрофессионалам скрыть свою некомпетентность."

Харлан Миллз, IBM research fellow and chief programmer

«... I don't like debuggers. Never have, probably never will. I use gdb all the time, but I tend to use it not as a debugger, but as a disassembler on steroids that you can program...

I happen to believe that not having a kernel debugger forces people to think about their problem on a different level than with a debugger... Without a debugger, you tend to think about problems another way...»

Линус Торвальдс, создатель ядра Linux

Критика программных отладчиков (2)

" … Наш личный выбор — стараться не использовать отладчики, кроме как для просмотра стека вызовов или же значений пары переменных …. очень легко потеряться в деталях сложных структур данных и путей исполнения программы; мы считаем пошаговый проход по программе менее продуктивным, чем усиленные размышления и код, проверяющий сам себя в критических точках…

Слепое блуждание в отладчике, скорее всего, непродуктивно. Полезнее использовать отладчик, чтобы выяснить состояние программы, в котором она совершает ошибку, а затем подумать о том, как такая ошибка могла возникнуть. ..."

Керниган, Б., Пайк Р. Практика программирования

В защиту программных отладчиков

"… Любой эффективный инструмент можно использовать правильно и неправильно. Отладчик — не исключение... Отладчик не заменит грамотного рассуждения. Но иногда никакие мысли не заменят хороший отладчик. Наиболее эффективная комбинация — ясный ум и хороший отладчик ..."

Макконнел, С. Совершенный код.

Стандарт оформления кода (Code convention)

Стандарт оформления кода (стандарт кодирования, стиль программирования) (англ. coding standards, coding convention или programming style) – набор правил и соглашений, используемых при написании исходного кода на некотором языке программирования.

Наличие общего стиля программирования:
  • позволяет избежать синтаксических и смысловых ошибок;

  • упрощает поиск синтаксических ошибок;

  • облегчает понимание и поддержание исходного кода, написанного больше чем одним программистом.



Существующие стандарты оформления кода на языке Си

  • C Programming language (K&R) [5]

  • Linux Kernel Coding Style [6]

  • GNU Coding Standards [7]

  • Ganssle Group's Firmware Development Standard

  • Netrino Embedded C Coding Standard

  • Micrium C Coding Standard



Соглашение об оформлении кода на языке Си, разрабатываемого в рамках курсов "Программирование" и "Языки программирования"

  • Отступы

  • Расположение фигурных скобок

  • Имена переменных

  • Комментарии



Отступы (http://en.wikipedia.org/wiki/Indent_style)

  • используются для форматирования исходного кода программы

  • применяются для улучшения читабельности.

  • предназначены только для программистов

  • компилятор языка Си игнорирует такие разделители, как пробел (Space), табуляция (Tab) и перевод на новую строку (Enter).



Отступы (правила использования)

  • Для формирования отступов используется табуляция (клавиша Tab)

  • Каждый новый блок операторов {…} увеличивает количество отступов на один:

for ( i=0 ; i < 10; i++ ){

 x = i*i;

 if( x > 10 ){

  z = z + 1;

  ...

 }

 y = x – 1;

}

}

Отступы (пример)

int main()

{

...

 while (x < y) {

  x *= 2;

  f = func(x);

  if (f > 0){

   count++;

   printf("f(%d) = %f\n", x, f);

  } else

   count--;

 }

 printf("count=%d\n", count);

...

}

Расположение фигурных скобок (http://en.wikipedia.org/wiki/Indent_style)

  • Открывающаяся фигурная скобка располагается на одной строке с циклическим оператором или оператором ветвления. Закрывающаяся – на новой строке:

for ( i=0 ; i < 10; i++ ){

 ...

}

Расположение фигурных скобок (Исключение 1)

  • Для функций открывающаяся фигурная скобка располагается на новой строке:

int main()

{

 ...

}

Расположение фигурных скобок (Исключение 2)

  • Для циклов с постусловием и для конструкции ветвления с оператором else закрывающаяся фигурная скобка располагается не в новой строке:

if( условие ){

 ...

} else

do {

 ...

} while( условие );

Имена переменных

  • Имена переменных должны отражать их предназначение

  • Длина имени переменной должна быть не более 15-20 символов для сохранения читабельности кода.

  • Для переменных со сложным именем предпочтительным является вариант first_left_counter, а не FirstLeftCounter.

  • Для счетчиков в циклах допускается применять простые имена, например i, j.



Комментарии

  • Комментарии являются признаком хорошего тона при написании программ. Однако существует опасность создания слишком подробных комментариев. Поэтому желательно придерживаться следующих правил:

    • не следует объяснять КАК работает код, необходимо пояснить ЧТО (какую функцию) он должен делать;
    • аккуратно написанный код говорит сам за себя, с другой стороны не стоит тратить время на то чтобы объяснить плохо написанный код;


ИТОГ

  • Описан жизненный цикл программы и место отладки в нем.

  • Рассмотрено применение существующих инструментов отладки программ, в частности:

    • утилиты сравнения исходного кода diff;
    • систем управления версиями;
    • сообщений компилятора GCC;
    • программного отладчика GDB.
  • Представлено соглашение об оформлении кода на языке Си, разрабатываемого в рамках курсов "Программирование" и "Языки программирования".



Литература

  • Керниган, Б., Пайк Р. Практика программирования, Вильямс, 2004, 288 с.

  • Макконнел, С. Совершенный код. Мастер класс / Пер. с англ. – М.:Издательско-торговый дом "Русская редакция"; СПб.:Питер, 2005. – 896 с.: ил. ISBN 5-7502-0064-7, 5-469-00822-3.

  • http://ru.wikipedia.org/wiki/GNU_Debugger

  • http://www.gnu.org/software/gdb/

  • Kernigan, B.W., Ritchie D.M. The C programming Language // Prentice-Hall, 1988. – ISBN 0-13-110362-8

  • Torvalds L. Linux Kernel Coding Style // https://computing.llnl.gov/linux/slurm/coding_style.pdf

  • GNU Coding Standards // http://www.gnu.org/prep/ /standards/standards.html#Syntactic-Conventions



Похожие:

Кафедры вс, к т. н. Поляков Артем Юрьевич Рассматриваемые вопросы Жизненный цикл программы и место отладки в нем iconКафедры вс, к т. н. Поляков Артем Юрьевич Рассматриваемые вопросы Алгоритмы поиска значения в последовательности

Кафедры вс, к т. н. Поляков Артем Юрьевич Рассматриваемые вопросы Жизненный цикл программы и место отладки в нем iconКафедры вс, к т. н. Поляков Артем Юрьевич Рассматриваемые вопросы Представление целых чисел
Далее будут рассмотрены каждый из способов для десятичной и двоичной систем счисления (СС)
Кафедры вс, к т. н. Поляков Артем Юрьевич Рассматриваемые вопросы Жизненный цикл программы и место отладки в нем iconКафедры вс, к т. н. Поляков Артем Юрьевич Рассматриваемые вопросы Синтаксис языка и способы его описания
Программирование на языке высокого уровня раздел Базовые конструкции и типы данных языка Си
Кафедры вс, к т. н. Поляков Артем Юрьевич Рассматриваемые вопросы Жизненный цикл программы и место отладки в нем iconКафедры вс, к т. н. Поляков Артем Юрьевич Рассматриваемые вопросы Понятие алгоритм
Завершаемость (конечность) — при корректно заданных исходных данных алгоритм должен завершать работу и выдавать результат за конечное...
Кафедры вс, к т. н. Поляков Артем Юрьевич Рассматриваемые вопросы Жизненный цикл программы и место отладки в нем iconКафедры вс, к т. н. Поляков Артем Юрьевич Рассматриваемые вопросы Примеры численных алгоритмов
Примеры численных алгоритмов: вычисление определенного интеграла функции одной переменной
Кафедры вс, к т. н. Поляков Артем Юрьевич Рассматриваемые вопросы Жизненный цикл программы и место отладки в нем iconКафедры вс, к т. н. Поляков Артем Юрьевич Структура курса Виды занятий

Кафедры вс, к т. н. Поляков Артем Юрьевич Рассматриваемые вопросы Жизненный цикл программы и место отладки в нем iconЖизненный цикл клетки Жизненный цикл клетки
Формы размножения организмов. Бесполое размножение Формы размножения организмов. Половое размножение
Кафедры вс, к т. н. Поляков Артем Юрьевич Рассматриваемые вопросы Жизненный цикл программы и место отладки в нем iconЖизненный цикл проекта в Silverlight 2

Кафедры вс, к т. н. Поляков Артем Юрьевич Рассматриваемые вопросы Жизненный цикл программы и место отладки в нем iconАрхитектура «D7»: модули, классы, жизненный цикл

Кафедры вс, к т. н. Поляков Артем Юрьевич Рассматриваемые вопросы Жизненный цикл программы и место отладки в нем iconРассматриваемые вопросы цикл солнечной активности в потоках солнечного ветра
Ран, фиан, г. Пущино; напряженность и конфигурация магнитного поля в солнечной короне, вычисленные по зеемановским наблюдениям на...
Разместите кнопку на своём сайте:
dok.opredelim.com


База данных защищена авторским правом ©dok.opredelim.com 2015
обратиться к администрации
dok.opredelim.com
Главная страница