Slide 1

Slide 1 text

KOTLIN Uma visão geral sobre Kotlin multiplataforma

Slide 2

Slide 2 text

/_rafaeltoledo /rafaeltoledo

Slide 3

Slide 3 text

Kotlin ● Open Source, criada em 2010 pela JetBrains ● Estaticamente tipada, segura e programática ● Design inspirado em linguagens como Java, Scala, C# e Groovy ● Orientada a Objetos, com características Funcionais 3

Slide 4

Slide 4 text

Linhas de código em Kotlin no Github

Slide 5

Slide 5 text

ADOPT

Slide 6

Slide 6 text

Características 6 DATA CLASSES TYPE ALIAS LAMBDA DSL NULL SAFETY PROPERTIES EXTENSIONS

Slide 7

Slide 7 text

Plataformas 7 JVM JS NATIVE

Slide 8

Slide 8 text

Plataformas 8 JVM JS NATIVE ANDROID

Slide 9

Slide 9 text

Kotlin para Android ● Compatibilidade - Java 6 ● Performance ● Interoperabilidade ● Footprint: standard library e runtime adiciona apenas +/- 100Kb ao APK ● Tempo de Compilação ● Curva de Aprendizado 9

Slide 10

Slide 10 text

Kotlin para JVM / Backend ● Expressividade ● Escalabilidade - Coroutines ● Interoperabilidade ● Migração - gradual ● Tooling ● Curva de Aprendizado 10

Slide 11

Slide 11 text

Kotlin para JVM / Backend ● Expressividade ● Escalabilidade - Coroutines ● Interoperabilidade ● Migração - gradual ● Tooling ● Curva de Aprendizado 11 SPRING KTOR KOTLINX.HTML

Slide 12

Slide 12 text

Kotlin para JVM / Backend (ex. Ktor) import io.ktor.server.netty.* import io.ktor.routing.* import io.ktor.application.* import io.ktor.http.* import io.ktor.response.* import io.ktor.server.engine.* fun main(args: Array) { embeddedServer(Netty, 8080) { routing { get("/") { call.respondText("Hello, world!", ContentType.Text.Html) } } }.start(wait = true) } 12

Slide 13

Slide 13 text

Kotlin para JavaScript ● Atualmente (1.2) ECMAScript 5.1 - roadmap ECMAScript 2015 ● Tamanho otimizado - DCE (Dead Code Elimination) ● JavaScript legível ● Compatibilidade com JavaScript já existente ● Mesmas funcionalidades da Standard Library da JVM 13

Slide 14

Slide 14 text

Kotlin para JavaScript ● Atualmente (1.2) ECMAScript 5.1 - roadmap ECMAScript 2015 ● Tamanho otimizado - DCE (Dead Code Elimination) ● JavaScript legível ● Compatibilidade com JavaScript já existente ● Mesmas funcionalidades da Standard Library da JVM 14 REACT & NODEJS!

Slide 15

Slide 15 text

Kotlin para JavaScript ● É possível interoperar com qualquer outro módulo JavaScript ● Strong-typed APIs / TypeScript - https://github.com/kotlin/ts2kt ● Dynamic types para outros cenários 15

Slide 16

Slide 16 text

Kotlin Native ● Código nativo, sem VM ● Backend baseado em LLVM ● Interoperabilidade com código nativo - binding gerado a partir do .h ● Mac / iOS - interoperabilidade com Objective C ● Atualmente na versão 0.7 - em desenvolvimento 16

Slide 17

Slide 17 text

Kotlin Native ● Windows (x86_64) ● Linux (x86_64, arm32, MIPS e MIPS little endian) ● MacOS (x86_64) ● iOS (arm64) ● Android (arm32 e arm64) ● WebAssembly (wasm32) 17

Slide 18

Slide 18 text

Kotlin Native (ex. iOS) // CMakeLists.txt cmake_minimum_required(VERSION 3.8) set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/KotlinCMakeModule) project(kotlinsample Kotlin) cinterop( NAME libs TARGET iphone DEF_FILE src/main/c_interop/libs.def ) konanc_executable( NAME kotlinsample TARGET iphone SOURCES src/main/kotlin/ ) 18

Slide 19

Slide 19 text

Kotlin Native (ex. iOS) // CMakeLists.txt headers = SDWebImage/UIImageView+WebCache.h ... headerFilter = SDWebImage/** OMGHTTPURLRQ/** ... language = Objective-C linkerOpts = ... compilerOpts = ... 19

Slide 20

Slide 20 text

Kotlin Native (ex. iOS) buildscript { repositories { mavenCentral() maven { url "https://dl.bintray.com/jetbrains/kotlin-native-dependencies" } } dependencies { classpath "org.jetbrains.kotlin:kotlin-native-gradle-plugin:0.7.1" } } apply plugin: "konan" konan.targets = ["iphone"] ... 20

Slide 21

Slide 21 text

Kotlin Native (ex. iOS) @ExportObjCClass class KotlinViewController : UIViewController { @ObjCOutlet lateinit var badge: UIView @ObjCAction fun onTwitterClick(sender: ObjCObject?) { openUrl("https://twitter.com/kotlinconf") } ... } 21

Slide 22

