Kotlinの紹介

4,414 views

Published on

第一回 JetBrainsユーザーグループ 勉強会で発表した内容です。

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,414
On SlideShare
0
From Embeds
0
Number of Embeds
2,482
Actions
Shares
0
Downloads
5
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Kotlinの紹介

  1. 1. Kotlinの紹介 2012-12-11 @ngsw_taro 発表動画は http://www.youtube.com/watch?v=3-WxEqTs5c0Wednesday, December 12, 12
  2. 2. アジェンダ • 自己紹介 • Kotlinとは • なんでKotlin? • Hello Worldから見るKotlin • Brainf*ckから見るKotlin • 適当にライブコーディング • まとめWednesday, December 12, 12
  3. 3. 自己紹介Wednesday, December 12, 12
  4. 4. @ngsw_taroって言います • 24歳 • 某SIer 新卒1年目 • ゆーすけさんの愛弟子 • 趣味でAndroidアプリWednesday, December 12, 12
  5. 5. Androidな活動 • アプリ 夢と魔法の待ち時間 • ディズニーランドの待ち時間情報 • 書籍 炎のAndroid開発道場 • チームで書いたちょっと変わった入門書Wednesday, December 12, 12
  6. 6. Androidな活動 • アプリ 夢と魔法の待ち時間 • ディズニーランドの待ち時間情報 • 書籍 炎のAndroid開発道場 • チームで書いたちょっと変わった入門書Wednesday, December 12, 12
  7. 7. Kotlinな活動 • Pull Request(標準ライブラリ) • 解説/まとめ • プログラミングKotlin(仮) • ブログ 算譜王に俺はなる!!!! • Advent Calendar • Kotlin Advent Calendar 2012(全部俺)Wednesday, December 12, 12
  8. 8. KotlinとはWednesday, December 12, 12
  9. 9. JetBrains製JVM言語 • 2011年 7月 発表 • 2012年 2月 公開 • 2012年 4月 M1 • 2012年 6月 M2 • 2012年10月 M3.1 • 2012年12月 M4 NEW 画像は http://kotlin-demo.jetbrains.com/ より引用Wednesday, December 12, 12
  10. 10. こんな言語 • 静的型付け • オブジェクト指向 • 関数型プログラミング的 • JavaScriptへコンパイル可 • 産業利用目的 • Apache License 2.0Wednesday, December 12, 12
  11. 11. 簡単に言うと • 簡潔 • 安全Wednesday, December 12, 12
  12. 12. なんでKotlin?Wednesday, December 12, 12
  13. 13. Javaェ… • 互換性問題(レガシーへの対応) • StringBuffer、スレッドまわり • ジェネリクス何それ美味しいの? • 型安全性(配列) • 冗長な記述Wednesday, December 12, 12
  14. 14. ( ^o^) Kotlin使ってみるかWednesday, December 12, 12
  15. 15. ( )。o(待てよ.....       Scalaでいいんじゃ)Wednesday, December 12, 12
  16. 16. ¦ JetBrains ¦ ┗(☋` )┓三Wednesday, December 12, 12
  17. 17. ( ◠◠ )☛ Scalaは複雑 KotlinはシンプルWednesday, December 12, 12
  18. 18. ▂▅▇█▓▒░(ω)░▒▓█▇▅▂ うわああああああああああああWednesday, December 12, 12
  19. 19. JVM言語のライバルたち • Scala • 複雑(演算子オーバロード、暗黙の型変換) • Groovy • 動的だからミスが生じやすいWednesday, December 12, 12
  20. 20. まぁ何でもトレードオフ (例) • 複雑だけど高機能 • 冗長だけど意味が明確 • シンプルだけど表現力が弱い • 動的で柔軟だけど型安全保証なしWednesday, December 12, 12
  21. 21. Hello World から見るKotlinWednesday, December 12, 12
  22. 22. package com.taroid.sample fun main(args : Array<String>) { println("Hello, world!") }Wednesday, December 12, 12
  23. 23. package com.taroid.sample 名前空間レベルに関数 型が変数名の後 fun main(args : Array<String>) { println("Hello, world!") } セミコロン不要 配列にジェネリクスWednesday, December 12, 12
  24. 24. 型推論 val hoge : Int = 5 val hoge = 5Wednesday, December 12, 12
  25. 25. 型推論 数値リテラルはInt型 ここのIntは冗長 val hoge : Int = 5 val hoge = 5 コンパイラが型を推論Wednesday, December 12, 12
  26. 26. 配列がジェネリクス // Java final Integer[] ints = {1, 2, 3}; final Number[] nums = ints; nums[0] = Double.valueOf(0.1); // Kotlin val ints : Array<Int> = array(1, 2, 3) val nums : Array<Number> = intsWednesday, December 12, 12
  27. 27. 配列がジェネリクス // Java final Integer[] ints = {1, 2, 3}; OK Runtime ERROR!!! final Number[] nums = ints; nums[0] = Double.valueOf(0.1); // Kotlin Compile ERROR!!! val ints : Array<Int> = array(1, 2, 3) val nums : Array<Number> = intsWednesday, December 12, 12
  28. 28. Brainf*ck から見るKotlinWednesday, December 12, 12
  29. 29. Brainf*ckとは • 難解プログラミング言語 • チューリング完全 • 単純な8つの命令語を持つWednesday, December 12, 12
  30. 30. Brainf*ckの命令語 > ポインタを1増やす < ポインタを1減らす + ポインタが指す値を1増やす - ポインタが指す値を1減らす [ ポインタが指す値が0なら対応する]へ飛ぶ ] ポインタが指す値が0意外なら対応する[へ飛ぶ . ポインタが指す値を出力する , ポインタが指す先へ1バイト入力するWednesday, December 12, 12
  31. 31. Brainf*ckのHelloWorld +++++++++[>+++++++ +>+++++++++++>++++ +<<<-]>.>++.+++++++..+ ++.>-.------------.<+++++ +++.--------.+ +.------.--------.>+.Wednesday, December 12, 12
  32. 32. この処理系を Kotlinで実装したったWednesday, December 12, 12
  33. 33. 実装を持てるインタフェース public trait Brainfxck { public fun execute(source: String, inputStream: InputStream = System.`in`, outputStream: OutputStream = System.`out`) } デフォルトのパラメータWednesday, December 12, 12
  34. 34. object BrainfxckImpl : Brainfxck { override public fun execute(source : String, inputStream : InputStream, outputStream : OutputStream) { // do something } }Wednesday, December 12, 12
  35. 35. シングルトン トレイトの実装 object BrainfxckImpl : Brainfxck { override public fun execute(source : String, inputStream : InputStream, outputStream : OutputStream) { アノテーション // do something } }Wednesday, December 12, 12
  36. 36. private val incrementPointerOperator = { (runtimeState : RuntimeState) -> runtimeState.incrementPointer() } 関数リテラルを変数に割り当てる private val decrementPointerOperator = { (runtimeState : RuntimeState) -> runtimeState.decrementPointer() }Wednesday, December 12, 12
  37. 37. private val operators = hashMap( INCREMENT_POINTER to incrementPointerOperator, DECREMENT_POINTER to decrementPointerOperator, INCREMENT_VALUE to incrementValueOperator, DECREMENT_VALUE to decrementValueOperator, INPUT to inputOperator, OUTPUT to outputOperator, LOOP_START to loopStartOperator, LOOP_END to loopEndOperator )Wednesday, December 12, 12
  38. 38.  命令語(文字)と  操作(関数リテラル)を private val operators = hashMap(  マッピング INCREMENT_POINTER to incrementPointerOperator, DECREMENT_POINTER to decrementPointerOperator, INCREMENT_VALUE to incrementValueOperator, DECREMENT_VALUE to decrementValueOperator, INPUT to inputOperator, OUTPUT to outputOperator, LOOP_START to loopStartOperator, LOOP_END to loopEndOperator ) 演算子風関数呼び出しWednesday, December 12, 12
  39. 39. while (!runtimeState.isEndOfProgram()) { val code = runtimeState.getCurrentProgramCode() val operator = operators[code] ?: doNothingOperator operator(runtimeState) runtimeState.next() }Wednesday, December 12, 12
  40. 40. マップに配列風アクセス while (!runtimeState.isEndOfProgram()) { val code = runtimeState.getCurrentProgramCode() val operator = operators[code] ?: doNothingOperator operator(runtimeState) runtimeState.next() エルビス演算子 }Wednesday, December 12, 12
  41. 41. デモの前に Brainf*ckの命令語を 別の文字列に置き換えるWednesday, December 12, 12
  42. 42. イケメン仕様 private fun toBrainfxckSource(source : String) = source.replaceAll("山本", INCREMENT_POINTER.toString()) .replaceAll("裕介", DECREMENT_POINTER.toString()) .replaceAll("イケ", INCREMENT_VALUE.toString()) .replaceAll("メン", DECREMENT_VALUE.toString()) .replaceAll("Twitter4J", OUTPUT.toString()) .replaceAll("ん、", LOOP_START.toString()) .replaceAll("#呼んだ?", LOOP_END.toString())Wednesday, December 12, 12
  43. 43. デモWednesday, December 12, 12
  44. 44. 適当に ライブコーディングWednesday, December 12, 12
  45. 45. まとめWednesday, December 12, 12
  46. 46. Kotlinまとめ • 静的型付けJVM言語 • オブジェクト指向 • 関数型プログラミング的 • モダンで簡潔で安全 • かわいいWednesday, December 12, 12
  47. 47. ご清聴 ありがとうございました @ngsw_taroWednesday, December 12, 12

×