Skip to content

Instantly share code, notes, and snippets.

@tnoda
Created November 5, 2015 06:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tnoda/77329ee3df7931ecfd8d to your computer and use it in GitHub Desktop.
Save tnoda/77329ee3df7931ecfd8d to your computer and use it in GitHub Desktop.
Scala もくもく会 LT スライドのソースコード #scala_kb

プログラミング言語は C++ が最強。異論は認めない

Intro.

C++ が最強な理由

だが C++ がいない場所では話は別だ

JVM 言語

Outline

JVM 最強のデータ構造

Java にできないこと

Main

JVM 最強のデータ構造

プリミティブ配列 (Primitive Array)

  • GC の対象外
  • 配列要素へのインデックスアクセス $O(1)$
  • しかも,メソッド呼び出しではなく演算扱いで超高速

プリミティブと(一次元)配列だけなら JVM の計算速度は C++ と大差ない

Scala の配列サポート (1)

関数ではないのに関数扱い

scala> val A = Array(7, 1, 4)
A: Array[Int] = Array(7, 1, 4)

scala> val B = Array(2, 2, 0, 0, 1, 2, 1)
B: Array[Int] = Array(2, 2, 0, 0, 1, 2, 1)

scala> B.map(A)
res0: Array[Int] = Array(4, 4, 7, 7, 1, 4, 1)

Scala の配列サポート (2)

なぜか compose できる

scala> A
res2: Array[Int] = Array(7, 1, 4)

scala> B
res3: Array[Int] = Array(2, 2, 0, 0, 1, 2, 1)

scala> val C = A compose B
C: Int => Int = <function1>

scala> C(4)
res4: Int = 1

Scala の配列サポート (3)

初期化の字面が Java よりまし

val N = 100
val sc = new Scanner(System.min)
val A = Array.fill(N)(sc.nextLong)

  • ループ回さなくてもよい
  • コレクション扱い

Java にできないこと

一定空間での末尾再帰呼び出し

Java で末尾再帰呼び出しするメソッドを使うと,

Exception in thread "main" java.lang.StackOverflowError

Scala

  • 末尾再帰呼び出し自動最適化
  • @tailrec アノテーション

そのほか

型検査

  • よくある int / long のまちがい
    • Java も Scala もコンパイル通る
    • Java IDE でも検出できる

Immutable collections

  • 並行実行するプログラムを書くときに便利
    • スレッド分散 < ノード分散
  • 配列と比べるととても遅い
    • あまり使いたくない

Conc.

Scala が最強な理由(ただし ry

Java と比べて,良い。

配列サポート

  • 初期化
  • 関数扱い

末尾再帰自動最適化

  • Stack overflow しない
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment