Иллюстрированный самоучитель по Mathematica 3/4

Трассировка программных модулей

В практике подготовки и отладки программ важное значение имеет наличие специальных средств отладки программ по шагам – средств трассировки. Mathematica имеет ряд функций для осуществления трассировки своих программных конструкций.

Функция Trace [ехрг] позволяет выполнить трассировку выражения ехрг. Возьмем простой пример – вычисление выражения 2 (3 + 4)2 /5:

Trace[2 (3 + 4)^2 / 5]
  
{{{{3+4, 7 },7^2.49}, {1/5.1/5}, 49/5, 49/5}, 249/5, 98/5}

Результат трассировки представлен вложенными списками, имеющими два элемента – вычисляемое выражение и результат вычислений. В частности, для приведенного примера отчетливо видно, что вначале вычисляется выражение в круглых скобках (3 + 4) и получается результат 7, который затем возводится в квадрат – получается число 49. Затем вызывается явно не записанная единица для деления на 5, потом 49 умножается на 1/5 и, наконец, 49/5 умножается на 2 и получается конечный результат. Отсюда ясно, что даже равноценные операции умножения и деления Mathematica разделяет по приоритету – деление выполняется перед умножением! Символьные операции также могут трассироваться:

Trace[a*a/(b*b)]
  
{{ {{bb,b^2}, 1/b^2, 1/b^2}, aa/b^2, a^2/b^2}

Можно выполнить и трассировку рекуррентных вычислений. Ниже представлен пример трассировки вычисления чисел Фибоначчи:

fib[n_]: = fib[n -1] + fib[n -2]
fib[0] = fib[l] = 1
1
Trace[fib[5], fib[n_] > n]
{5, {4, {3, {2, {!}, {0}}, {!}}, {2, {1}, {0}}},
{3, {2, {!}, {0}}, {!}}}
Trace[fib[3]]
{fib[3], fib[3-1] + fib[3-2],
{{3-1, 2}, fib[2], fib[2-1] + fib[2-2], {{2-1, 1}, fibtl], 11, {{2-2, 0}, fib[0], 1}, 1+1, 2},
{{3-2, 1}, fib[l], 1}, 2+1, 3}

Функция TracePrint [expr] дает распечатку последовательности действий при вычислении выражения ехрг:

TracePrint[a*b/c]
ab/c
Times a b _1 c
Power
1/c
ab/c

Примечание:
Помимо указанных примеров выполнения трассировки и отладки возможны и иные их варианты, осуществляемые с помощью ряда функций. Эти функции представлены в приложении. Надо, однако, отметить, что применение этих функций на современном уровне программирования ограничено – в подобной трассировке особой необходимости нет, поскольку система выдачи диагностических сообщений позволяет выполнять отладку более удобными средствами
.

Что нового мы узнали?

В этом уроке мы научились:

  • Работать с образцами.
  • Создавать функции.
  • Использовать функции FixedPoint и Catch.
  • Реализовывать рекурсивные и рекуррентные алгоритмы.
  • Использовать процедуры.
  • Создавать циклы различного типа.
  • Использовать условные выражения и безусловные переходы.
  • Работать с контекстами.
  • Готовить пакеты расширений системы Mathematica.
  • Создавать простейшие средства визуального программирования.
  • Использовать средства отладки и трассировки программ.
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.