Kotlin @ StrangeLoop 2011

75
The Kotlin Programming Language Andrey Breslav Monday, September 19, 2011

Transcript of Kotlin @ StrangeLoop 2011

Page 1: Kotlin @ StrangeLoop 2011

The Kotlin Programming Language

Andrey Breslav

Monday, September 19, 2011

Page 2: Kotlin @ StrangeLoop 2011

What is Kotlin?

2

Monday, September 19, 2011

Page 3: Kotlin @ StrangeLoop 2011

What is Kotlin?• Statically typed

2

Monday, September 19, 2011

Page 4: Kotlin @ StrangeLoop 2011

What is Kotlin?• Statically typed

• object-oriented

2

Monday, September 19, 2011

Page 5: Kotlin @ StrangeLoop 2011

What is Kotlin?• Statically typed

• object-oriented

• JVM-targeted

2

Monday, September 19, 2011

Page 6: Kotlin @ StrangeLoop 2011

What is Kotlin?• Statically typed

• object-oriented

• JVM-targeted

• general-purpose

2

Monday, September 19, 2011

Page 7: Kotlin @ StrangeLoop 2011

What is Kotlin?• Statically typed

• object-oriented

• JVM-targeted

• general-purpose

• programming language

2

Monday, September 19, 2011

Page 8: Kotlin @ StrangeLoop 2011

What is Kotlin?• Statically typed

• object-oriented

• JVM-targeted

• general-purpose

• programming language

• developed by JetBrains

2

Monday, September 19, 2011

Page 9: Kotlin @ StrangeLoop 2011

What is Kotlin?• Statically typed

• object-oriented

• JVM-targeted

• general-purpose

• programming language

• developed by JetBrains➡ intended for industrial use

2

Monday, September 19, 2011

Page 10: Kotlin @ StrangeLoop 2011

What is Kotlin?• Statically typed

• object-oriented

• JVM-targeted

• general-purpose

• programming language

• developed by JetBrains➡ intended for industrial use

• Docs available today

2

Monday, September 19, 2011

Page 11: Kotlin @ StrangeLoop 2011

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

2

Monday, September 19, 2011

Page 12: Kotlin @ StrangeLoop 2011

Goal-wise...

3

Monday, September 19, 2011

Page 13: Kotlin @ StrangeLoop 2011

Goal-wise...

• Number of research papers we are planning to publish on Kotlin is

3

Monday, September 19, 2011

Page 14: Kotlin @ StrangeLoop 2011

Goal-wise...

• Number of research papers we are planning to publish on Kotlin is➡ Zero

3

Monday, September 19, 2011

Page 15: Kotlin @ StrangeLoop 2011

Goal-wise...

• Number of research papers we are planning to publish on Kotlin is➡ Zero

➡ ... or really close to that

3

Monday, September 19, 2011

Page 16: Kotlin @ StrangeLoop 2011

Outline

• Motivation

• Feature overview

• Basic syntax

• Classes and Types

• Higher-order functions

• Type-safe Groovy-style Builders

4

Monday, September 19, 2011

Page 17: Kotlin @ StrangeLoop 2011

Motivation

5

Monday, September 19, 2011

Page 18: Kotlin @ StrangeLoop 2011

Motivation• Why a new language?

5

Monday, September 19, 2011

Page 19: Kotlin @ StrangeLoop 2011

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

5

Monday, September 19, 2011

Page 20: Kotlin @ StrangeLoop 2011

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

5

Monday, September 19, 2011

Page 21: Kotlin @ StrangeLoop 2011

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

5

Monday, September 19, 2011

Page 22: Kotlin @ StrangeLoop 2011

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

5

Monday, September 19, 2011

Page 23: Kotlin @ StrangeLoop 2011

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

5

Monday, September 19, 2011

Page 24: Kotlin @ StrangeLoop 2011

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

5

Monday, September 19, 2011

Page 25: Kotlin @ StrangeLoop 2011

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 Scala5

Monday, September 19, 2011

Page 26: Kotlin @ StrangeLoop 2011

Feature overview

6

Monday, September 19, 2011

Page 27: Kotlin @ StrangeLoop 2011

Feature overview• Language features

6

Monday, September 19, 2011

Page 28: Kotlin @ StrangeLoop 2011

Feature overview• Language features

➡ Static null-safety guarantees

6

Monday, September 19, 2011

Page 29: Kotlin @ StrangeLoop 2011

Feature overview• Language features

➡ Static null-safety guarantees

➡ Higher-order functions ("closures")

6

