На этом шаге мы рассмотрим средства, используемые для выполнения этой операции.
Ещё одно полезное и важное для отладки понятие - трассировка стека (stack trace), или отчёт о состоянии программного стека на определённый момент выполнения программы. Большинство языков программирования обладает функционалом для отображения трассировки стека. Например, в языке Python трассировку стека можно выполнить с помощью модуля Traceback. Помимо этого, "трасса" стека печатается при выходе программы на ошибку времени выполнения.
Давайте заменим операцию сложения в строке 6 из примера 10.1 ошибочным вычитанием s = s - u[i]*v[i] (прочие функции тоже будут ошибочными, поскольку и они вызывают dot_product()). Тогда, например, вычисление евклидовой нормы (длины) отличного от нуля вектора привело бы к ошибке времени выполнения программы, поскольку она попыталась бы извлечь квадратный корень из отрицательного числа. При выполнении такого кода стандартный интерпретатор языка Python выдал бы такое сообщение:
Traceback (most recent call last): File "D:/PythonProjects/Recursion/pr160_1.py", line 22, in <module> print(cosine(a, b)) File "D:/PythonProjects/Recursion/pr160_1.py", line 16, in cosine return dot_product(u, v) / norm_Euclidean(u) / norm_Euclidean(v) File "D:/PythonProjects/Recursion/pr160_1.py", line 12, in norm_Euclidean return math.sqrt(dot_product(v, v)) ValueError: math domain error
Рис.1. Выдача сообщения об ошибке
Оно говорит о том, что пакет math столкнулся с ошибкой (времени выполнения) в строке 12 при выполнении метода norm_Euclidean(), который был вызван в строке 16 функцией cosine(). В сообщении также указывается строка 22, в которой вызывается метод cosine() (в некоторых языках программирования в программный стек помещается стековый кадр основной программы main). В заключение отметим, что структура сообщения точно соответствует состоянию программного стека на шаге 5 из рисунка 1, 159 шага.
На следующем шаге мы рассмотрим пространственную сложность вычислений.