Kotlinの紹介
                                       2012-12-11
                                       @ngsw_taro

                                            発表動画は
                             http://www.youtube.com/watch?v=3-WxEqTs5c0




Wednesday, December 12, 12
アジェンダ
                   • 自己紹介
                   • Kotlinとは
                   • なんでKotlin?
                   • Hello Worldから見るKotlin
                   • Brainf*ckから見るKotlin
                   • 適当にライブコーディング
                   • まとめ
Wednesday, December 12, 12
自己紹介



Wednesday, December 12, 12
@ngsw_taroって言います

                   • 24歳
                   • 某SIer 新卒1年目
                   • ゆーすけさんの愛弟子
                   • 趣味でAndroidアプリ

Wednesday, December 12, 12
Androidな活動


                   • アプリ 夢と魔法の待ち時間
                        • ディズニーランドの待ち時間情報
                   • 書籍 炎のAndroid開発道場
                        • チームで書いたちょっと変わった入門書


Wednesday, December 12, 12
Androidな活動


                   • アプリ 夢と魔法の待ち時間
                        • ディズニーランドの待ち時間情報
                   • 書籍 炎のAndroid開発道場
                        • チームで書いたちょっと変わった入門書


Wednesday, December 12, 12
Kotlinな活動

                   • Pull Request(標準ライブラリ)
                   • 解説/まとめ
                        •    プログラミングKotlin(仮)

                        •    ブログ 算譜王に俺はなる!!!!


                   • Advent Calendar
                        •    Kotlin Advent Calendar 2012(全部俺)




Wednesday, December 12, 12
Kotlinとは



Wednesday, December 12, 12
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
こんな言語
                   • 静的型付け
                   • オブジェクト指向
                   • 関数型プログラミング的
                   • JavaScriptへコンパイル可
                   • 産業利用目的
                   • Apache License 2.0
Wednesday, December 12, 12
簡単に言うと



                   •         簡潔
                   •         安全
Wednesday, December 12, 12
なんでKotlin?



Wednesday, December 12, 12
Javaェ…

                   • 互換性問題(レガシーへの対応)
                        •    StringBuffer、スレッドまわり

                        •    ジェネリクス何それ美味しいの?


                   • 型安全性(配列)
                   • 冗長な記述

Wednesday, December 12, 12
( ^o^) Kotlin使ってみるか




Wednesday, December 12, 12
(  )。o(待てよ.....
       Scalaでいいんじゃ)




Wednesday, December 12, 12
¦ JetBrains ¦ ┗(☋` )┓三




Wednesday, December 12, 12
( ◠◠ )☛ Scalaは複雑
                             Kotlinはシンプル



Wednesday, December 12, 12
▂▅▇█▓▒░('ω')░▒▓█▇▅▂
        うわああああああああああああ




Wednesday, December 12, 12
JVM言語のライバルたち


                   •         Scala
                        •    複雑(演算子オーバロード、暗黙の型変換)


                   •         Groovy
                        •    動的だからミスが生じやすい




Wednesday, December 12, 12
まぁ何でもトレードオフ
                    (例)
                   • 複雑だけど高機能
                   • 冗長だけど意味が明確
                   • シンプルだけど表現力が弱い
                   • 動的で柔軟だけど型安全保証なし

Wednesday, December 12, 12
Hello World
                             から見るKotlin


Wednesday, December 12, 12
package com.taroid.sample

               fun main(args : Array<String>) {

                         println("Hello, world!")

               }


Wednesday, December 12, 12
package com.taroid.sample
              名前空間レベルに関数                  型が変数名の後


               fun main(args : Array<String>) {

                         println("Hello, world!")

               }             セミコロン不要
                                          配列にジェネリクス



Wednesday, December 12, 12
型推論


                             val hoge : Int = 5

                             val hoge = 5


Wednesday, December 12, 12
型推論
                                       数値リテラルはInt型
                    ここのIntは冗長

                             val hoge : Int = 5

                             val hoge = 5
                                   コンパイラが型を推論


Wednesday, December 12, 12
配列がジェネリクス
                   // 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> = ints

Wednesday, December 12, 12
配列がジェネリクス
                // 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> = ints

Wednesday, December 12, 12
Brainf*ck
                             から見るKotlin


Wednesday, December 12, 12
Brainf*ckとは


                   • 難解プログラミング言語
                   • チューリング完全
                   • 単純な8つの命令語を持つ

Wednesday, December 12, 12
Brainf*ckの命令語
               >         ポインタを1増やす
               <         ポインタを1減らす
               +         ポインタが指す値を1増やす
               -        ポインタが指す値を1減らす
               [        ポインタが指す値が0なら対応する]へ飛ぶ
               ]        ポインタが指す値が0意外なら対応する[へ飛ぶ
               .       ポインタが指す値を出力する
               ,       ポインタが指す先へ1バイト入力する


Wednesday, December 12, 12
Brainf*ckのHelloWorld
               +++++++++[>+++++++
               +>+++++++++++>++++
               +<<<-]>.>++.+++++++..+
               ++.>-.------------.<+++++
               +++.--------.+
               +.------.--------.>+.
Wednesday, December 12, 12
この処理系を
                  Kotlinで実装したった


Wednesday, December 12, 12
実装を持てるインタフェース

              public trait Brainfxck {

                  public fun execute(source: String,
                   inputStream: InputStream = System.`in`,
                   outputStream: OutputStream = System.`out`)
              }
                               デフォルトのパラメータ



Wednesday, December 12, 12
object BrainfxckImpl : Brainfxck {

                    override public fun execute(source : String,
                      inputStream : InputStream,
                      outputStream : OutputStream) {
                        // do something
                    }
                }



Wednesday, December 12, 12
シングルトン                    トレイトの実装

                object BrainfxckImpl : Brainfxck {

                    override public fun execute(source : String,
                      inputStream : InputStream,
                      outputStream : OutputStream) {
                         アノテーション
                        // do something
                    }
                }



Wednesday, December 12, 12
private val incrementPointerOperator = {
                (runtimeState : RuntimeState) ->
                 runtimeState.incrementPointer()
              }
                          関数リテラルを変数に割り当てる

              private val decrementPointerOperator = {
                (runtimeState : RuntimeState) ->
                 runtimeState.decrementPointer()
              }

Wednesday, December 12, 12
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
 命令語(文字)と
                                                 操作(関数リテラル)を
           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
while (!runtimeState.isEndOfProgram()) {
        val code = runtimeState.getCurrentProgramCode()
        val operator = operators[code] ?: doNothingOperator
        operator(runtimeState)
        runtimeState.next()
      }




Wednesday, December 12, 12
マップに配列風アクセス
      while (!runtimeState.isEndOfProgram()) {
        val code = runtimeState.getCurrentProgramCode()
        val operator = operators[code] ?: doNothingOperator
        operator(runtimeState)
        runtimeState.next()
                          エルビス演算子
      }




Wednesday, December 12, 12
デモの前に


                        Brainf*ckの命令語を
                        別の文字列に置き換える




Wednesday, December 12, 12
イケメン仕様
     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
デモ



Wednesday, December 12, 12
適当に
                       ライブコーディング


Wednesday, December 12, 12
まとめ



Wednesday, December 12, 12
Kotlinまとめ

                   • 静的型付けJVM言語
                   • オブジェクト指向
                   • 関数型プログラミング的
                   • モダンで簡潔で安全
                   • かわいい
Wednesday, December 12, 12
ご清聴
                 ありがとうございました



                             @ngsw_taro

Wednesday, December 12, 12

Kotlinの紹介

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