はじめに

今日は, なんだか仕事のやる気も起きないアンニュイな気分だったので, 仕事をサボって社内で開かれたセミナーを聴きにいきました.

Scala による OO と FP のお話

スピーカーは, 浅海智晴さん.

話の内容は, “オブジェクト指向と関数型プログラミング (Scala)“について.

用語を復習しようと Google で検索していたら, 今日きいた話のスライド発見. 一生懸命メモをとったものの, ラッキー.

以下, 用語についての復習と感想を書く.

背景

ハードウェアのメニーコア, 大容量メモリ化によって, 性能のボトルネックが I/O ではなくて, アプリケーションとなってきた. アルゴリズムが勝負の世界. アプリがボトルネックになってきた. そのため, 言語レベルで平行・並列処理が書きやすい言語が求められるようになった.

Cloud Computing において, 異常が発生したら全体をとめるのではなくて, 一部を停止して運用を継続させる必要がある.従来の例外処理では処理する のが複雑になってきた.そのため, 言語レベルで分散コンピューティングや Fault Tolerant をサポートするような言語が求められるようになった.

所感

ストレージ業界にいることもあって, アプリが性能のボトルネックになるというはなしはよくきく.

以前, 次世代メモリと呼ばれている ストレージ・クラス・メモリ (SCM) の技術動向の話をきいたときにも同じはなしが出た. アプリがストレージの性能のボトルネックになるとわかったとき, 我々開発者はなにをすればいいのか? という質問がでたが, 答えは,

関数型言語をつかうこと

All SCM Array が数年後に実現したときにはじめて, プログラミングの パラダイムシフト が起こるかもしれない.

関数型言語とは

過去と現在の関数型言語の認識の違い.

昔は, 高階関数 をサポートする言語という緩い定義だった.

現代のモダンな言語の定義は違う!

現代のモダンな言語 (Haskell, Scala など) は,

数学的理論を背景にプログラムを記述する言語

数学をベースとするプログラミング

数学的理論とは, たとえば以下.

  • ラムダ計算
  • 数理論理学
  • 圏論

とりわけ, Monad が大事.Monad をつかって, どうつくるかという流れ.

所感

数学のベースについて, 以下の記事でまとめられているが,これがおもしろい. 数学がベースといってはいるものの, 数学のほんの一部分.抽象代数学がからんでいる.

自分は, 大学では一応応用数学を学んだ気がしたので, プログラミングと数学が結びつくという売り文句はとてもうれしいのだ.

ああ, 学生時代の苦しみは無益ではなかったのだと.

代数学は, 禅僧の修行のような単なる苦悩に耐え忍ぶ訓練だと思っていたので, まさか, 社会人になって再び群論にお目にかかるとは,学生のときには想像 出来ないことだった.

コンパイル = 証明

コンパイルを通すということは, 正しさを証明すること

関数型言語では, コンパイルが通るとバグがほとんどでない. 純粋関数の世界でプログラミングをすることによって, 実現できる. 背景には数理論理学がある.

このことがなぜ大事かというと, 並列プログラミングのバグとりは大変. テストですべてのバグをとれたという保証ができない.

関数型ならば数学をベースにして, バグがないことを証明することができる

関数型言語のメリット・デメリット

  • メリット

    • 高階関数を使った技が使える (それによってコードが短くなる)
    • 定理と証明
  • デメリット デメリットだけみると, 組み込み系ではほとんど出番なしな気がした. いつの時代も, C 言語最強?? いや, C で並列処理はつらい.

    質問時間に, 組み込み系では関数型言語は活用できますかと 質問してみたが, わかりませんという回答だったので, 調べてみた.

    有力候補は OCaml. 時間効率, 空間効率がいいらしい.

    マイナーな言語で ATS というものもあるが, 情報が少ない.

    分散システムを組むならば, Erlang もつかえるか?

    組み込み系といっても, リッチな環境の組み込み系ならばリソースなんて 関係ない?? Android は Java で動いているし, Scala だって.

