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 Uma visão geral sobre Kotlin multiplataforma

  2. /_rafaeltoledo /rafaeltoledo

  3. 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
  4. Linhas de código em Kotlin no Github

  5. ADOPT

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

    PROPERTIES EXTENSIONS
  7. Plataformas 7 JVM JS NATIVE

  8. Plataformas 8 JVM JS NATIVE ANDROID

  9. 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
  10. Kotlin para JVM / Backend • Expressividade • Escalabilidade -

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

    Coroutines • Interoperabilidade • Migração - gradual • Tooling • Curva de Aprendizado 11 SPRING KTOR KOTLINX.HTML
  12. 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
  13. 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
  14. 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!
  15. 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
  16. 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
  17. 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
  18. 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
  19. Kotlin Native (ex. iOS) // CMakeLists.txt headers = SDWebImage/UIImageView+WebCache.h ...

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

    @ObjCOutlet lateinit var badge: UIView @ObjCAction fun onTwitterClick(sender: ObjCObject?) { openUrl("https://twitter.com/kotlinconf") } ... } 21
  22. 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

  23. MÓDULOS MULTIPLATAFORMA 23

  24. 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
  25. 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
  26. 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
  27. 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
  28. 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
  29. 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
  30. 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
  31. 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
  32. 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
  33. 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
  34. 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
  35. 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
  36. KOTLIN GRADLE DSL Bônus

  37. 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
  38. 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
  39. e se... 39

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

    40
  41. None
  42. 42 https://github.com/JetBrains/kotlinconf-app

  43. 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
  44. OBRIGADO Para perguntas ou sugestões: Rafael Toledo rdtoledo@thoughtworks.com speakerdeck.com/rafaeltoledo 44