Your SlideShare is downloading. ×
Kotlin @ StrangeLoop 2011
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

Kotlin @ StrangeLoop 2011

677
views

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
677
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. The Kotlin Programming Language Andrey BreslavMonday, September 19, 2011
  • 2. What is Kotlin? 2Monday, September 19, 2011
  • 3. What is Kotlin? • Statically typed 2Monday, September 19, 2011
  • 4. What is Kotlin? • Statically typed • object-oriented 2Monday, September 19, 2011
  • 5. What is Kotlin? • Statically typed • object-oriented • JVM-targeted 2Monday, September 19, 2011
  • 6. What is Kotlin? • Statically typed • object-oriented • JVM-targeted • general-purpose 2Monday, September 19, 2011
  • 7. What is Kotlin? • Statically typed • object-oriented • JVM-targeted • general-purpose • programming language 2Monday, September 19, 2011
  • 8. What is Kotlin? • Statically typed • object-oriented • JVM-targeted • general-purpose • programming language • developed by JetBrains 2Monday, September 19, 2011
  • 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. 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. 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. Goal-wise... 3Monday, September 19, 2011
  • 13. Goal-wise... • Number of research papers we are planning to publish on Kotlin is 3Monday, September 19, 2011
  • 14. Goal-wise... • Number of research papers we are planning to publish on Kotlin is ➡ Zero 3Monday, September 19, 2011
  • 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. Outline • Motivation • Feature overview • Basic syntax • Classes and Types • Higher-order functions • Type-safe Groovy-style Builders 4Monday, September 19, 2011
  • 17. Motivation 5Monday, September 19, 2011
  • 18. Motivation • Why a new language? 5Monday, September 19, 2011
  • 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. 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. 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. 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. 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. 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. 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. Feature overview 6Monday, September 19, 2011
  • 27. Feature overview • Language features 6Monday, September 19, 2011
  • 28. Feature overview • Language features ➡ Static null-safety guarantees 6Monday, September 19, 2011
  • 29. Feature overview • Language features ➡ Static null-safety guarantees ➡ Higher-order functions ("closures") 6Monday, September 19, 2011
  • 30. Feature overview • Language features ➡ Static null-safety guarantees ➡ Higher-order functions ("closures") ➡ Traits & First-class delegation 6Monday, September 19, 2011
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. Code examples • Functions • Java interoperability • String templates • Local variables • Type inference • Extension functions and properties • Null-safety 7Monday, September 19, 2011
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Lock example (I) myLock.lock() try { // Do something } finally { myLock.unlock() } 24Monday, September 19, 2011
  • 58. Lock example (II) lock(myLock) { // Do something } fun lock(l : Lock, body : fun () : Unit) 25Monday, September 19, 2011
  • 59. Lock example (III) inline fun lock(l : Lock, body : fun () : Unit) { myLock.lock() try { body() } finally { myLock.unlock() } } 26Monday, September 19, 2011
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Resources • Documentation: ➡ http://jetbrains.com/kotlin • Blog: ➡ http://blog.jetbrains.com/kotlin • Twitter: ➡ @project_kotlin ➡ @abreslav 38Monday, September 19, 2011