Блог типа

Работа Кипит

При работе над компилятором LOMO проявляются тонкие моменты, которые не были очевидны на бумаге.

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

UNIT Top
	REG x INTEGER
	VAR z INTEGER
PROCESS
	x := x = 0 ? 1 :: x = 1 ? 2 :: 0
	z := x
END Top

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

Такие вот тонкие моменты.