Чем Clojure STM отличается от Haskell STM?

Я пытаюсь найти различия между тем, что Clojure называет STM, и тем, что реализовано в Haskell как STM. Отбросив фактические языковые семантические различия, я немного запутался, поскольку Рич Хики говорит в своей речи, что реализация STM в Clojure сильно отличается от всего остального, но я не понимаю различий, кроме выбора языка.

3 ответа

Решение

Clojure STM имеет 3 большие уникальные особенности:

  1. Реализует снимок MVCC, избегая перезапусков транзакций при недействительности чтения.
  2. Гарантирует, что ссылки на чтение-запись обеспечивает своего рода ручное управление порядком получения ресурсов.
  3. Имеет явную коммутацию, которая уменьшает количество повторных попыток записи.

Для Haskell STM см. Документы SPJ: http://research.microsoft.com/en-us/um/people/simonpj/papers/stm/

В частности, используются "Композиционные транзакции памяти" и "Транзакционная память с инвариантами данных". Реализация STM в GHC действительно не является MVCC. Я не помню все детали реализации, но, насколько я понимаю, описание в документах не так уж и отличается от того, что в настоящее время существует в GHC.

(обратите внимание, что MVCC, в clojure или в другом месте, делает возможным перекос записи - см., например, здесь: http://en.wikipedia.org/wiki/Snapshot_isolation)

Марк Волкманн сделал очень подробную презентацию о STM в целом (и STM Clojure в частности) на Strange Loop 2009, которую вы можете найти здесь (статья и слайды здесь). Я действительно не знаю ни одного другого ресурса (кроме кода) для понимания того, как работает STM Clojure.

Другие вопросы по тегам