BPStudy #49
Pythonista によるPythonista のための
Scala 紹介
2011/09/30 BPStudy #49 Scala 祭り
しょうま@shomah4aId:shomah4a
BPStudy #49
内容
● 自己紹介● Scala ってどんな言語?● どこで使われている?● 動的型付け・静的型付け● 型推論● 関数型なにそれおいしいの?● Python と Scala● 開発環境について● その他
BPStudy #49
お前、誰よ
● しょうま(@shomah4a)
● 今月頭から Java の会社● 仕事では今は Python 使ってます。と思ったらそうでもなくなった● Java とかよくわかりません
● Scala を始めたきっかけは面白そうだったから● Android 開発で Java 使いたくないってのも
● 言語遍歴● Basic -> VB -> (C ->) C++ -> Python(, Haskell, Erlang,
OCaml, Scheme) -> Scala
● Python 界隈の人
BPStudy #49
Scala とはなんぞや?
BPStudy #49
Scala とは
● Scala ... はオブジェクト指向言語と関数型言語の特徴を統合したマルチパラダイムのプログラミング言語である。(wikipedia)
● 最新版は 2.9.1● 静的型付けなコンパイル型言語
● コンパイル遅い…
● 省コード● Java とか冗長でめんどくs(ry
BPStudy #49
Scala とは
● 標準ライブラリ● collection● JSON● Stream
● Web Framework● Lift, Play, BlueEyes, ... その他諸々
BPStudy #49
Scala とは
● JVM で動く● Android の Dalvik VM でも動くよ!● Java のライブラリをそのまま使える
– でも…
● .NET CLR もサポートしているらしいけど開発止まってる…
● LL です!● REPL もあるよ!● LL Tiger にもいたよ!
BPStudy #49
Scala とは
● 並行処理● Actor モデル
– Erlang の Process– Message Passing でデータをやり取りし、共有メモリを排する– Python の multiprocessing が似たようなインタフェイス
● STM (Software Transaction Memory)– 共有メモリに対するアクセス制御の方法– Haskell とか Clojure とか– PyPy でも GIL を取り除くために注目されたり
● このあたりは @cooldaemon さんが詳しい● http://d.hatena.ne.jp/cooldaemon/
BPStudy #49
どんなところで使われている?
● 大体 Web 系● Twitter, Foursquare, Remember the Milk, etc...
● 国内だと GMO メディア, ドワンゴ[要出典]など● Android
● 個人的に一個作りました
BPStudy #49
マスコットキャラクタ
● @scalachan
BPStudy #49
Java と Scala
BPStudy #49
Java と Scala
● よく言われる「JVM で動くから Java の遺産資産使えるよね」という話● Java のライブラリを使うとその部分は Java っぽくなら
ざるを得ない● Scala っぽく書くために Wrapper はほしい
● Better Java としてしか Scala を使わないのはどうなの?● C++ != Better C
BPStudy #49
静的型付けと動的型付け
BPStudy #49
動的型付けとは
● 変数の型が実行時に決まる● 実行時の変数の中身次第
● 大抵インタプリタ型● メリット
● 文法チェックだけでコンパイルしないで実行できる● ゆるふわ
● デメリット● 動かしてみないと型の間違いがあってもエラーが出ない
BPStudy #49
静的型付け
● 変数の型がコンパイル時に決まる● 大抵コンパイル型の言語
● メリット● 型エラーは実行前に発見できる● 動的型付けより堅牢
● デメリット● 型書かないといけない● ゆるふわじゃない
BPStudy #49
でも、めんどくさいんでしょう?
BPStudy #49
Scala には型付けを楽にするための仕組みが沢山
BPStudy #49
総称型
● Generics● クラス・関数に型パラメータを付与し、様々な型に対して同じ処理を書けるようにする
● Java からある● C++ のテンプレートのつもりで使うとハマる
– テンプレートと違って単純置換じゃない
● def add[T](left:T, right:T) = {...}
BPStudy #49
型とか
● Python● Duck Typing
● 実行時に動的に属性を見る
● メソッド・属性の有無に関係なく動的に解決するので実行時にエラーが出る可能性
● Scala● Structural Subtyping
● 特定の属性を持つという型を定義可能
● http://d.hatena.ne.jp/yuroyoro/20110126/1296044588● 皿うどん● OCaml からパクッた
BPStudy #49
型推論
● 変数定義時や関数定義時に、文脈から型を推測して変数や関数の型を決める仕組み● val x = 10 と書いてあれば x が Int であると推論する● Java なんかだと int x とか書かないといけない。● SomeClass x = new SomeClass(...)
– SomeClass が二回出るのって無駄じゃね?● val x = new SomeClass(...)
– すっきり– 変更するときに書き換える箇所が少ない
BPStudy #49
関数型
● 関数型言語は、広い意味ではファーストクラスの関数オブジェクトを持つ言語である。また、純粋関数型言語では、全ての関数が副作用を持たない。関数型言語の多くは、カリー化、遅延評価などの機能を備えている。また、静的型付けの物の多くは型推論の機能を持つ。(wikipedia)
● 広い意味では Python も関数型の特徴がある● 関数オブジェクト● 高階関数(map, filter, reduce)● デコレータ(関数を受け取って関数を返す高階関数)
BPStudy #49
Scala の関数型
● ファーストクラスの関数オブジェクト● 無名関数● カリー化● 遅延評価● パターンマッチ
● case class で拡張できる
● 末尾再帰最適化● 相互末尾再帰は未サポート
BPStudy #49
それ以外
● 限定継続● Scalaの限定継続の基本と応用in高橋メソッド● by @kmizu● http://www.slideshare.net/kmizushima/scala-8345454
● コンパイラプラグイン● モテモテコンパイラプラグイン by @kiris● http://www.slideshare.net/kiris60/motemote-compiler-plugin
BPStudy #49
Python と Scala
BPStudy #49
ソースを見てみる
BPStudy #49
例: 1〜100 をプリントする
● Scala● 0 to 100 foreach {x=> println(x)}● 0.to(100).foreach(println)
● Python● for i in xrange(101): print i● for i in range(101): print(i)
● Ruby● 0.upto(100).each {|i| puts(i)}
BPStudy #49
Ruby の方が似てね?
BPStudy #49
fizzbuzz.scala
0 to 100 foreach (i =>{ if (i % 3 == 0) { print("fizz") } if (i % 5 == 0) { print("buzz") } if (i % 5 != 0 && i % 3 != 0) { print(i) } println("")})
BPStudy #49
fibonacci.scala
def fibonacci(n:Int): Int = if (n == 0 || n == 1) { 1 } else { fibonacci(n-1) + fibonacci(n-2) }
BPStudy #49
The Zen of Python
BPStudy #49
Beautiful is better than ugly.
● Python に限った話じゃない
BPStudy #49
Explicit is better than implicit.
● Implicit conversion とか Implicit parameter とかある● implicit def tostring(n:Int) = n.toString● def print(x:String) = println(x)● print(10)
BPStudy #49
Simple is better than complex.
● Python は書いたまま読める(意味が取りやすい)● Scala はソースが短くて意味が取りやすいけど、すべてを把握するのが困難だったりする
BPStudy #49
Flat is better than nested.
● ネストした関数・部分関数・パターンマッチ結構書く● それが読みにくいというわけではない
BPStudy #49
Sparse is better than dense.
● メソッドチェイン大好き● 行あたりの持つ意味が結構濃い
BPStudy #49
略
BPStudy #49
もしかして Pythonista には向かない?
BPStudy #49
新しいパラダイム・作法・文化に触れられる
BPStudy #49
開発環境
BPStudy #49
IDE
● Eclipse● プラグインがある
● IntelliJ IDEA● 結構いいらしい
BPStudy #49
Emacs
● scala-mode.el● Syntax Highlight と入力補助● よくあるメジャーモード
● Ensime かわいいよ Ensime● 補完とかできるらしい● 裏に Scala のプロセスを立ててコンパイルしている● すみませんつかってません● EmacsでつくるScala開発環境 後編(ENSIME) -
tototoshiの日記● http://d.hatena.ne.jp/tototoshi/20100927/1285595939
BPStudy #49
ビルドツール
● ant● maven● sbt (simple build tool)
● あんまり simple じゃないような…?● buildout みたいなことできる● オススメ
BPStudy #49
まとめ
● Python とは違った文化・毛色の言語● 動的型・静的型● インタプリタ型・コンパイル型● Explicit・Implicit
BPStudy #49
本とか
BPStudy #49
Scala スケーラブルプログラミング
● 通称コップ本● Odersky 先生が書いた本● 仕様とか詳しい
● K&R・プログラミング言語C++
● 第一版は2.7 なのでちょっと古い● 第二版出たばっか
● 2.8, 2.9 対応
BPStudy #49
プログラミング Scala
● 信頼の O'reilly● すみませんまだよんでません
BPStudy #49
Scala 実践プログラミング
● すみませんまだよんでません● 後半がマニアックらしいです● 今日サインもらえますきっと
BPStudy #49
勉強会とか
● Scala 勉強会 in 渋谷● 隔週水曜日に渋谷で開催される勉強会● とってもゆる〜い● 気軽に参加できる● http://scala-users.org/shibuya/
● Scala 勉強会 in 秋葉原● 隔週水曜日に秋葉原で開催される勉強会● とってもゆる〜い● 気軽に参加できる● http://scala-users.org/shibuya/
● ゆるふわ Scala 勉強会
BPStudy #49
横浜.py
● はまぱい? よこぱい?● Facebook Group
● https://www.facebook.com/groups/126168334149384/
● 初心者向けな会にしたいなあ
BPStudy #49
ご清聴ありがとうございました!