SlideShare a Scribd company logo
1 of 52
Download to read offline
The Kotlin
                Programming Language

                          Andrey Breslav




Monday, October 3, 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, October 3, 2011
Goal-wise...




                               3
Monday, October 3, 2011
Goal-wise...
                    • Number of research papers we are
                          planning to publish on Kotlin is




                                            3
Monday, October 3, 2011
Goal-wise...
                    • Number of research papers we are
                          planning to publish on Kotlin is
                          ➡   Zero




                                            3
Monday, October 3, 2011
Goal-wise...
                    • Number of research papers we are
                          planning to publish on Kotlin is
                          ➡   Zero
                          ➡   ... or really close to that




                                                   3
Monday, October 3, 2011
Outline
                    • Motivation
                    • Feature overview
                    • Basic syntax
                    • Classes and Types
                    • Higher-order functions
                    • Type-safe Groovy-style Builders
                                       4
Monday, October 3, 2011
Motivation




                             5
Monday, October 3, 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, October 3, 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 Scala
                                                     5
Monday, October 3, 2011
Feature overview




                             6
Monday, October 3, 2011
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
                                                                                         6
Monday, October 3, 2011
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
                                                                                 6
Monday, October 3, 2011
Code examples
                    •     Functions
                    •     Java interoperability
                    •     String templates
                    •     Local variables
                    •     Type inference
                    •     Extension functions and properties
                    •     Null-safety

                                                  7
Monday, October 3, 2011
Hello, world!
                namespace hello

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

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




                                           8
Monday, October 3, 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, October 3, 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, October 3, 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, October 3, 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, October 3, 2011
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))        // Can't say: print(x * 2)

                          if (x != null) {
                              print(x * 2)
                          }
                }
                                                 13
Monday, October 3, 2011
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

                                                             14
Monday, October 3, 2011
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?


                                               15
Monday, October 3, 2011
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 => ...
                    }
                }




                                              16
Monday, October 3, 2011
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"
                    }
                }




                                           17
Monday, October 3, 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, October 3, 2011
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
                }


                                         19
Monday, October 3, 2011
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()
                }



                                                20
Monday, October 3, 2011
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()
                }




                                                     21
Monday, October 3, 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()}


                                                   22
Monday, October 3, 2011
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 }


                                                  23
Monday, October 3, 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 }


                                             24
Monday, October 3, 2011
Lock example (I)
                myLock.lock()
                try {
                     // Do something
                }
                finally {
                     myLock.unlock()
                }




                                       25
Monday, October 3, 2011
Lock example (II)

                lock(myLock) {
                     // Do something
                }




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


                                       26
Monday, October 3, 2011
Lock example (III)
                inline fun lock(l : Lock, body : fun () : Unit) {
                     l.lock()
                     try {
                          body()
                     }
                     finally {
                          l.unlock()
                     }
                }


                                       27
Monday, October 3, 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()}



                                               28
Monday, October 3, 2011
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"]
                      }
                }



                                                    29
Monday, October 3, 2011
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" }
                      }
                }



                                                    30
Monday, October 3, 2011
Builders: Implementation (I)
                    •     Function definition

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

                          html {
                            this.head { ... }
                          }


                                                31
Monday, October 3, 2011
Builders: Implementation (II)
                    •     Function definition

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

                          html {
                            head { ... }
                          }


                                                32
Monday, October 3, 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() : Tag("html") {
                    fun head(init : fun Head.() : Unit) { }
                    fun body(init : fun Body.() : Unit) { }
                }



                                           33
Monday, October 3, 2011
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" }
                      }
                }



                                                    34
Monday, October 3, 2011
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) // !!!
                                         35
Monday, October 3, 2011
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
                }



                                             36
Monday, October 3, 2011
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




                                     37
Monday, October 3, 2011
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?

                                     37
Monday, October 3, 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<*>



                                            38
Monday, October 3, 2011
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()




                                                39
Monday, October 3, 2011
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()




                                            40
Monday, October 3, 2011
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
                              }
                          }



                                             41
Monday, October 3, 2011
We are hiring
                    • Full-time
                          ➡   Back-end development
                          ➡   Standard library development
                          ➡   Static analyses and Refactorings
                          ➡   Incremental compilation

                    • Internships

                                                42
Monday, October 3, 2011
Resources
                    • Documentation:
                          ➡   http://jetbrains.com/kotlin

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

                    • Twitter:
                          ➡   @project_kotlin
                          ➡   @abreslav

                                                  43
Monday, October 3, 2011
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


                                                          44
Monday, October 3, 2011

More Related Content

Viewers also liked

Kotlin (Introduction for students)
Kotlin (Introduction for students)Kotlin (Introduction for students)
Kotlin (Introduction for students)Andrey Breslav
 
Language Design Trade-offs
Language Design Trade-offsLanguage Design Trade-offs
Language Design Trade-offsAndrey Breslav
 
Kotlin gets Reflection
Kotlin gets ReflectionKotlin gets Reflection
Kotlin gets ReflectionAndrey Breslav
 
