Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Uma visão geral sobre Kotlin multiplataforma

Uma visão geral sobre Kotlin multiplataforma

Apresentado na ThoughtWorks São Paulo, no evento sobre o Tech Radar vol. 18

Rafael Toledo

June 28, 2018
Tweet

More Decks by Rafael Toledo

Other Decks in Programming

Transcript

  1. 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
  2. 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
  3. Kotlin para JVM / Backend • Expressividade • Escalabilidade -

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

    Coroutines • Interoperabilidade • Migração - gradual • Tooling • Curva de Aprendizado 11 SPRING KTOR KOTLINX.HTML
  5. 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<String>) { embeddedServer(Netty, 8080) { routing { get("/") { call.respondText("Hello, world!", ContentType.Text.Html) } } }.start(wait = true) } 12
  6. 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
  7. 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!
  8. 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
  9. 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
  10. 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
  11. 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
  12. Kotlin Native (ex. iOS) // CMakeLists.txt headers = SDWebImage/UIImageView+WebCache.h ...

    headerFilter = SDWebImage/** OMGHTTPURLRQ/** ... language = Objective-C linkerOpts = ... compilerOpts = ... 19
  13. 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
  14. Kotlin Native (ex. iOS) @ExportObjCClass class KotlinViewController : UIViewController {

    @ObjCOutlet lateinit var badge: UIView @ObjCAction fun onTwitterClick(sender: ObjCObject?) { openUrl("https://twitter.com/kotlinconf") } ... } 21
  15. 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
  16. 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
  17. 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
  18. 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
  19. 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
  20. 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
  21. 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
  22. 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
  23. 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
  24. 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
  25. Módulo Multiplataforma - Código comum package com.thoughtworks.foo expect class Foo(bar:

    String) { fun frob() } fun main(args: Array<String>) { Foo("Hello").frob() } 34
  26. 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
  27. 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
  28. 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