Оценка потока выполнения для визуальных языков программирования - PullRequest
1 голос
/ 17 июля 2010

Я читаю о визуальных языках программирования в эти дни.Итак, я придумал две «парадигмы».В обоих случаях у вас есть одна начальная точка и несколько конечных точек.

Теперь вы можете начать с начальной точки или двигаться назад от конечных точек (порядок конечных точек известен).

Начиная с начальной точки, вы чувствуете себя странно, потому что в потоке данных могут возникать "расщепления".Скажем, если у меня есть целое число, и это целое число необходимо двум функциям одновременно.Плохой.Я не хочу вдаваться в параллельное кодирование.По крайней мере, пока.Или я должен?

Начиная с конечных точек чувствует себя намного лучше.Вы начинаете с первой конечной точки.Проверьте все, что нужно, и оцените это.Я считаю, что это ленивая оценка.Но проблема возникает, когда у вас есть несколько входов.Как вы решаете, в каком порядке оценивать входные данные?

Можете ли вы указать мне некоторые статьи / статьи / что-то в Интернете.Или, может, скажете мне несколько ключевых слов для поиска?

Ответы [ 2 ]

2 голосов
/ 17 июля 2010

Если я получу то, что вы имеете в виду, используя одно и то же целое число в двух функциях, это именно то: вы просто используете его дважды, не нужно вносить параллелизм. Если «реализация», которую вы думали об уничтоженных входных значениях, вы могли бывозьмите копию перед использованием.

int i = 2;
int j = fun1(i);
int k = fun2(i);
int res = fun3(j, k);

станет:

      i = 2[A]
        |
      Clone[B]
       / \
      /   \
     /     \
   i_1      i_2
    |        |
   fun1[C]  fun2[D]
    |        |
    j        k
     \      /
      \    /
       \  /
       fun3[E]
        |
       res

Но для оценки графа параллелизма не требуется.Вы можете просто оценить «параллельные» ветви слева направо (как обозначено маркировкой ABC -... - см. Также здесь ).

Сверху вниз (то есть от начала до конца), слева направо кажется более естественным, чем снизу вверх, при условии, что снизу вверх на самом деле имеет четко определенное значение.Что касается последнего пункта, при условии, что у вас есть результаты для программы, вы не всегда можете вычислить входные данные: подумайте о том, что происходит, когда funXXX не являются инъективными (например, fun1(x) = x*x) и, следовательно, необратимый.

Надеюсь, я не совсем неверно истолковал ваш ход мыслей.

1 голос
/ 07 августа 2010

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

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

Какой из двух подходов является наилучшим, зависит от того, что именно вы делаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...