[JVMLS 12] Kotlin / Java Interop
[JVMLS 12] Kotlin / Java Interop[JVMLS 12] Kotlin / Java Interop
[JVMLS 12] Kotlin / Java InteropAndrey Breslav
 
Kotlin Slides from Devoxx 2011
Kotlin Slides from Devoxx 2011Kotlin Slides from Devoxx 2011
Kotlin Slides from Devoxx 2011Andrey Breslav
 
Kotlin @ StrangeLoop 2011
Kotlin @ StrangeLoop 2011Kotlin @ StrangeLoop 2011
Kotlin @ StrangeLoop 2011Andrey Breslav
 
Flexible Types in Kotlin - JVMLS 2015
Flexible Types in Kotlin - JVMLS 2015Flexible Types in Kotlin - JVMLS 2015
Flexible Types in Kotlin - JVMLS 2015Andrey Breslav
 
Introduction to Kotlin: Brief and clear
Introduction to Kotlin: Brief and clearIntroduction to Kotlin: Brief and clear
Introduction to Kotlin: Brief and clearAndrey Breslav
 
JVMLS 2016. Coroutines in Kotlin
JVMLS 2016. Coroutines in KotlinJVMLS 2016. Coroutines in Kotlin
JVMLS 2016. Coroutines in KotlinAndrey Breslav
 
Светлана Исакова «Язык Kotlin»
Светлана Исакова «Язык Kotlin»Светлана Исакова «Язык Kotlin»
Светлана Исакова «Язык Kotlin»e-Legion
 
Be More Productive with Kotlin
Be More Productive with KotlinBe More Productive with Kotlin
Be More Productive with KotlinBrandon Wever
 
Who's More Functional: Kotlin, Groovy, Scala, or Java?
Who's More Functional: Kotlin, Groovy, Scala, or Java?Who's More Functional: Kotlin, Groovy, Scala, or Java?
Who's More Functional: Kotlin, Groovy, Scala, or Java?Andrey Breslav
 
Category theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) DataCategory theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) Datagreenwop
 
Functional Reactive Programming with Kotlin on Android - Giorgio Natili - Cod...
Functional Reactive Programming with Kotlin on Android - Giorgio Natili - Cod...Functional Reactive Programming with Kotlin on Android - Giorgio Natili - Cod...
Functional Reactive Programming with Kotlin on Android - Giorgio Natili - Cod...Codemotion
 

Viewers also liked (16)

Kotlin (Introduction for students)
Kotlin (Introduction for students)Kotlin (Introduction for students)
Kotlin (Introduction for students)
 
Language Design Trade-offs
Language Design Trade-offsLanguage Design Trade-offs
Language Design Trade-offs
 
Kotlin gets Reflection
Kotlin gets ReflectionKotlin gets Reflection
Kotlin gets Reflection
 
[JVMLS 12] Kotlin / Java Interop
[JVMLS 12] Kotlin / Java Interop[JVMLS 12] Kotlin / Java Interop
[JVMLS 12] Kotlin / Java Interop
 
Kotlin Slides from Devoxx 2011
Kotlin Slides from Devoxx 2011Kotlin Slides from Devoxx 2011
Kotlin Slides from Devoxx 2011
 
Kotlin @ StrangeLoop 2011
Kotlin @ StrangeLoop 2011Kotlin @ StrangeLoop 2011
Kotlin @ StrangeLoop 2011
 
Eval4j @ JVMLS 2014
Eval4j @ JVMLS 2014Eval4j @ JVMLS 2014
Eval4j @ JVMLS 2014
 
Flexible Types in Kotlin - JVMLS 2015
Flexible Types in Kotlin - JVMLS 2015Flexible Types in Kotlin - JVMLS 2015
Flexible Types in Kotlin - JVMLS 2015
 
Kotlin @ Devoxx 2011
Kotlin @ Devoxx 2011Kotlin @ Devoxx 2011
Kotlin @ Devoxx 2011
 
Introduction to Kotlin: Brief and clear
Introduction to Kotlin: Brief and clearIntroduction to Kotlin: Brief and clear
Introduction to Kotlin: Brief and clear
 
JVMLS 2016. Coroutines in Kotlin
JVMLS 2016. Coroutines in KotlinJVMLS 2016. Coroutines in Kotlin
JVMLS 2016. Coroutines in Kotlin
 
Светлана Исакова «Язык Kotlin»
Светлана Исакова «Язык Kotlin»Светлана Исакова «Язык Kotlin»
Светлана Исакова «Язык Kotlin»
 
Be More Productive with Kotlin
Be More Productive with KotlinBe More Productive with Kotlin
Be More Productive with Kotlin
 
Who's More Functional: Kotlin, Groovy, Scala, or Java?
Who's More Functional: Kotlin, Groovy, Scala, or Java?Who's More Functional: Kotlin, Groovy, Scala, or Java?
Who's More Functional: Kotlin, Groovy, Scala, or Java?
 
Category theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) DataCategory theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) Data
 