Slide 22 text

Links https://kotlinlang.org/docs/reference/android-overview.html https://kotlinlang.org/docs/reference/server-overview.html https://kotlinlang.org/docs/reference/js-overview.html https://kotlinlang.org/docs/reference/native-overview.html 22

Slide 23

Slide 23 text

MÓDULOS MULTIPLATAFORMA 23

Slide 24

Slide 24 text

Kotlin Multiplataforma - experimental ● A partir da versão 1.2 ● JVM e JavaScript (Native previsto) ● Módulos que podem ser compilados para diferentes plataformas ● common, platform e regular 24

Slide 25

Slide 25 text

Módulo Multiplataforma common: Contém código que não é específico a nenhuma plataforma, assim como a declaração de APIs que necessitam de implementação específica 25

Slide 26

Slide 26 text

Módulo Multiplataforma common: Contém código que não é específico a nenhuma plataforma, assim como a declaração de APIs que necessitam de implementação específica platform: Contém a implementação das APIs definidas em um módulo common, além de outros códigos específicos da plataforma 26

Slide 27

Slide 27 text

Módulo Multiplataforma common: Contém código que não é específico a nenhuma plataforma, assim como a declaração de APIs que necessitam de implementação específica platform: Contém a implementação das APIs definidas em um módulo common, além de outros códigos específicos da plataforma regular: Módulo comum que tem como target uma plataforma específica 27

Slide 28

Slide 28 text

Módulo Multiplataforma - Gradle buildscript { ext.kotlin_version = '1.2.50' repositories { mavenCentral() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } apply plugin: 'kotlin-platform-common' repositories { mavenCentral() } dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib-common:$kotlin_version" testCompile "org.jetbrains.kotlin:kotlin-test-common:$kotlin_version" } 28

Slide 29

Slide 29 text

Módulo Multiplataforma - Gradle buildscript { ext.kotlin_version = '1.2.50' repositories { mavenCentral() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } apply plugin: 'kotlin-platform-common' repositories { mavenCentral() } dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib-common:$kotlin_version" testCompile "org.jetbrains.kotlin:kotlin-test-common:$kotlin_version" } 29

Slide 30

Slide 30 text

Módulo Multiplataforma - específico JVM ... apply plugin: 'kotlin-platform-jvm' repositories { mavenCentral() } dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" expectedBy project(":common") testCompile "junit:junit:4.12" testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version" testCompile "org.jetbrains.kotlin:kotlin-test:$kotlin_version" } 30

Slide 31

Slide 31 text

Módulo Multiplataforma - específico JVM ... apply plugin: 'kotlin-platform-jvm' repositories { mavenCentral() } dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" expectedBy project(":common") testCompile "junit:junit:4.12" testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version" testCompile "org.jetbrains.kotlin:kotlin-test:$kotlin_version" } 31

Slide 32

Slide 32 text

Módulo Multiplataforma - específico JS ... apply plugin: 'kotlin-platform-js' repositories { mavenCentral() } dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib-js:$kotlin_version" expectedBy project(":common") testCompile "org.jetbrains.kotlin:kotlin-test-js:$kotlin_version" } 32

Slide 33

Slide 33 text

Módulo Multiplataforma - específico JS ... apply plugin: 'kotlin-platform-js' repositories { mavenCentral() } dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib-js:$kotlin_version" expectedBy project(":common") testCompile "org.jetbrains.kotlin:kotlin-test-js:$kotlin_version" } 33

Slide 34

Slide 34 text

Módulo Multiplataforma - Código comum package com.thoughtworks.foo expect class Foo(bar: String) { fun frob() } fun main(args: Array) { Foo("Hello").frob() } 34

Slide 35

Slide 35 text

Módulo Multiplataforma - Código JVM package com.thoughtworks.foo actual class Foo actual constructor(val bar: String) { actual fun frob() { println("Frobbing the $bar") } } 35

Slide 36

Slide 36 text

KOTLIN GRADLE DSL Bônus

Slide 37

Slide 37 text

Gradle - Groovy (default) // build.gradle allprojects { buildscript { ext.kotlin_version = '1.2.50' repositories { mavenCentral() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } repositories { mavenLocal() } } 37

Slide 38

Slide 38 text

Gradle - Kotlin DSL // build.gradle.kts allprojects { buildscript { val kotlin_version by extra { "1.2.50" } repositories { mavenCentral() } dependencies { classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version") } } repositories { mavenLocal() } } 38

Slide 39

Slide 39 text

e se... 39

Slide 40

Slide 40 text

a gente tivesse um projeto definitivamente full stack em Kotlin? 40

Slide 41

Slide 41 text

No content

Slide 42

Slide 42 text

42 https://github.com/JetBrains/kotlinconf-app

Slide 43

Slide 43 text

Links BLOG OFICIAL https://blog.jetbrains.com/kotlin KOTLIN KOANS https://kotlinlang.org/docs/tutorials/koans.html KOTLIN IN ACTION https://www.manning.com/books/kotlin-in-action 43

Slide 44

Slide 44 text

OBRIGADO Para perguntas ou sugestões: Rafael Toledo rdtoledo@thoughtworks.com speakerdeck.com/rafaeltoledo 44