Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Руководство программиста_администратора.docx
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
552 Кб
Скачать
☆

2.3.3. Рекурсивный обход дерева

Рассмотрим программу рекурсивного обхода дерева (рис. 2), написанную на языке Т++. На этом примере мы продемонстрируем работу с удаленными (tptr) указателями.

#include <stdio.h>

#include <stdlib.h>

typedef struct tree {

tree tptr left;

tree tptr right;

int value;

} tree;

tfun ts::TPtr<tree> create_tree(int depth) {

tree tptr res = new tval tree;

res->value = 1;

if (depth <= 1) {

res->left = NULL;

res->right = NULL;

} else {

res->left = create_tree(depth-1);

res->right = create_tree(depth-1);

}

return res;

}

tfun int tsum(tree tptr _tree) {

tval int leftSum, rightSum;

if (_tree->left) {

leftSum = tsum(_tree->left);

} else {

leftSum = _tree->value;

}

if (_tree->right) {

rightSum = tsum(_tree->right);

} else {

rightSum = _tree->value;

}

return (int)leftSum + (int)rightSum;

}

tfun int main (int argc, char* argv[]) {

tree tptr _tree = create_tree(12);

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

return 0;

}

Рис. 2. Программа рекурсивного обхода дерева. Основной код.

В этой программе дерево структур с типом tree сначала порождается функцией create_tree, а затем обходится в рекурсивной функции tsum. Точно так же, как и в предыдущей программе, происходит распараллеливание на каждой развилке дерева, поскольку сначала порождаются вызовы для левой и правой ветви, и лишь затем происходит обращение к результатам обхода. Ключевое слово tptr служит для описания глобальных ссылок на неготовые переменные. При операции чтения данных по Т-указателю может происходить ожидание готовности результата и (если нужно) его подгрузка из других узлов кластера, в то время как при операции записи записываемое значение (если нужно) передается по сети в нужный узел кластера, там значение записывается в переменную и, тем самым, соответствующую Т-переменную делает готовой.

2.4. Разработка программ на языке T++

Имеющаяся практика реализации программ для Т-системы позволяет рекомендовать организацию разработки программ на языке T++ из следующих этапов:

  1. Разработка алгоритма. Верхний уровень алгоритма разрабатывается на базе парадигмы функционального программирования.

  2. Разработка кода. При этом решается вопрос о том, какие фрагменты алгоритма, какая часть кода будет реализована на языке T++ в виде Т-функций, а какая часть—реализована в виде привычного последовательно исполняемого кода на стандартных языках последовательного программирования: С, С++, Фортран.

  3. Реализация и первичная отладка на однопроцессорном компьютере. Реализуется и отлаживается вся программа на обычном однопроцессорном компьютере. Во время первичной отладки программа выполняются без Т-системы, последовательно (ключевые слова расширений реализуются в «последовательном режиме»), как это обсуждено выше. Широко используются стандартные монопроцессорные средства отладки.

  4. Отладка на многопроцессорных установках. После отладки Т++-программы на однопроцессорном компьютере (в последовательном режиме), ее рекомендуется затем отладить на одиночном SMP- компьютере, а затем — на кластере.

  5. Тьюнинг. После отладки, при помощи трассировок и профилировок производится различного рода оптимизация кода.