STM
http://d.hatena.ne.jp/kilrey/20090214#p1に繋がる話。
現状の手続き型言語でマルチスレッド対応する場合にはセマフォなどの排他・同期条件を利用する。その排他・同期条件を利用する文法としてはJavaのsynchronizedがもっとも洗練されているだろう。単純な条件ではthisを用いて、複雑な条件では同期オブジェクトを用いてロックを行う。ロック解除を自動化するなど、間違える可能性の高い箇所を減らしている。
トランザクションの戦略次第ではまったく同期と同じ振る舞いを保つことも可能だろう。例えば、
synchronized { this.update(); }
をソフトウェアトランザクションに変換して
while (true) { synchronized { clone = this.deepCopy(); } clone.update(); synchronized { if (this.unchanged()) { this.copyFrom(clone); break; } } sleep(); };
というように(外部環境まで擬似的にコピーすることが必要だが)。
手続き型パラダイムではメニーコアに向けた解としてトランザクショナルメモリが有効だと思う。それでもコストが大きいのは事実だし、それだけのコストをかけるなら関数型パラダイムで排他・同期が必要な箇所自体を減らした方が良いのではないかなあ。