閉じる

本物のプログラマはHaskellを使う

日経ソフトウエア
日経ソフトウエア

目次

  • 第58回 Cの配列をHaskellで利用する

     Haskellでは、リストや配列といったデータ構造に対する処理を高速化するために様々な試みが行われています。しかし、残念ながら現在のHaskell処理系やライブラリの実装には性能面でまだまだ課題があります。Cの配列をHaskellで直接利用するようにすれば、性能の向上を期待できます。Cで書かれたO…

  • 第57回 機能テストや性能テストをCabalで自動化

     前回は、ライブラリや実行可能ファイルを提供するパッケージをCabalで作る方法を説明しました。Cabalには、パッケージをテストするための機能も用意されています。今回はこの機能の使い方を説明します。

  • 第56回 Cabalを使ってパッケージを作成する

     これまでの回では、Cabalを使って作成したHaskellのパッケージをたびたび利用してきました。しかし、そうしたパッケージの作り方をきちんと説明したことはありませんでした。今回は、Cabalによるパッケージの作成方法を詳しく説明します。

  • 第55回 repaを使ってステンシル畳み込みを行う

     前回は、行列演算を定義する方法を説明しました。行列演算は、traverse関数やfromFunction関数を使って、「行列を変換する処理」と「個々の要素を求める処理」を組み合わせることで定義できます。同様に、「ステンシルを使って配列の中の隣接要素を取り出す処理」と「取り出した各要素を畳み込む処理…

  • 第54回 repaを使って行列演算を定義する

    前回はrepaの基本的な使い方を説明しました。それを基に、今回はいよいよrepaの特色である行列演算を行う方法を説明します。

  • 第53回 repaを使って行列演算を並列化する

     並列HaskellやParモナドを利用すれば,並列処理のための特別なデータ型を使わなくても並列処理は可能です。しかし,目的とする処理の並列化に特化したデータ型が用意されているのであれば,それを利用したほうが簡単かつ効率的に処理を行えます。そこで今回は,並列処理用のデータ型の一つとして提供されている…

  • 第52回 データ構造を走査するためのTraversableクラス

     データ構造に対する処理を抽象化するための型クラスとして,これまでFunctorクラスやFoldableクラスを説明しました。これらのクラスでは,「データ構造の走査(traverse)」と「データ構造を走査した際に行う処理」をセットにしたfmapやfold*という処理が直接提供されています。Hask…

  • 第51回 FunctorとMonadの間にあるApplicative

     FunctorクラスとMonadクラスの中間に相当するApplicativeクラスが,広く使われるようになりました。特にパーサー・ライブラリでは,Applicativeクラスおよび「Applicative版のMonoid」であるAlternativeクラスが欠かせないものになっています。Appli…

  • 第50回 並列プログラミングにおける抽象化と細かい制御のトレードオフ

     並列Haskellやデータ並列Haskellといった,GHCで提供されている並列処理の機能には弱点があります。並列Haskellが提供する並列処理機能の抽象化能力は極めて強力ですが,抽象化され過ぎていて並列処理の制御が難しいという問題があります。一方,より低レベルの並列処理機能は,並列処理を直接制…

  • 第49回 GHCの測定機能やプロファイラで並列プログラムの振る舞いを調べる

     前回説明した,並列プログラムを高速化するための原則は,あくまで基本方針にすぎません。実際には,並列プログラムの動作を確認し,効率的な処理を行っているかどうかを調べる必要があります。効率的でないなら,どこに問題があるのかを調べて改良しなければなりません。そこで今回は,GHCの性能測定機能や並列プロフ…

  • 第48回 並列プログラムを高速化するための原則

     これまで,逐次処理を行うプログラムを効率化するテクニックやツールを説明してきました。こうした知識を前提に,今回から何回かに分けて,並列プログラムの処理の効率化について解説していきます。これまで説明したテクニックやツールの中には,並列プログラムで利用できるものと利用できないものがあります。これらを明…

  • 第47回 領域漏れがあるプログラムを改良する

     前回は,GHCのヒープ・プロファイラを使って領域漏れが発生している個所を探す方法を紹介しました。もっとも,領域漏れの発生している個所を探すだけでは意味はありません。今回は,領域漏れの問題をどう解決するかを説明します。

  • 第46回 ヒープ・プロファイラで領域漏れを探る

     Haskellは遅延評価を採用した言語です。遅延評価によってプログラムの実行が効率的になる場合がある一方,遅延評価が原因で領域漏れ(スペース・リーク)が発生する可能性があります。GHCなどのHaskell処理系では,ヒープの使用状況を見るためのプロファイラが用意されています。今回は,ヒープ・プロフ…

  • 第45回 GHCの性能測定機能でボトルネックを探す

     プログラムの性能を効率化するために最も大切なことは,ボトルネックになっている部分を見つけ出すことです。ボトルネックを考慮せずに闇雲に効率化しても,労力に見合った成果は得られません。GHCでは,プログラムを実行する際のボトルネックを探せるように,実行時の様々な情報を出力する機能が提供されています。今…

  • 第44回 progressionで複数の性能測定結果を比較する

     criterionでは,個々の性能測定の結果を数値として比較したり,個々の結果をグラフとして表示したりできます。ただし,複数の結果を比較する機能はありませんでした。こうした比較を簡単に行えるようにするのがprogressionです。

  • 第43回 criterionでプログラムの性能を測定する

     プログラムの性能を測定するにはどうすればよいでしょうか? すぐに思いつくのは,プログラムの実行時間を測定することです。しかし,現在のコンピュータの環境では,プログラムの実行が常に一定の速度で行われる保証はありません。また,Haskellではすべての値が遅延評価されるという事情もあります。そこで,今…

  • 第42回 ランダム・アクセスを行う処理を効率化するRecycling

     Stream Fusionという手法は,fold/buildのような従来の融合変換の手法に比べ,柔軟で優れています。しかし,処理をStream化して扱う都合上,Stream Fusionには「前から」あるいは「後ろから」といった特定の順序に従った処理しか行えない,という弱点が残っています。この弱点…

  • 第41回 任意の再帰構造による処理を融合変換できるStream Fusion

     前回はStream Fusionを使った融合変換の基礎を説明しました。これだけでもStream Fusionは十分に強力な仕組みですが,Stream Fusionの真骨頂は「fold/buildよりも広範な融合変換がStream Fusionだけでできる点」にあります。fold/buildでは新た…

  • 第40回 Stream Fusionによる融合変換で処理系の最適化機能を生かす

     第37回では,リスト演算を効率化する「fold/build」という融合変換の手法を紹介しました。また,この回のコラムでは,「destroy/unfoldr」という手法にも言及しました。リストなどのデータ構造を使う処理に対する融合変換の手法は,ほかにもあります。第10回および第24回のコラムで紹介し…

  • 第39回 一般向けの「Haskell Platform」とインストール・ツールの「cabalコマンド」

     2010年3月22日に,Haskell Platform 2010.1.0.0がリリースされました。Haskell Platformは,その名の通りHaskellでプログラミングをするユーザー向けの開発プラットフォームです。Haskell Platformには,GHCに加え,GHCには含まれていな…

日経 xTECH SPECIAL

What's New!

経営

クラウド

運用管理

設計/開発

サーバー/ストレージ

クライアント/OA機器

ネットワーク/通信サービス

もっと見る