Re[6]: Простые, но эффективные реализации компиляторов
От: cppguard  
Дата: 24.07.24 00:55
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Непонятно. Что значит "разные блоки"?


Блок с выражениями типа "a = b" испольняется один раз, блок с выражениями типа "a : a + b" исполняется столько раз, сколько есть итераций. Каждый из них не зависит от другого, поэтому оба можно генерировать независимо.

S>Выглядит как-то сложно. Блоки нужно генерировать тогда, когда уже есть все нужные данные.

S>1. Построили полный список ячеек.
S>2. Построили граф зависимостей.
S>3. Отсортировали ячейки в соответствии с топологией зависимостей (тут я немного плаваю, но, судя по всему, вы уже решили эту задачу)
S>4. Породили адреса для каждой ячейки
S>5. Сгенерировали код.

Вот контрпример:
b = 1
a = b
b : a + b


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

S>Опять же, не очень понятно, как должна работать формула вида a = a + b. Берётся значение a с предыдущей итерации, и прибавляется значение b с текущей итерации?

Да, в этом и основная суть DSL. Только с "=" такое не прокатит, потому что это выражение для инициализации. А итеративное вычисление задаётся в виде "a : a + b".
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.