Monadic Programming

モナドを中心にプログラムを組む方法.

モナドとは,

  • コンテナ
  • パイプライン
  • インタプリタ

モナドにはいろいろな種類がある.

  • IO モナド
  • State モナド
  • Future モナド …

モナドの使い方は難しいのだけれども, パターンがあるのでなれれば簡単.

所感

モナドはよくわからない.

しかし, 今日の話で距離が狭まった.

難解なもの, 副作用をもつものは, モナドに閉じ込めて隠蔽する. それによって, プログラムがスッキリする.

この言い回しは, OO におけるカプセル化 でもきいたような気がする.

難解なもの, 副作用をもつものは, オブジェクトに閉じ込めてカプセル化する. それによって, プログラムがスッキリする.

また, モナドには使い方があり, 覚えてしまえば簡単という話は, 以前まとめた関数型デザインパターンの話にもつながるのかもしれない.

Functinal Reactive Programming (FRP)

ある変化に応じて動作する, イベント駆動のプログラミング方法.

Reactive Programmig には, 2 つの種類があるように思う.

  • Actor Model
  • Monadic Model

所感

以下の記事がわかりやすい.

最近よくみかける用語だし, これから流行しそうな手法.

GUI, インフラ, ビッグデータ処理など様々な場面で浸透しつつあります. 今までは複雑すぎて作ることが難しかったアプリケーションが簡単に設計できるようになっていくでしょう.

リアクティブ宣言なんという, かっこいい文章も存在する.

Object-Functional Programming (OFP)

オブジェクト指向のパラダイムと関数型のパラダイムの両方を利用して プログラミングする.

上流工程では, 今までどおりオブジェクト指向設計で考えることになる. ユースケースで今までどおり要件定義をして, コンポーネント分割までする. そこから, オブジェクトかファンクションのどちらかつかって責務を実現する. なので, OOP と FP は共存関係にある.

OFP 新三種の神器.

  • トレイト
  • モナド
  • 型クラス

OFP を導入することメリットは, 以下.

  • 高階関数DSL を書くことで 開発効率 をあげる
  • Monadic Programming を行うことで並列処理の品質をあげる

どこに Functional Programming を適用するか?

Functinal Programming で書くと, バグが出にくいので, Functonal Programming の割合をできるだけ増やしていくのがベスト.

システム開発では, OO:FP の割合は 6:4 くらいか??

FP でつくるのに適した部分は, DSL の部分. OOP で, Framework と呼ばれている部分.

アプリ開発は Java でもいい. アプリ開発の基盤にある DSL 部分を 関数型でかく.

DSL

DSL とは,特定のタスク向けに設計されたコンピュータ言語. DSL は一種類のタスクをうまく実行することに集中したもの.

そして, FP (というよりも Scala) は, DSL を書くことに 適している (Scalable language). なぜなら, 簡単に独自の型や制御構造を定義できるので.

まとめ

去年から, 関数型言語をかじりはじめてきたが, 自分が理解してきた

  • Stateless
  • High-order function

という考え方は, いわゆる伝統的な FP の概念だということを知った. また, それにかわるモダンな考え方は Monad だということも知った. (OFP 新三種の神器)

モナドについては, ほとんどまだ理解できていないので, 今年はモナドに注目して学んでいくことにする.

個人的には, 関数型言語を並列処理どう適用するかという話をもう少し つっこんで知りたい. それも, Monadic Model を理解すると見えるかもしれ ない.まずは, Monad.

Next Action

今は (伝統的!) 関数型言語の聖典, SICP を読んでいるので, Monad はさておき, まずはこれを読み終えなければ.

4 月か 9 月に coursera の Scala の講義が開講されたらもう一度受けてみる. (なぜなら, 前回は落第して単位をもらえなかったから…)

Reactive Programming についても学んでみたい. 去年 coursera で講座が 開講されるのをまっていたのだが, 去年は開講されなかった. 今年も開講されなかったら, 11 月からアーカイブ講座をつかって学んで見ようと思う.