212
Глава 3. Модульность, объекты и состояние
нам приходится думать о том, как вычислительный объект может изменяться и при
этом сохран я ть свою индивидуальность. Из-за этого нам придется отказаться от под-
становочной модели вычислений (раздел 1.1.5) в пользу более механистичной и в то же
время менее привлекательной теоретически модели с окружениями (environment model).
Сложности, связанн ые с объектами, их изменением и индивидуальностью являются фун-
даментальным следствием из потребности ввести понятие времени в вычислительные
модели. Эти сложности только уве личиваются, когда мы добавляем возможность парал-
лельного выполнения программ. Получить наибольшую отдачу от потокового подхода
удается тогда, когда моделируемое время отделяется от порядка событий, происходя-
щих в компьютере в процессе вычисления. Мы достигнем этого при помощи метода,
называемого задержанными вычислениями (delayed evaluation).
3.1. Присваивание и внутреннее состояние объектов
Обычно мы считаем, что мир состоит из отдельных объектов, и у каждого из них есть
состоя ние, которое изменяется со временем. Мы говорим, что объект «обладает состоя-
нием», если на поведение объекта влияет его история. Например, банковский счет обла-
дает состоянием потому, что ответ на вопрос «Могу ли я снять 100 долларов?» зависит
от истории занесения и снятия с него денег. Состояние объекта можно описать набором
из одной или боле е переменных состояния (state variables), которые вместе содержат
достаточно информации, чтобы определить текущее поведение объекта. В простой бан-
ковской системе состояние счета можно охарактеризовать его текущим балансом, вместо
того, что бы запом инать всю историю транзакций с этим счетом.
Если система состоит из многих объектов, они редко совершенно не зависимы друг
от друга. Каждый из них может влиять на состояние других при помощи актов взаи-
модействи я, связывающих переменные состояния одного объекта с переменными других
объектов. На самом деле, взгляд, согласно которому система состоит из отдельных объ-
ектов, поле знее всего в том случае, когда ее можно разделить на несколько подсистем,
в каждой из которых внутренние связи сильнее, чем связи с другими подсистемами.
Так ая точка зрения на систему может служить мощной парадигмой для организации
вычислительных моделей системы. Чтобы такая модель была модульной, ее требуется
разделить на вычислительные объекты, моделирующие реальные объекты систем ы. Каж-
дый вычислительный объект должен содержать собственные внутренние переменные
состояния (local state variables), описывающие состояние реального объекта. Поскольку
объекты в моделируемой системе меняются со временем, переменные состояния соответ-
ствующих вычислительных объектов также должны изменяться. Если мы решаем, что
поток времени в системе будет моделироваться временем, проходящим в компью тере, то
нам требуется способ строить вычислительные объекты, поведение которых меняется по
мере выполнения програм м ы. В частности, если нам хочется моделировать переменные
состоя ния обыкновенными символическими именами в языке программирования, в язы-
ке должен иметься оператор присваивания (assignment operator), который позволял бы
изменять значение, связанное с именем.