Your SlideShare is downloading. ×
0
The Kotlin               Programming Language                             Andrey BreslavMonday, September 19, 2011
What is Kotlin?                             2Monday, September 19, 2011
What is Kotlin?                   •         Statically typed                                                2Monday, Septe...
What is Kotlin?                   •         Statically typed                   •         object-oriented                  ...
What is Kotlin?                   •         Statically typed                   •         object-oriented                  ...
What is Kotlin?                   •         Statically typed                   •         object-oriented                  ...
What is Kotlin?                   •         Statically typed                   •         object-oriented                  ...
What is Kotlin?                   •         Statically typed                   •         object-oriented                  ...
What is Kotlin?                   •         Statically typed                   •         object-oriented                  ...
What is Kotlin?                   •         Statically typed                   •         object-oriented                  ...
What is Kotlin?                   •         Statically typed                   •         object-oriented                  ...
Goal-wise...                              3Monday, September 19, 2011
Goal-wise...                   • Number of research papers we are                             planning to publish on Kotli...
Goal-wise...                   • Number of research papers we are                             planning to publish on Kotli...
Goal-wise...                   • Number of research papers we are                             planning to publish on Kotli...
Outline                   • Motivation                   • Feature overview                   • Basic syntax              ...
Motivation                             5Monday, September 19, 2011
Motivation                   •         Why a new language?                                                   5Monday, Sept...
Motivation                   •         Why a new language?                         ➡     We are not satisfied with the exi...
Motivation                   •         Why a new language?                         ➡     We are not satisfied with the exi...
Motivation                   •         Why a new language?                         ➡     We are not satisfied with the exi...
Motivation                   •         Why a new language?                         ➡     We are not satisfied with the exi...
Motivation                   •         Why a new language?                         ➡     We are not satisfied with the exi...
Motivation                   •         Why a new language?                         ➡     We are not satisfied with the exi...
Motivation                   •         Why a new language?                         ➡     We are not satisfied with the exi...
Feature overview                             6Monday, September 19, 2011
Feature overview                   •         Language features                                                 6Monday, Se...
Feature overview                   •         Language features                         ➡      Static null-safety guarantee...
Feature overview                   •         Language features                         ➡      Static null-safety guarantee...
Feature overview                   •         Language features                         ➡      Static null-safety guarantee...
Feature overview                   •         Language features                         ➡      Static null-safety guarantee...
Feature overview                   •         Language features                         ➡      Static null-safety guarantee...
Feature overview                   •         Language features                         ➡      Static null-safety guarantee...
Feature overview                   •         Language features                         ➡      Static null-safety guarantee...
Feature overview                   •         Language features                         ➡      Static null-safety guarantee...
Feature overview                   •         Language features                         ➡      Static null-safety guarantee...
Feature overview                   •         Language features                         ➡      Static null-safety guarantee...
Feature overview                   •         Language features                         ➡      Static null-safety guarantee...
Feature overview                   •         Language features                         ➡      Static null-safety guarantee...
Code examples                   •         Functions                   •         Java interoperability                   • ...
Hello, world!               namespace hello               fun main(args : Array<String>) : Unit {                 println(...
Hello, <names>!               fun main(args : Array<String>) {                   var names : String = ""                  ...
Hello, <names>! (Faster version)               fun main(args : Array<String>) {                   val names = StringBuilde...
Hello, <names>! (Realistic version)               fun main(args : Array<String>) {                   println("Hello, ${arg...
join() and forit()               fun <T> Iterable<T>.join(separator : String) : String {                   val names = Str...
Null-safety               fun parseInt(s      : String) : Int? {                   try {                       return     ...
Types                                                         Syntax                                       Class types    ...
Mapping to Java types                              Kotlin   GEN    Java     LOAD      Kotlin                              ...
Automatic casts and When               fun foo(obj : Any?) {                   if (obj is String) {                     ob...
More on when-expressions               fun bar(x : Int) {                   when (x) {                       0 => "Zero"  ...
Classes                        open class Parent(p : Bar) {                            open fun foo() {}                  ...
Traits               trait T1 : Class1, OtherTrait {                    // No state               }               class Fo...
Disambiguation               trait A {                    fun foo() : Int = 1 // open by default               }          ...
First-class functions                   •         Functions                         ➡     fun f(p : Int) : String         ...
Higher-order functions                  fun <T> filter(                            c : Iterable<T>,                       ...
Infix function calls: "LINQ"                  a.contains(b)                  // is the same as                  a contains...
Lock example (I)               myLock.lock()               try {                    // Do something               }       ...
Lock example (II)               lock(myLock) {                    // Do something               }               fun lock(l...
Lock example (III)               inline fun lock(l : Lock, body : fun () : Unit) {                    myLock.lock()       ...
Extension functions                   •         Functions                         ➡     fun Foo.f(p : Int) : String       ...
Builders in Groovy               html {                     head {                         title "XML encoding with Groovy...
Builders in Kotlin               html {                     head {                         title { +"XML encoding with Kot...
Builders: Implementation (I)                   •         Function definition                             fun html(init : f...
Builders: Implementation (II)                   •         Function definition                             fun html(init : ...
Builders: Implementation (III)               abstract class Tag(val name : String) : Element {                   val child...
Builders in Kotlin               html {                     head {                         title { +"XML encoding with Kot...
Generics: Invariance               class List<T> {                     fun add(t : T)                     fun get(index : ...
Generics: Invariance               class List<T> {                     fun add(t : T)                     fun get(index : ...
Generics: Declaration-site variance               class List<T> {           List<Int> >:< List<Any>                   fun ...
Generics: Declaration-site variance               class List<T> {           List<Int> >:< List<Any>                   fun ...
Generics: Declaration-site variance               class List<T> {           List<Int> >:< List<Any>                   fun ...
Generics: Use-site variance               val ints = List<Int>()               val anysOut : List<out Any> = ints         ...
Generics: Use-site variance               val ints = List<Int>()               val anysOut : List<out Any> = ints         ...
Reified generics                   • Type information in retained at runtime                         ➡   foo is List<T>   ...
Resources                   • Documentation:                         ➡   http://jetbrains.com/kotlin                   • B...
Upcoming SlideShare
Loading in...5
×

Kotlin @ StrangeLoop 2011

733

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
733
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Kotlin @ StrangeLoop 2011"

  1. 1. The Kotlin Programming Language Andrey BreslavMonday, September 19, 2011
  2. 2. What is Kotlin? 2Monday, September 19, 2011
  3. 3. What is Kotlin? • Statically typed 2Monday, September 19, 2011
  4. 4. What is Kotlin? • Statically typed • object-oriented 2Monday, September 19, 2011
  5. 5. What is Kotlin? • Statically typed • object-oriented • JVM-targeted 2Monday, September 19, 2011
  6. 6. What is Kotlin? • Statically typed • object-oriented • JVM-targeted • general-purpose 2Monday, September 19, 2011
  7. 7. What is Kotlin? • Statically typed • object-oriented • JVM-targeted • general-purpose • programming language 2Monday, September 19, 2011
  8. 8. What is Kotlin? • Statically typed • object-oriented • JVM-targeted • general-purpose • programming language • developed by JetBrains 2Monday, September 19, 2011
  9. 9. What is Kotlin? • Statically typed • object-oriented • JVM-targeted • general-purpose • programming language • developed by JetBrains ➡ intended for industrial use 2Monday, September 19, 2011
  10. 10. What is Kotlin? • Statically typed • object-oriented • JVM-targeted • general-purpose • programming language • developed by JetBrains ➡ intended for industrial use • Docs available today 2Monday, September 19, 2011
  11. 11. What is Kotlin? • Statically typed • object-oriented • JVM-targeted • general-purpose • programming language • developed by JetBrains ➡ intended for industrial use • Docs available today • Public beta is planned for the end of 2011 2Monday, September 19, 2011
  12. 12. Goal-wise... 3Monday, September 19, 2011
  13. 13. Goal-wise... • Number of research papers we are planning to publish on Kotlin is 3Monday, September 19, 2011
  14. 14. Goal-wise... • Number of research papers we are planning to publish on Kotlin is ➡ Zero 3Monday, September 19, 2011
  15. 15. Goal-wise... • Number of research papers we are planning to publish on Kotlin is ➡ Zero ➡ ... or really close to that 3Monday, September 19, 2011
  16. 16. Outline • Motivation • Feature overview • Basic syntax • Classes and Types • Higher-order functions • Type-safe Groovy-style Builders 4Monday, September 19, 2011
  17. 17. Motivation 5Monday, September 19, 2011
  18. 18. Motivation • Why a new language? 5Monday, September 19, 2011
  19. 19. Motivation • Why a new language? ➡ We are not satisfied with the existing ones ➡ And we have had a close look at many of them over 10 years 5Monday, September 19, 2011
  20. 20. Motivation • Why a new language? ➡ We are not satisfied with the existing ones ➡ And we have had a close look at many of them over 10 years • Design goals 5Monday, September 19, 2011
  21. 21. Motivation • Why a new language? ➡ We are not satisfied with the existing ones ➡ And we have had a close look at many of them over 10 years • Design goals ➡ Full Java interoperability 5Monday, September 19, 2011
  22. 22. Motivation • Why a new language? ➡ We are not satisfied with the existing ones ➡ And we have had a close look at many of them over 10 years • Design goals ➡ Full Java interoperability ➡ Compiles as fast as Java 5Monday, September 19, 2011
  23. 23. Motivation • Why a new language? ➡ We are not satisfied with the existing ones ➡ And we have had a close look at many of them over 10 years • Design goals ➡ Full Java interoperability ➡ Compiles as fast as Java ➡ Safer than Java 5Monday, September 19, 2011
  24. 24. Motivation • Why a new language? ➡ We are not satisfied with the existing ones ➡ And we have had a close look at many of them over 10 years • Design goals ➡ Full Java interoperability ➡ Compiles as fast as Java ➡ Safer than Java ➡ More concise than Java 5Monday, September 19, 2011
  25. 25. Motivation • Why a new language? ➡ We are not satisfied with the existing ones ➡ And we have had a close look at many of them over 10 years • Design goals ➡ Full Java interoperability ➡ Compiles as fast as Java ➡ Safer than Java ➡ More concise than Java ➡ Way simpler than Scala 5Monday, September 19, 2011
  26. 26. Feature overview 6Monday, September 19, 2011
  27. 27. Feature overview • Language features 6Monday, September 19, 2011
  28. 28. Feature overview • Language features ➡ Static null-safety guarantees 6Monday, September 19, 2011
  29. 29. Feature overview • Language features ➡ Static null-safety guarantees ➡ Higher-order functions ("closures") 6Monday, September 19, 2011
  30. 30. Feature overview • Language features ➡ Static null-safety guarantees ➡ Higher-order functions ("closures") ➡ Traits & First-class delegation 6Monday, September 19, 2011
  31. 31. Feature overview • Language features ➡ Static null-safety guarantees ➡ Higher-order functions ("closures") ➡ Traits & First-class delegation ➡ Properties (no fields) 6Monday, September 19, 2011
  32. 32. Feature overview • Language features ➡ Static null-safety guarantees ➡ Higher-order functions ("closures") ➡ Traits & First-class delegation ➡ Properties (no fields) ➡ Reified generics 6Monday, September 19, 2011
  33. 33. Feature overview • Language features ➡ Static null-safety guarantees ➡ Higher-order functions ("closures") ➡ Traits & First-class delegation ➡ Properties (no fields) ➡ Reified generics ➡ Declaration-site variance & "Type projections" 6Monday, September 19, 2011
  34. 34. Feature overview • Language features ➡ Static null-safety guarantees ➡ Higher-order functions ("closures") ➡ Traits & First-class delegation ➡ Properties (no fields) ➡ Reified generics ➡ Declaration-site variance & "Type projections" ➡ Extension functions 6Monday, September 19, 2011
  35. 35. Feature overview • Language features ➡ Static null-safety guarantees ➡ Higher-order functions ("closures") ➡ Traits & First-class delegation ➡ Properties (no fields) ➡ Reified generics ➡ Declaration-site variance & "Type projections" ➡ Extension functions ➡ Modules and Build infrastructure 6Monday, September 19, 2011
  36. 36. Feature overview • Language features ➡ Static null-safety guarantees ➡ Higher-order functions ("closures") ➡ Traits & First-class delegation ➡ Properties (no fields) ➡ Reified generics ➡ Declaration-site variance & "Type projections" ➡ Extension functions ➡ Modules and Build infrastructure ➡ Inline-functions (zero-overhead closures) 6Monday, September 19, 2011
  37. 37. Feature overview • Language features ➡ Static null-safety guarantees ➡ Higher-order functions ("closures") ➡ Traits & First-class delegation ➡ Properties (no fields) ➡ Reified generics ➡ Declaration-site variance & "Type projections" ➡ Extension functions ➡ Modules and Build infrastructure ➡ Inline-functions (zero-overhead closures) ➡ Pattern matching 6Monday, September 19, 2011
  38. 38. Feature overview • Language features ➡ Static null-safety guarantees ➡ Higher-order functions ("closures") ➡ Traits & First-class delegation ➡ Properties (no fields) ➡ Reified generics ➡ Declaration-site variance & "Type projections" ➡ Extension functions ➡ Modules and Build infrastructure ➡ Inline-functions (zero-overhead closures) ➡ Pattern matching ➡ ... 6Monday, September 19, 2011
  39. 39. Feature overview • Language features ➡ Static null-safety guarantees ➡ Higher-order functions ("closures") ➡ Traits & First-class delegation ➡ Properties (no fields) ➡ Reified generics ➡ Declaration-site variance & "Type projections" ➡ Extension functions ➡ Modules and Build infrastructure ➡ Inline-functions (zero-overhead closures) ➡ Pattern matching ➡ ... • Full-featured IDE by JetBrains from the very beginning 6Monday, September 19, 2011
  40. 40. Code examples • Functions • Java interoperability • String templates • Local variables • Type inference • Extension functions and properties • Null-safety 7Monday, September 19, 2011
  41. 41. Hello, world! namespace hello fun main(args : Array<String>) : Unit { println("Hello, world!") } fun println(message : String) { System.out?.println(message) } 8Monday, September 19, 2011
  42. 42. Hello, <names>! fun main(args : Array<String>) { var names : String = "" for (i in args.indices) { names += args[i] if (i + 1 < args.size) names += ", " } println("Hello, $names!") } val Array<*>.indices : Iterable<Int> get() = IntRange<Int>(0, size - 1) 9Monday, September 19, 2011
  43. 43. Hello, <names>! (Faster version) fun main(args : Array<String>) { val names = StringBuilder() for (i in args.indices) { names += args[i] if (i + 1 < args.size) names += ", " } println("Hello, $names!") } fun StringBuilder.plusAssign(s : String) { this.append(s) } 10Monday, September 19, 2011
  44. 44. Hello, <names>! (Realistic version) fun main(args : Array<String>) { println("Hello, ${args.join(", ")}!") } fun <T> Iterable<T>.join(separator : String) : String { val names = StringBuilder() forit (this) { names += it.next() if (it.hasNext()) names += separator } return names.toString() } 11Monday, September 19, 2011
  45. 45. join() and forit() fun <T> Iterable<T>.join(separator : String) : String { val names = StringBuilder() forit (this) { names += it.next() if (it.hasNext()) names += separator } return names.toString() } fun <T> forit(col : Iterable<T>, f : fun(Iterator<T>) : Unit) { val it = col.iterator() while (it.hasNext()) { f(it) } } 12Monday, September 19, 2011
  46. 46. Null-safety fun parseInt(s : String) : Int? { try { return Integer.parseInt(s) } catch (e : NumberFormatException) { return null } } fun main(args : Array<String>) { val x = parseInt("123") val y = parseInt("Hello") print(x?.times(2)) // Cant say: print(x * 2) if (x != null) { print(x * 2) } } 13Monday, September 19, 2011
  47. 47. Types Syntax Class types List<Foo> Nullable types Foo? Function types fun (Int) : String Tuple types (Double, Double) Self type This Special types Top Any? Bottom Nothing No meaningful return value Unit 14Monday, September 19, 2011
  48. 48. Mapping to Java types Kotlin GEN Java LOAD Kotlin Any Object Any? Unit void Unit Int int Int Int? Integer Int? String String String? Array<Foo> Foo[] Array<Foo?>? Array<Int> int[] Array<Int>? Nothing - - Foo Foo Foo? 15Monday, September 19, 2011
  49. 49. Automatic casts and When fun foo(obj : Any?) { if (obj is String) { obj.get(0) } when (obj) { is String => obj.get(0) is Int => obj.plus(1) !is Boolean => null } } 16Monday, September 19, 2011
  50. 50. More on when-expressions fun bar(x : Int) { when (x) { 0 => "Zero" 1, 2, 3 => "1, 2 or 3" x + 1 => "Really strange" in 10..100 => "In range" !in 100..1000 => "Out of range" } } 17Monday, September 19, 2011
  51. 51. Classes open class Parent(p : Bar) { open fun foo() {} fun bar() {} } class Child(p : Bar) : Parent(p) { override fun foo() {} } • Any is the default supertype • Constructors must initialize supertypes • Final by default, explicit override annotations 18Monday, September 19, 2011
  52. 52. Traits trait T1 : Class1, OtherTrait { // No state } class Foo(p : Bar) : Class1(p), T1, T2 { ... } class Decorator(p : T2) : Class2, T2 by p { ... } 19Monday, September 19, 2011
  53. 53. Disambiguation trait A { fun foo() : Int = 1 // open by default } open class B() { open fun foo() : Int = 2 } class C() : B(), A { override fun foo() = super<A>.foo() } 20Monday, September 19, 2011
  54. 54. First-class functions • Functions ➡ fun f(p : Int) : String • Function types ➡ fun (p : Int) : String ➡ fun (Int) : String • Function literals ➡ {p => p.toString()} ➡ {(p : Int) => p.toString()} ➡ {(p : Int) : String => p.toString()} 21Monday, September 19, 2011
  55. 55. Higher-order functions fun <T> filter( c : Iterable<T>, f : fun(T) : Boolean) : Iterable<T> • filter(list, {s => s.length < 3}) ➡ Sugar: last function literal argument ✦ filter(list) {s => s.length < 3} ➡ Sugar: one-parameter function literal ✦ filter(list) { it.length < 3 } 22Monday, September 19, 2011
  56. 56. Infix function calls: "LINQ" a.contains(b) // is the same as a contains b users filter { it hasPrivilege WRITE } map { it => it.fullName } orderBy { lastName } 23Monday, September 19, 2011
  57. 57. Lock example (I) myLock.lock() try { // Do something } finally { myLock.unlock() } 24Monday, September 19, 2011
  58. 58. Lock example (II) lock(myLock) { // Do something } fun lock(l : Lock, body : fun () : Unit) 25Monday, September 19, 2011
  59. 59. Lock example (III) inline fun lock(l : Lock, body : fun () : Unit) { myLock.lock() try { body() } finally { myLock.unlock() } } 26Monday, September 19, 2011
  60. 60. Extension functions • Functions ➡ fun Foo.f(p : Int) : String • Function types ➡ fun Foo.(p : Int) : String ➡ fun Foo.(Int) : String • Function literals ➡ {Foo.(p : Int) => this.toString()} ➡ {Foo.(p : Int) : String => this.toString()} 27Monday, September 19, 2011
  61. 61. Builders in Groovy html { head { title "XML encoding with Groovy" } body { h1 "XML encoding with Groovy" p "this format can be used as an alternative markup to XML" /* an element with attributes and text content */ ahref:http://groovy.codehaus.org ["Groovy"] } } 28Monday, September 19, 2011
  62. 62. Builders in Kotlin html { head { title { +"XML encoding with Kotlin" } } body { h1 { +"XML encoding with Kotlin" } p { +"this format is now type-safe" } /* an element with attributes and text content */ a(href="http://jetbrains.com/kotlin") { +"Kotlin" } } } 29Monday, September 19, 2011
  63. 63. Builders: Implementation (I) • Function definition fun html(init : fun HTML.() : Unit) : HTML { val html = HTML() html.init() return html } • Usage html { this.head { ... } } 30Monday, September 19, 2011
  64. 64. Builders: Implementation (II) • Function definition fun html(init : fun HTML.() : Unit) : HTML { val html = HTML() html.init() return html } • Usage html { head { ... } } 31Monday, September 19, 2011
  65. 65. Builders: Implementation (III) abstract class Tag(val name : String) : Element { val children = ArrayList<Element>() val attributes = HashMap<String, String>() } abstract class TagWithText(name : String) : Tag(name) { fun String.plus() { children.add(TextElement(this)) } } class HTML() : TagWithText("html") { fun head(init : fun Head.() : Unit) { } fun body(init : fun Body.() : Unit) { } } 32Monday, September 19, 2011
  66. 66. Builders in Kotlin html { head { title { +"XML encoding with Kotlin" } } body { h1 { +"XML encoding with Kotlin" } p { +"this format is now type-safe" } /* an element with attributes and text content */ a(href="http://jetbrains.com/kotlin") { +"Kotlin" } } } 33Monday, September 19, 2011
  67. 67. Generics: Invariance class List<T> { fun add(t : T) fun get(index : Int) : T } val ints = List<Int>() val anys : List<Any> = ints anys.add("1") // Cause of the problem val i : Int = ints.get(0) // !!! 34Monday, September 19, 2011
  68. 68. Generics: Invariance class List<T> { fun add(t : T) fun get(index : Int) : T } val ints = List<Int>() val anys : List<Any> = ints anys.add("1") // Cause of the problem val i : Int = ints.get(0) // !!! 34Monday, September 19, 2011
  69. 69. Generics: Declaration-site variance class List<T> { List<Int> >:< List<Any> fun add(t : T) val ints = List<Int>() fun get() : T val anys : List<Any> = ints } class Producer<out T> { val ints = Producer<Int>() fun get() : T val anys : Producer<Any> = ints } class Consumer<in T> { val anys = Consumer<Any>() fun add(t : T) val ints : Consumer<Int> = anys } 35Monday, September 19, 2011
  70. 70. Generics: Declaration-site variance class List<T> { List<Int> >:< List<Any> fun add(t : T) val ints = List<Int>() fun get() : T val anys : List<Any> = ints } class Producer<out T> { val ints = Producer<Int>() fun get() : T val anys : Producer<Any> = ints } class Consumer<in T> { val anys = Consumer<Any>() fun add(t : T) val ints : Consumer<Int> = anys } 35Monday, September 19, 2011
  71. 71. Generics: Declaration-site variance class List<T> { List<Int> >:< List<Any> fun add(t : T) val ints = List<Int>() fun get() : T val anys : List<Any> = ints } class Producer<out T> { val ints = Producer<Int>() fun get() : T val anys : Producer<Any> = ints } class Consumer<in T> { val anys = Consumer<Any>() fun add(t : T) val ints : Consumer<Int> = anys } 35Monday, September 19, 2011
  72. 72. Generics: Use-site variance val ints = List<Int>() val anysOut : List<out Any> = ints anysOut.add("1") // Not available val i : Int = ints.get() // No problem 36Monday, September 19, 2011
  73. 73. Generics: Use-site variance val ints = List<Int>() val anysOut : List<out Any> = ints anysOut.add("1") // Not available val i : Int = ints.get() // No problem val anys = List<Any>() val intsIn : List<in Int> = anys intsIn.add(0) val obj = intsIn.get() // : Any? 36Monday, September 19, 2011
  74. 74. Reified generics • Type information in retained at runtime ➡ foo is List<T> ➡ Array<T>(3) ➡ T.create() • Java types are still erased ➡ foo is java.util.List<*> 37Monday, September 19, 2011
  75. 75. Resources • Documentation: ➡ http://jetbrains.com/kotlin • Blog: ➡ http://blog.jetbrains.com/kotlin • Twitter: ➡ @project_kotlin ➡ @abreslav 38Monday, September 19, 2011
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×