SlideShare a Scribd company logo
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

More Related Content

Similar to Kotlinの紹介

セーラーソン振り返り
セーラーソン振り返りセーラーソン振り返り
セーラーソン振り返りMasafumi Terazono
 
「ほげエンジニア」の定義について #operationcasual
「ほげエンジニア」の定義について #operationcasual「ほげエンジニア」の定義について #operationcasual
「ほげエンジニア」の定義について #operationcasualSATOSHI TAGOMORI
 
Adkを使って音声コマンドで操作する戦車を作ってみた
Adkを使って音声コマンドで操作する戦車を作ってみたAdkを使って音声コマンドで操作する戦車を作ってみた
Adkを使って音声コマンドで操作する戦車を作ってみた
Yusuke Ohmichi
 
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloopI phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
Tomohiko Okita
 
Three.jsで3D気分
Three.jsで3D気分 Three.jsで3D気分
Three.jsで3D気分
Toshio Ehara
 
Donutsプロコンチャレンジ 2015 解説
Donutsプロコンチャレンジ 2015 解説Donutsプロコンチャレンジ 2015 解説
Donutsプロコンチャレンジ 2015 解説
kuno4n
 
Riak Source Code Reading #2: Erlang Client
Riak Source Code Reading #2: Erlang ClientRiak Source Code Reading #2: Erlang Client
Riak Source Code Reading #2: Erlang Clientnobu_k
 
SWIGでRubyバインディング
SWIGでRubyバインディングSWIGでRubyバインディング
SWIGでRubyバインディング
Yukimitsu Izawa
 
Unityハッカソン チームドミノ 発表用資料 2012.12
Unityハッカソン チームドミノ 発表用資料 2012.12Unityハッカソン チームドミノ 発表用資料 2012.12
Unityハッカソン チームドミノ 発表用資料 2012.12
takashi Ohsaka
 

Similar to Kotlinの紹介 (10)

セーラーソン振り返り
セーラーソン振り返りセーラーソン振り返り
セーラーソン振り返り
 
「ほげエンジニア」の定義について #operationcasual
「ほげエンジニア」の定義について #operationcasual「ほげエンジニア」の定義について #operationcasual
「ほげエンジニア」の定義について #operationcasual
 
Adkを使って音声コマンドで操作する戦車を作ってみた
Adkを使って音声コマンドで操作する戦車を作ってみたAdkを使って音声コマンドで操作する戦車を作ってみた
Adkを使って音声コマンドで操作する戦車を作ってみた
 
I phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloopI phone勉強会 2010_03_06_gameloop
I phone勉強会 2010_03_06_gameloop
 
Three.jsで3D気分
Three.jsで3D気分 Three.jsで3D気分
Three.jsで3D気分
 
Donutsプロコンチャレンジ 2015 解説
Donutsプロコンチャレンジ 2015 解説Donutsプロコンチャレンジ 2015 解説
Donutsプロコンチャレンジ 2015 解説
 
DevSap20120728
DevSap20120728DevSap20120728
DevSap20120728
 
Riak Source Code Reading #2: Erlang Client
Riak Source Code Reading #2: Erlang ClientRiak Source Code Reading #2: Erlang Client
Riak Source Code Reading #2: Erlang Client
 
SWIGでRubyバインディング
SWIGでRubyバインディングSWIGでRubyバインディング
SWIGでRubyバインディング
 
Unityハッカソン チームドミノ 発表用資料 2012.12
Unityハッカソン チームドミノ 発表用資料 2012.12Unityハッカソン チームドミノ 発表用資料 2012.12
Unityハッカソン チームドミノ 発表用資料 2012.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
  • 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
  • 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
  • 13. Javaェ… • 互換性問題(レガシーへの対応) • StringBuffer、スレッドまわり • ジェネリクス何それ美味しいの? • 型安全性(配列) • 冗長な記述 Wednesday, December 12, 12
  • 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
  • 44. 適当に ライブコーディング Wednesday, December 12, 12
  • 46. Kotlinまとめ • 静的型付けJVM言語 • オブジェクト指向 • 関数型プログラミング的 • モダンで簡潔で安全 • かわいい Wednesday, December 12, 12
  • 47. ご清聴 ありがとうございました @ngsw_taro Wednesday, December 12, 12