Алексей Махоткин

домашняя страница

Критика Standard ML — неизменные значения

Andrew W. Appel, «Критика Standard ML», оглавление

В функциональных языках рассматриваются отношения между значениями, а не объектами. Я проиллюстрирую это довольно глупым примером. Посмотрим на несколько операторов некоего языка программирования:

        x := 1 + 6
        y := 2 + 5

Теперь, если нам захочется порассуждать об отношениях между x и y, мы можем задать следующие вопросы:

  • является ли x той же семеркой, что и y?
  • если мы изменим x, изменится ли y?
  • нужно ли нам делать копию семерки, чтобы реализовать операцию z := x?
  • когда нам больше не нужен x, как нам избавиться от семерки?

Если эти вопросы кажутся вам глупыми, то представьте себе аналогичный случай:

        x := cons(a, b)
        y := cons(a, b)

Итак, является ли x той же самой ячейкой списка, что и y? Если мы изменим car(x), изменится ли y? Когда нам придется делать копию ячейки списка? Как нам избавиться от нее?

На вопрос «как избавиться», конечно же, можно адекватно ответить, если язык поддерживает сборку мусора. С вопросами изменения и тождественности все сложнее. Когда пишешь и пытаешься понять программу, беспокойство о совместном использовании подструктур, побочных эффектах и синонимах очень отвлекает. (Более того, оптимизирующий компилятор тоже вынужден отвлекаться на эти проблемы!)

Эти вопросы звучат глупо, когда мы говорим о целых числах, потому что мы обращаемся с ними как со значениями, а не как с объектами. Если мы представим себе целые числа в виде объектов, у которых есть команда «обновить биты», то вышеприведенные сложности придется обязательно учитывать при программировании.

Значения имеют множество преимуществ перед объектами. Совместное использование субструктур никогда не приведет к проблемам, если эти субструктуры нельзя модифицировать. Не требуется размышлять относительно различия между «равными» и «одними и теми же» значениями: чтобы обеспечить это, ML не позволяет сравнивать адреса неизменных значений. Можно производить индукцию по структурам, чтобы доказать важные вещи об их значениях; в случае с объектами пришлось бы производить индукцию по истории этих объектов, что сильно усложняет рассуждения.

Comments