0
The Kotlin                Programming Language                          Andrey BreslavMonday, October 3, 2011
What is Kotlin?                    •     Statically typed                    •     object-oriented                    •   ...
Goal-wise...                               3Monday, October 3, 2011
Goal-wise...                    • Number of research papers we are                          planning to publish on Kotlin ...
Goal-wise...                    • Number of research papers we are                          planning to publish on Kotlin ...
Goal-wise...                    • Number of research papers we are                          planning to publish on Kotlin ...
Outline                    • Motivation                    • Feature overview                    • Basic syntax           ...
Motivation                             5Monday, October 3, 2011
Motivation                    •     Why a new language?                          ➡   We are not satisfied with the existin...
Motivation                    •     Why a new language?                          ➡   We are not satisfied with the existin...
Feature overview                             6Monday, October 3, 2011
Feature overview                                                                                                          ...
Feature overview                                                                                                       ds)...
Code examples                    •     Functions                    •     Java interoperability                    •     S...
Hello, world!                namespace hello                fun main(args : Array<String>) : Unit {                  print...
Hello, <names>!                fun main(args : Array<String>) {                    var names : String = ""                ...
Hello, <names>! (Faster version)                fun main(args : Array<String>) {                    val names = StringBuil...
Hello, <names>! (Realistic version)                fun main(args : Array<String>) {                    println("Hello, ${a...
join() and forit()                fun <T> Iterable<T>.join(separator : String) : String {                    val names = S...
Null-safety                fun parseInt(s       : String) : Int? {                    try {                        return ...
Types                                                           Syntax                                         Class types...
Mapping to Java types                            Kotlin     GEN    Java     LOAD      Kotlin                             A...
Automatic casts and When                fun foo(obj : Any?) {                    if (obj is String) {                     ...
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                     fun foo() : Int ...
Disambiguation                trait A {                     fun foo() : Int = 1                }                open class...
First-class Delegation                trait List<T> {                     fun add(t : T)                     fun get(index...
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 cont...
Lock example (I)                myLock.lock()                try {                     // Do something                }   ...
Lock example (II)                lock(myLock) {                     // Do something                }                fun lo...
Lock example (III)                inline fun lock(l : Lock, body : fun () : Unit) {                     l.lock()          ...
Extension functions                    •     Functions                          ➡   fun Foo.f(p : Int) : String           ...
Builders in Groovy                html {                      head {                          title "XML encoding with Gro...
Builders in Kotlin                html {                      head {                          title { +"XML encoding with ...
Builders: Implementation (I)                    •     Function definition                          fun html(init : fun HTM...
Builders: Implementation (II)                    •     Function definition                          fun html(init : fun HT...
Builders: Implementation (III)                abstract class Tag(val name : String) : Element {                    val chi...
Builders in Kotlin                html {                      head {                          title { +"XML encoding with ...
Generics: Invariance                class List<T> {                      fun add(t : T)                      fun get(index...
Generics: Declaration-site variance                class List<T> {           List<Int> >:< List<Any>                    fu...
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> ...
Class objects (I)                    • Classes have no static members                    • Each class may have a class obj...
Class objects (II)                    • Class objects can have supertypes:                          class Example() {     ...
Class objects (III)                    • Generic constraints for class objects:                          class Lazy<T>()  ...
We are hiring                    • Full-time                          ➡   Back-end development                          ➡ ...
Resources                    • Documentation:                          ➡   http://jetbrains.com/kotlin                    ...
Practical Type Systems                                                (seminar)                    •     Topics           ...
Upcoming SlideShare
Loading in...5
×

20111002 csseminar kotlin

900

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

No notes for slide

Transcript of "20111002 csseminar kotlin"

  1. 1. The Kotlin Programming Language Andrey BreslavMonday, October 3, 2011
  2. 2. 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, October 3, 2011
  3. 3. Goal-wise... 3Monday, October 3, 2011
  4. 4. Goal-wise... • Number of research papers we are planning to publish on Kotlin is 3Monday, October 3, 2011
  5. 5. Goal-wise... • Number of research papers we are planning to publish on Kotlin is ➡ Zero 3Monday, October 3, 2011
  6. 6. Goal-wise... • Number of research papers we are planning to publish on Kotlin is ➡ Zero ➡ ... or really close to that 3Monday, October 3, 2011
  7. 7. Outline • Motivation • Feature overview • Basic syntax • Classes and Types • Higher-order functions • Type-safe Groovy-style Builders 4Monday, October 3, 2011
  8. 8. Motivation 5Monday, October 3, 2011
  9. 9. 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, October 3, 2011
  10. 10. 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, October 3, 2011
  11. 11. Feature overview 6Monday, October 3, 2011
  12. 12. Feature overview ds) s f iel tee (no ran rtie s gua e ety P rop - saf T null rai c t s& St ati Fir Reifie d gene st- rics cla ss de le ga tio n Declaration-site variance & "Type projections" Hig her- o Inline-functions (zero-overhead closures) t ure rder uc func st r tio ns ( infra Pattern matching " d clos ures uil ") dB Extension functions s an ule Mod 6Monday, October 3, 2011
  13. 13. Feature overview ds) s f iel tee (no ran rtie s gua e ety P rop - saf T null rai c t s& St ati Fir Reifie d gene st- rics cla ss Full-featured IDE by JetBrains from the very beginning de le ga tio n Declaration-site variance & "Type projections" Hig her- o Inline-functions (zero-overhead closures) t ure rder uc func st r tio ns ( infra Pattern matching " d clos ures uil ") dB Extension functions s an ule Mod 6Monday, October 3, 2011
  14. 14. Code examples • Functions • Java interoperability • String templates • Local variables • Type inference • Extension functions and properties • Null-safety 7Monday, October 3, 2011
  15. 15. Hello, world! namespace hello fun main(args : Array<String>) : Unit { println("Hello, world!") } fun println(message : String) { System.out?.println(message) } 8Monday, October 3, 2011
  16. 16. 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, October 3, 2011
  17. 17. 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, October 3, 2011
  18. 18. 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, October 3, 2011
  19. 19. 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, October 3, 2011
  20. 20. 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, October 3, 2011
  21. 21. 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, October 3, 2011
  22. 22. 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?>? IntArray int[] IntArray? Nothing - - Foo Foo Foo? 15Monday, October 3, 2011
  23. 23. Automatic casts and When fun foo(obj : Any?) { if (obj is String) { obj.substring(2) } when (obj) { is String => obj[0] is Int => obj + 1 !is Boolean => null else => ... } } 16Monday, October 3, 2011
  24. 24. 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, October 3, 2011
  25. 25. 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, October 3, 2011
  26. 26. Traits trait T1 : Class1, OtherTrait { // No state fun foo() : Int = 1 // open by default fun bar() : Int // abstract by default } class Foo(p : Bar) : Class1(p), T1, T2 { override fun bar() : Int = foo() + 1 } 19Monday, October 3, 2011
  27. 27. Disambiguation trait A { fun foo() : Int = 1 } open class B() { open fun foo() : Int = 2 } class C() : B(), A { override fun foo() = super<A>.foo() } 20Monday, October 3, 2011
  28. 28. First-class Delegation trait List<T> { fun add(t : T) fun get(index : Int) : T } class ListDecorator<T>(p : List<T>) : List<T> by p { override fun add(t : T) { log.message("Added $t") super.add(t) } // override fun get(index : Int) : T = super.get() } 21Monday, October 3, 2011
  29. 29. 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()} 22Monday, October 3, 2011
  30. 30. 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 } 23Monday, October 3, 2011
  31. 31. 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 } 24Monday, October 3, 2011
  32. 32. Lock example (I) myLock.lock() try { // Do something } finally { myLock.unlock() } 25Monday, October 3, 2011
  33. 33. Lock example (II) lock(myLock) { // Do something } fun lock(l : Lock, body : fun () : Unit) 26Monday, October 3, 2011
  34. 34. Lock example (III) inline fun lock(l : Lock, body : fun () : Unit) { l.lock() try { body() } finally { l.unlock() } } 27Monday, October 3, 2011
  35. 35. 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()} 28Monday, October 3, 2011
  36. 36. 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"] } } 29Monday, October 3, 2011
  37. 37. 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" } } } 30Monday, October 3, 2011
  38. 38. Builders: Implementation (I) • Function definition fun html(init : fun HTML.() : Unit) : HTML { val html = HTML() html.init() return html } • Usage html { this.head { ... } } 31Monday, October 3, 2011
  39. 39. Builders: Implementation (II) • Function definition fun html(init : fun HTML.() : Unit) : HTML { val html = HTML() html.init() return html } • Usage html { head { ... } } 32Monday, October 3, 2011
  40. 40. 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() : Tag("html") { fun head(init : fun Head.() : Unit) { } fun body(init : fun Body.() : Unit) { } } 33Monday, October 3, 2011
  41. 41. 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" } } } 34Monday, October 3, 2011
  42. 42. 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) // !!! 35Monday, October 3, 2011
  43. 43. 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 } 36Monday, October 3, 2011
  44. 44. 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 37Monday, October 3, 2011
  45. 45. 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? 37Monday, October 3, 2011
  46. 46. 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<*> 38Monday, October 3, 2011
  47. 47. Class objects (I) • Classes have no static members • Each class may have a class object associated to it: class Example() { class object { fun create() = Example() } } val e = Example.create() 39Monday, October 3, 2011
  48. 48. Class objects (II) • Class objects can have supertypes: class Example() { class object : Factory<Example> { override fun create() = Example() } } val factory : Factory<Example> = Example val e : Example = factory.create() 40Monday, October 3, 2011
  49. 49. Class objects (III) • Generic constraints for class objects: class Lazy<T>() where class object T : Factory<T> { private var store : T? = null public val value : T get() { if (store == null) { store = T.create() } return store } } 41Monday, October 3, 2011
  50. 50. We are hiring • Full-time ➡ Back-end development ➡ Standard library development ➡ Static analyses and Refactorings ➡ Incremental compilation • Internships 42Monday, October 3, 2011
  51. 51. Resources • Documentation: ➡ http://jetbrains.com/kotlin • Blog: ➡ http://blog.jetbrains.com/kotlin • Twitter: ➡ @project_kotlin ➡ @abreslav 43Monday, October 3, 2011
  52. 52. Practical Type Systems (seminar) • Topics ➡ Type systems of industrial languages (e.g. C#, Java, Scala, Kotlin) ➡ Cutting-edge work on OOP and Generic programming ➡ Formalizing Kotlin • Location ➡ JetBrains, Kantemirovskaya, 2A (m. "Lesnaya") • Day/Time ➡ TBD • To participate ➡ andrey.breslav@jetbrains.com 44Monday, October 3, 2011
  1. A particular slide catching your eye?

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

×