* [http://japan.cnet.com/news/biz/story/0,2000056020,20349605,00.htm インテル:「ソフトウェアもムーアの法則に従う必要がある」(CNET Japan)] [#nc6e9ba8] タイトルだけ見ると「富豪的プログラミングのススメ」のようにも思えるが, > マルチプロセッサ時代に合わせて,ソフトウェアも並列化を推し進めよ という,真っ当な話. x86 CPU のクロック周波数の上昇も頭打ちになっており,マルチプロセッサによるパフォーマンス改善に向かっているのはご存知の通り. そういえば,巷では [[erlang>Google:erlang]] という言語が話題になっている. erlang の並列処理に対するスケーラビリティに関心が集まっているようである. [[Wikipedia の説明>WikiPedia.ja:Erlang]] によると,その並列化モデルは - 「プロセス」(UNIX のプロセスではない) による並列化 - caller との通信はメッセージによって行う - メッセージ以外は caller とは独立して動作 というものだそうだ. thread ベースでの共有メモリ(変数)とセマフォによる通信と比べてクリティカルセクションやデッドロックなんぞ考える必要もない. これは楽そうだ. また,メッセージでさまざまなオブジェクトを直列化して送受信できるので,別のコンピュータとの分散処理も割とシームレスにできるだろう(実際,できるらしい). ということなら,この仕様を従来の言語に実装できないのだろうか,と考えてみる. 例えば C++ とか. プログラミング上は「プロセス」でも,処理系の内部実装は thread でも構わないので thread で実装するとしよう. collee にメッセージを送信する場合を考えてみる. オーバヘッドを小さくしようとしてオブジェクトをリファレンスとして送信してしまうと,その先にぶら下がっているオブジェクトは callee からも変更できてしまう. つまり,caller と callee を絶縁するためにはオブジェクト全体をコピーする必要がある. かなりオーバヘッドが大きそうだ. また,オブジェクトのコピー自体,意味を為さない場合もある. また,オブジェクトのコピー自体,操作として意味を為さない場合もある. erlang は,実は「関数型言語」なのだそうである. 関数型言語では,変数に一度値を定義してしまうとその後で変更することはできない. この場合,オブジェクトのリファレンスをそのまま callee に渡しても callee で内容が書き換えられないことが保証されているわけである. > つまり,関数型言語なのでこのような並列処理モデルを(おそらくは)比較的低いオーバヘッドで実現できているんじゃないかな. …というようなことを想像してみたりしたのであった.