меняться не может.
Возьмём Haskell.
В нечистом языке, мы можем просто изменить значение переменной, если мы поработали над текущим её значением, а теперь хотим поработать с другим значением такой переменной.
В том же Хаскеле, для этого нужно создавать новую "переменную", то есть выделять память где бы то ни было. И таких выделений памяти может быть много - соответственно затраты памяти растут.
Как такое оптимизируется?
Purely Functional Data Structures Chris Okasaki
Использованием STRef, анбоксингом, оптимизациями
Кучей способов на разные случаи: tail call optimization, liveness analysis, "immutable-but-inplace" (Perceus), и прочее.
хвостовые вызовы
Если рассматривать переменные atomic типов, то проблема решается сама собой. Ведь когда вы проводите кодогенерацию и распределение регистров, то у вас само понятие "переменной" уходит. То есть, вам всё равно, сколько у вас там переменных сделано, вы на стадии liveness analysis определяете минимальное время жизни переменных и выбрасываете их когда они не нужны. То есть, если мы возьмём императивный чистый язык, где написано def f(): x = 8; // это переменная x1 y = 2*x; // после этой команды про x1 забыли, она как будто выброшена из кода x = 5; // это x2 z = x + y; return z; Соответственно, компилятор знает, что место x1 свободно, и туда можно класть x2. Проблемы возникают когда переменные - это большие структуры.
Обсуждают сегодня