言語は並行並列処理が簡単に書けることを1つの売りにしているようです。軽量スレッドやチャネルを利用することができ、並行並列が得意な言語の1つです。慣れ親しんでいない人が見ても雰囲気がつかめるコードを目標にしたので、あまり難しい書き方はしないようにしています。使い、EvalモナドやParモナドは説明していません。詳しい方はそのあたりご了承下さい。明示的に書いています。サイトの作りとしては完全に静的サイトになっていて、残念ながら現状は本家のようにコードを実行する機能はありません。かなにかでコード実行サーバを立てたいというのがあるためです。言語拡張を1つも使わずに書けました。早い段階から入っていた(枯れた)機能なことが分かります。比較いくつかの観点から、比較と言えるほど厳密ではないですが、感触の違いを述べます。今回はパフォーマンスについては見ていません。軽量スレッド軽量スレッドというのはOSのスレッドとは違って言語のランタイムが管理するスレッド(でいいはず)。軽量というだけあって軽くてたくさん(数千個とか)作ることができます。すごいと言えそうです。使い勝手はほとんど変わらないと思います。やると軽量スレッドになるというだけです。方がよく使われていると思います)。普通の関数というところです。別の名前をつけることで言語固有のすごい機能として見せるのはうまい手だなと思いました。使いやすいと言えそうです。ストレスフリーにチャネルを取り扱えるように考えられています。ような書き味を実現できるかもしれません。それはおそらくやりすぎなのでやらない方が良いでしょう。高速なチャネルの話題があります。標準のチャネルより高性能な実装を目指したパッケージがいくつかあります。標準チャネルの性能に不満があるなら検討してみるとよいかもしれません。STMチャネルは便利ですが、スレッド間で変数を共有する方法としてそれだけで完結するというわけではありません。変数を複数のスレッドで共有してコンフリクトを起こさないようにそれぞれ読み書きをするような場合です。用意しているようです。シンタクティックノイズなだけでなくデッドロックを生みやすくなってしまいます。(これは私の憶測ですが、Goの設計はユーザにチャネル以外の共有変数を禁止しようとしているように見えます)。STM(ソフトウェア・トランザクショナル・メモリ)が用意されています。一連の不可分な共有変数の操作を「トランザクション」という単位でまとめることができます。トランザクションの実行中に、利用したい共有変数の1つが他のスレッドによってすでに使われていることが分かったら、トランザクションは実行前の状態までロールバックし、変数がフリーになるのを監視します。いけそうになったらトランザクションはリトライされ、ロールバックせず完遂できるまで繰り返します。使うと複雑な並行処理もうまく記述できることがあります。弱点はあり、ふつうのコードとの組み合わせに注意が必要なこと、ロールバック・リトライの回数やタイミングを人間が完全に予測することはほとんど不可能なことなどがあります。トランザクション中にミサイルを発射する処理が入っていた場合、トランザクションが間違いでロールバックされることになってもミサイルの発射はロールバックできません。最大値を超える、といったことは十分考えられます。「ソフトウェア」とわざわざ付けているだけあって元は電子回路上のアルゴリズムなので、任意の処理が差し込めるようにはできていないのです。モナドと分離することでこの問題を完全に回避しています。トランザクション中に副作用のある処理を入れてしまったとしても、実行時ではなくコンパイル時にエラーになります。特徴はこういったところでもメリットを生んでいます。言われる「STMは遅いのか?」という話題も取り扱われています。顕著な違いがある部分です。2つのコードを見比べてほしいと思います。やり残したこと本家のようにコード実行機能をつけたい。コードを渡して動的ロードするサーバーが作れそう。この部分は静的サイトにできないのでサーバ代がかかる......。_)m)英語版の完成。軽量スレッドやチャネルの構文はとてもよく設計されていて、特にチャネルに的を絞って専用の構文をたくさん用意する設計選択にはすごいセンスを感じました。チャネル以外の共有変数のサポートが薄いというのは、並行並列処理に関してちょっと強すぎる仮定な気もしました。想定する適応領域(システムプログラミング?)ではスレッドとチャネル以外の並行並列ツールはほとんど必要ないのかもしれません。設計選択のセンスはやはりすごいということになる。長いですが引用します。スレッドとロックは、並列画像処理から並行ウェブサーバまで、必要なものをすべて記述できるだけの表現力を有しています。このような単一の汎用的なAPIが存在するのはたしかに利点ではあります。異なる問題に対しては異なるツールを用いるという考えが、やはり重要になってきます。一本のナイフではうまく切れないのです。私個人としては1つのツールに寄り掛かるのは恐いので状況に応じたツール選択ができるようになっておきたいという思いがあります。限らず並列・並行をやる人にとてもおすすめの本です。作るにあたっても大いに参考にしました。haskellgithub.com作った。指定した周期でチャネルに値を送るスレッドを生成する。一定間隔で何かの処理を行いたいときに利用する。今回作ったHaskell版もだいたい同じようなものを提供する。Haskellパッケージ製作の練習をしたかったのでHackageのアカウントを取ってHackageに上げた。練習のため、HaddockによるAPIドキュメントおよびhspecとdoctestによるテストも書いてある。あとは何かCIを導入してGithubのページにCIのステータスを表示するようなやつもやってみたい。Haskellパッケージ作ったことがない人が作り方の参考にすることができるかもしれない。ちなみに言語拡張は一つも使っていない。まじめに書いたのでこちらも参照されたい)現在は2つの関数を提供している。使うとリストに化けさせることができる。(Haskellのリストは遅延リストなのでこれが可能)。「forループでチャネルの受信をする」というGoっぽい書き方もできる。チャネルとともにTickerを止める関数を返す。Tickerの受信者がいなくなったらこれを呼ばないとリークになる(たぶんGoも同じ)。停止するのでリークを気にする必要はない。