Functional Reactive Programming with Kotlin on Android - Giorgio Natili - Cod...
Functional Reactive Programming with Kotlin on Android - Giorgio Natili - Cod...Functional Reactive Programming with Kotlin on Android - Giorgio Natili - Cod...
Functional Reactive Programming with Kotlin on Android - Giorgio Natili - Cod...
 

Recently uploaded

presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024SynarionITSolutions
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businesspanagenda
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAndrey Devyatkin
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...DianaGray10
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingEdi Saputra
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...Principled Technologies
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesBoston Institute of Analytics
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...apidays
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...apidays
 

Recently uploaded (20)

presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 

Kotlin @ CSClub & Yandex

  • 1. The Kotlin Programming Language Andrey Breslav Monday, October 3, 2011
  • 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 2 Monday, October 3, 2011
  • 3. Goal-wise... 3 Monday, October 3, 2011
  • 4. Goal-wise... • Number of research papers we are planning to publish on Kotlin is 3 Monday, October 3, 2011
  • 5. Goal-wise... • Number of research papers we are planning to publish on Kotlin is ➡ Zero 3 Monday, October 3, 2011
  • 6. Goal-wise... • Number of research papers we are planning to publish on Kotlin is ➡ Zero ➡ ... or really close to that 3 Monday, October 3, 2011
  • 7. Outline • Motivation • Feature overview • Basic syntax • Classes and Types • Higher-order functions • Type-safe Groovy-style Builders 4 Monday, October 3, 2011
  • 8. Motivation 5 Monday, October 3, 2011
  • 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 5 Monday, October 3, 2011
  • 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 5 Monday, October 3, 2011
  • 11. Feature overview 6 Monday, October 3, 2011
  • 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 6 Monday, October 3, 2011
  • 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 6 Monday, October 3, 2011
  • 14. Code examples • Functions • Java interoperability • String templates • Local variables • Type inference • Extension functions and properties • Null-safety 7 Monday, October 3, 2011
  • 15. Hello, world! namespace hello fun main(args : Array<String>) : Unit { println("Hello, world!") } fun println(message : String) { System.out?.println(message) } 8 Monday, October 3, 2011
  • 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) 9 Monday, October 3, 2011
  • 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) } 10 Monday, October 3, 2011
  • 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() } 11 Monday, October 3, 2011
  • 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) } } 12 Monday, October 3, 2011
  • 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)) // Can't say: print(x * 2) if (x != null) { print(x * 2) } } 13 Monday, October 3, 2011
  • 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 14 Monday, October 3, 2011
  • 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? 15 Monday, October 3, 2011
  • 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 => ... } } 16 Monday, October 3, 2011
  • 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" } } 17 Monday, October 3, 2011
  • 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 18 Monday, October 3, 2011
  • 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 } 19 Monday, October 3, 2011
  • 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() } 20 Monday, October 3, 2011
  • 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() } 21 Monday, October 3, 2011
  • 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()} 22 Monday, October 3, 2011
  • 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 } 23 Monday, October 3, 2011
  • 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 } 24 Monday, October 3, 2011
  • 32. Lock example (I) myLock.lock() try { // Do something } finally { myLock.unlock() } 25 Monday, October 3, 2011
  • 33. Lock example (II) lock(myLock) { // Do something } fun lock(l : Lock, body : fun () : Unit) 26 Monday, October 3, 2011
  • 34. Lock example (III) inline fun lock(l : Lock, body : fun () : Unit) { l.lock() try { body() } finally { l.unlock() } } 27 Monday, October 3, 2011
  • 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()} 28 Monday, October 3, 2011
  • 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"] } } 29 Monday, October 3, 2011
  • 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" } } } 30 Monday, October 3, 2011
  • 38. Builders: Implementation (I) • Function definition fun html(init : fun HTML.() : Unit) : HTML { val html = HTML() html.init() return html } • Usage html { this.head { ... } } 31 Monday, October 3, 2011
  • 39. Builders: Implementation (II) • Function definition fun html(init : fun HTML.() : Unit) : HTML { val html = HTML() html.init() return html } • Usage html { head { ... } } 32 Monday, October 3, 2011
  • 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) { } } 33 Monday, October 3, 2011
  • 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" } } } 34 Monday, October 3, 2011
  • 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) // !!! 35 Monday, October 3, 2011
  • 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 } 36 Monday, October 3, 2011
  • 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 37 Monday, October 3, 2011
  • 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? 37 Monday, October 3, 2011
  • 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<*> 38 Monday, October 3, 2011
  • 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() 39 Monday, October 3, 2011
  • 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() 40 Monday, October 3, 2011
  • 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 } } 41 Monday, October 3, 2011
  • 50. We are hiring • Full-time ➡ Back-end development ➡ Standard library development ➡ Static analyses and Refactorings ➡ Incremental compilation • Internships 42 Monday, October 3, 2011
  • 51. Resources • Documentation: ➡ http://jetbrains.com/kotlin • Blog: ➡ http://blog.jetbrains.com/kotlin • Twitter: ➡ @project_kotlin ➡ @abreslav 43 Monday, October 3, 2011
  • 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 44 Monday, October 3, 2011