Трассировка программных модулей
В практике подготовки и отладки программ важное значение имеет наличие специальных средств отладки программ по шагам – средств трассировки. 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.
- Создавать простейшие средства визуального программирования.
- Использовать средства отладки и трассировки программ.