Вычисление рабочего списка с анализом переменных в реальном времени

#compiler-construction #compiler-optimization

#компилятор-построение #компилятор-оптимизация

Вопрос:

Я борюсь с вычислением алгоритма рабочего списка, я не хочу реализовывать итеративный алгоритм, поскольку он требует так много избыточных шагов.

Алгоритм, которому я следую для вычисления рабочего списка для переменных в реальном времени, выглядит следующим образом введите описание изображения здесь

Может ли кто-нибудь объяснить мне для примера, приведенного ниже, каким будет начальный рабочий список и как к нему будет применен алгоритм worklist?

 x = 1   /*block 1*/
y = 23  /*block 2*/
x = 100 /*block 3*/
print x y /*block 4*/
  

Я вычислил эти многие уравнения только для блока In [n], кроме этого, я не понимаю, как создать рабочий список, какие узлы я должен вставить в него и когда я должен удалить определенные узлы из рабочего списка, чтобы сделать его пустым в конце.

 in[4] = use[4] U (out[4] - def[4])
   = {x, y} U { }
in[3] = use[3] U (out[3] - def[3])
   = { } U { y }
in[2] = use[2] U (out[2] - def[2])
   = { } U { y } - { y }
in[1] = use[1] U (out[1] - def[1])
   = { } U {  }
  

Я использую главу 6 алгоритмов Нильсона, чтобы понять эту концепцию. Здесь они дали объяснение для достижения определения (слайд 15), но меня интересует анализ переменных в реальном времени для рабочего списка.

Комментарии:

1. Один из лучших способов узнать, как работает алгоритм, — это реализовать его с помощью языка программирования, а затем предоставить ему хороший набор тестовых примеров. Кажется, вы проделали большую часть обучения кодированию алгоритма, проработав его с помощью ручки и бумаги. Если бы я делал это, я бы использовал Prolog.

2. Это может помочь. Визуализатор подключенных компонентов

3. @GuyCoder Спасибо за ваш вклад, я понял, как работает рабочий список для переменных в реальном времени. Здесь out[n] — это не что иное, как узлы-преемники, у которых на входе есть переменные в реальном времени. Если мы выяснили доступные текущие переменные в преемниках, то этот алгоритм работает. Я также скоро опубликую свой ответ с подробной оценкой.

Ответ №1:

Позвольте мне объяснить работу приведенного выше алгоритма на вашем примере.

 Work list is a queue. initial values of in,out of all blocks are {}
Initial work list has blocks {1,2,3,4}
Remove the first element from the work list and compute
 out[1] = U in[succ(1)]  = in[2] = {}
 in[1]  = use[1] U { out[1]-def[1]} = {} U{{}-{x}} = {} No change in in[1]
Work list has {2,3,4}
Remove the first element from the work list and compute
 out[2] = U in[succ(2)] = in[3] ={}
 in[2]  = use[2] U {out[2]-def[2]} = {} U {{}-{y}} = {} No change in in[2]
Work list has {3,4}
Remove the first element from the work list and compute
 out[3] = U in[succ(3)] = in[4] = {}
 in[3] = use[3] U {out[3]-def[3]} = {}U{{}-{x}} = {} No change in in[3]
Work list has {4},
Remove the first element from the work list and compute
 out[4] = U in[nosucc] = {}
 in[4] = use[4] U {out[4] - def[3]} = {x,y} U {{}-{}} = {x,y} 
change in in[4]( previous value is empty, it has to be propagated to its   
predecessors)  add its predecessor to work list.
Work list has {3},
remove the first element from the work list and compute
 out[3] = U in[succ(3)] = in[4] = {x,y}
 in[3] = use[3] U {out[3]-def[3]} = {}U{{x,y}-{x}} = {y}
change in in[3]( previous value is empty, it has to be propagated to its 
predecessors)  add its predecessor to work list.   
Work list has {2}, 
remove the first element from the work list and compute
 out[2] = U in[succ(2)] = in[3] ={y}
 in[2]  = use[2] U {out[2]-def[2]} = {} U {{y}-{y}} = {} No change in in[2]
Work list is empty, it stops
  

Конечные значения:

  out[4]={},  in[4]={x,y}
 out[3]={x,y}  in[3]={y}
 out[2]={y}     in[2]={}
 out[1]={}      in[1]={}
  

Значение ‘x’, вычисленное в блоке 1, не является текущим (не используется после, его можно удалить)

Комментарии:

1. Поскольку это анализ переменных в реальном времени, я думаю, мне нужно взять все узлы снизу вверх в рабочем списке. (4, 3, 2, 1). Чтобы не было необходимости в дополнительных итерациях, и рабочий список будет пустым только один раз

2. Ответ был дан на основе алгоритма, приведенного в вопросе, и приведенной ссылки. Фактически алгоритм может быть дополнительно улучшен a) начальный рабочий список W = { набор всех узлов} может быть заменен узлами с использованием [n] не пустым. Узлы, которые генерируют оперативную информацию.