Без заголовка
Я понял - как раз потому и решил обратить внимание на другой подход к вопросу, тем более, что сейчас ФП довольно быстро превращается в мэйнстрим.
Там идея такая - переменных и изменямых состояний вообще нет. Программа - по сути одна большая формула, а выполнение состоит в вычислении ее значения.
Понятно, что на самом деле время там присутствует - но как зависимость значения функции от ее аргументов. Скажем в Clean чисто императивная часть (работа с файлами etc) делается так: есть тип World - "состояние мира", функции, которые его модифицируют получают его параметром и выдают в качестве результата (система типов гарантирует невозможность "копирования" World и ему подобных) - функция открытия файла "вытаскивает" из World значение типа File, возвращая пару (File, World), а функция close наоборот "вливает" значение типа File в World.
Выполнение состоит в вычислении значения функции с именем start, которой передается "начальный" World. Что тут действительно нетривиально - это не фикция - вычисления инициируются действительно "от хвоста" - скажем если не написать close, то файл вообще не будет создан - потому что состояние World от него не зависит.
В Haskell подход несколько другой, но суть таже самая. Сделано это от того, что в денвых языках реальный порядок вычислений оказывается довольно противоестественным и труднопредсказуемым - поэтому сделать все зависимости явными - практически единственный возможный выход, но заодно достигается много других интересных вещей - во-первых - резко сокращается количество зависимостей. во-вторых - в отсуствие неявных зависимостей вопрос с распараллеливанием уходит на уровень не меняющей семантику оптимизации - хотя активно, кажется, никто этим не занимался.