Monday, September 19, 2011

Page 30: Kotlin @ StrangeLoop 2011

Feature overview• Language features

➡ Static null-safety guarantees

➡ Higher-order functions ("closures")

➡ Traits & First-class delegation

6

Monday, September 19, 2011

Page 31: Kotlin @ StrangeLoop 2011

Feature overview• Language features

➡ Static null-safety guarantees

➡ Higher-order functions ("closures")

➡ Traits & First-class delegation

➡ Properties (no fields)

6

Monday, September 19, 2011

Page 32: Kotlin @ StrangeLoop 2011

Feature overview• Language features

➡ Static null-safety guarantees

➡ Higher-order functions ("closures")

➡ Traits & First-class delegation

➡ Properties (no fields)

➡ Reified generics

6

Monday, September 19, 2011

Page 33: Kotlin @ StrangeLoop 2011

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"

6

Monday, September 19, 2011

Page 34: Kotlin @ StrangeLoop 2011

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

6

Monday, September 19, 2011

Page 35: Kotlin @ StrangeLoop 2011

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

6

Monday, September 19, 2011

Page 36: Kotlin @ StrangeLoop 2011

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)

6

Monday, September 19, 2011

Page 37: Kotlin @ StrangeLoop 2011

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

6

Monday, September 19, 2011

Page 38: Kotlin @ StrangeLoop 2011

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

➡ ...

6

Monday, September 19, 2011

Page 39: Kotlin @ StrangeLoop 2011

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

6

Monday, September 19, 2011

Page 40: Kotlin @ StrangeLoop 2011

Code examples

7

• Functions

• Java interoperability

• String templates

• Local variables

• Type inference

• Extension functions and properties

• Null-safety

Monday, September 19, 2011

Page 41: Kotlin @ StrangeLoop 2011

Hello, world!namespace hello

fun main(args : Array<String>) : Unit { println("Hello, world!")}

fun println(message : String) { System.out?.println(message)}

8

Monday, September 19, 2011

Page 42: Kotlin @ StrangeLoop 2011

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)

9

Monday, September 19, 2011

Page 43: Kotlin @ StrangeLoop 2011

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)}

10

Monday, September 19, 2011

Page 44: Kotlin @ StrangeLoop 2011

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()}

11

Monday, September 19, 2011

Page 45: Kotlin @ StrangeLoop 2011

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) }}

12

Monday, September 19, 2011

Page 46: Kotlin @ StrangeLoop 2011

Null-safetyfun 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)) // Can't say: print(x * 2)

if (x != null) { print(x * 2) }}

13

Monday, September 19, 2011

Page 47: Kotlin @ StrangeLoop 2011

Types

14

SyntaxSyntax

Class types List<Foo>

Nullable types Foo?

Function types fun (Int) : String

Tuple types (Double, Double)

Self type This

Special typesSpecial types

Top Any?

Bottom Nothing

No meaningful return value Unit

Monday, September 19, 2011

Page 48: Kotlin @ StrangeLoop 2011

Mapping to Java types

15

Kotlin Java 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?

GEN LOAD

Monday, September 19, 2011

Page 49: Kotlin @ StrangeLoop 2011

Automatic casts and Whenfun 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 }}

16

Monday, September 19, 2011

Page 50: Kotlin @ StrangeLoop 2011

More on when-expressionsfun 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" }}

17

Monday, September 19, 2011

Page 51: Kotlin @ StrangeLoop 2011

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

18

Monday, September 19, 2011

Page 52: Kotlin @ StrangeLoop 2011

Traitstrait T1 : Class1, OtherTrait {

// No state

}

class Foo(p : Bar) : Class1(p), T1, T2 { ...

}

class Decorator(p : T2) : Class2, T2 by p {

...

}

19

Monday, September 19, 2011

Page 53: Kotlin @ StrangeLoop 2011

Disambiguationtrait 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()

}

20

Monday, September 19, 2011

Page 54: Kotlin @ StrangeLoop 2011

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()}

21

Monday, September 19, 2011

Page 55: Kotlin @ StrangeLoop 2011

Higher-order functionsfun <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 }

22

Monday, September 19, 2011

Page 56: Kotlin @ StrangeLoop 2011

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 }

23

Monday, September 19, 2011

Page 57: Kotlin @ StrangeLoop 2011

Lock example (I)myLock.lock()

try {

// Do something

}

finally {

myLock.unlock()

}

24

Monday, September 19, 2011

Page 58: Kotlin @ StrangeLoop 2011

Lock example (II)

lock(myLock) {

// Do something

}

fun lock(l : Lock, body : fun () : Unit)

25

Monday, September 19, 2011

Page 59: Kotlin @ StrangeLoop 2011

Lock example (III)inline fun lock(l : Lock, body : fun () : Unit) {

myLock.lock()

try {

body()

}

finally {

myLock.unlock()

}

}

26

Monday, September 19, 2011

Page 60: Kotlin @ StrangeLoop 2011

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()}

27

Monday, September 19, 2011

Page 61: Kotlin @ StrangeLoop 2011

Builders in Groovyhtml {

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"]

}

}

28

Monday, September 19, 2011

Page 62: Kotlin @ StrangeLoop 2011

Builders in Kotlinhtml {

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" }

}

}

29

Monday, September 19, 2011

Page 63: Kotlin @ StrangeLoop 2011

Builders: Implementation (I)• Function definition

fun html(init : fun HTML.() : Unit) : HTML { val html = HTML() html.init() return html}

• Usage

html { this.head { ... }}

30

Monday, September 19, 2011

Page 64: Kotlin @ StrangeLoop 2011

Builders: Implementation (II)• Function definition

fun html(init : fun HTML.() : Unit) : HTML { val html = HTML() html.init() return html}

• Usage

html { head { ... }}

31

Monday, September 19, 2011

Page 65: Kotlin @ StrangeLoop 2011

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) { }}

32

Monday, September 19, 2011

Page 66: Kotlin @ StrangeLoop 2011

Builders in Kotlinhtml {

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" }

}

}

33

Monday, September 19, 2011

Page 67: Kotlin @ StrangeLoop 2011

Generics: Invarianceclass 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) // !!!

34

Monday, September 19, 2011

Page 68: Kotlin @ StrangeLoop 2011

Generics: Invarianceclass 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) // !!!

34

Monday, September 19, 2011

Page 69: Kotlin @ StrangeLoop 2011

Generics: Declaration-site variance

class List<T> {

fun add(t : T)

fun get() : T

}

class Producer<out T> {

fun get() : T

}

class Consumer<in T> {

fun add(t : T)

}

List<Int> >:< List<Any>

val ints = List<Int>()

val anys : List<Any> = ints

val ints = Producer<Int>()

val anys : Producer<Any> = ints

val anys = Consumer<Any>()

val ints : Consumer<Int> = anys

35

Monday, September 19, 2011

Page 70: Kotlin @ StrangeLoop 2011

Generics: Declaration-site variance

class List<T> {

fun add(t : T)

fun get() : T

}

class Producer<out T> {

fun get() : T

}

class Consumer<in T> {

fun add(t : T)

}

List<Int> >:< List<Any>

val ints = List<Int>()

val anys : List<Any> = ints

val ints = Producer<Int>()

val anys : Producer<Any> = ints

val anys = Consumer<Any>()

val ints : Consumer<Int> = anys

35

Monday, September 19, 2011

Page 71: Kotlin @ StrangeLoop 2011

Generics: Declaration-site variance

class List<T> {

fun add(t : T)

fun get() : T

}

class Producer<out T> {

fun get() : T

}

class Consumer<in T> {

fun add(t : T)

}

List<Int> >:< List<Any>

val ints = List<Int>()

val anys : List<Any> = ints

val ints = Producer<Int>()

val anys : Producer<Any> = ints

val anys = Consumer<Any>()

val ints : Consumer<Int> = anys

35

Monday, September 19, 2011

Page 72: Kotlin @ StrangeLoop 2011

Generics: Use-site varianceval ints = List<Int>()

val anysOut : List<out Any> = ints

anysOut.add("1") // Not available

val i : Int = ints.get() // No problem

36

Monday, September 19, 2011

Page 73: Kotlin @ StrangeLoop 2011

Generics: Use-site varianceval ints = List<Int>()

val anysOut : List<out Any> = ints

anysOut.add("1") // Not available

val i : Int = ints.get() // No problem

36

val anys = List<Any>()

val intsIn : List<in Int> = anys

intsIn.add(0)

val obj = intsIn.get() // : Any?

Monday, September 19, 2011

Page 74: Kotlin @ StrangeLoop 2011

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<*>

37

Monday, September 19, 2011

Page 75: Kotlin @ StrangeLoop 2011

Resources

• Documentation:➡ http://jetbrains.com/kotlin

• Blog:➡ http://blog.jetbrains.com/kotlin

• Twitter:➡ @project_kotlin

➡ @abreslav

38

Monday, September 19, 2011