Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
KOTLIN
Compartilhando código com Kotlin Multiplataforma
/_rafaeltoledo
/rafaeltoledo
ADOTE
https://pusher.com/state-of-kotlin
Plataformas
5
JVM JS NATIVE
ANDROID
Por que usar Kotlin no desenvolvimento Android?
● Compatibilidade - Java 6
● Performance
● Interoperabilidade
● Footprint:...
https://bit.ly/2ATKly0
Por que usar Kotlin no desenvolvimento para JVM?
● Expressividade
● Escalabilidade & Performance - Kotlin Coroutines
● Int...
https://bit.ly/2jV4utA
JavaFX Framework for Kotlin
https://github.com/edvin/tornadofx
Ktor for building servers and clients
https://ktor.io
Por que usar Kotlin no desenvolvimento JavaScript?
● JavaScript Optimized - DCE (Dead Code Elimination)
● JavaScript legív...
https://github.com/JetBrains/kotlin-wrappers
Kotlin para JavaScript - e a tipagem?
● É possível interagir com qualquer tipo de código JavaScript
● Statically typed API...
KotlinJS - jQuery
fun main(args: Array<String>) {
jq("#message").html("Hello from Kotlin")
}
15
KotlinJS - React
class HelloComponent: RComponent<RProps, RState>() {
override fun RBuilder.render() {
div(classes = "cont...
KotlinJS - NodeJS
fun main(args: Array<String>) {
val express = require("express")
val app = express()
app.get("/", { req,...
Por que usar Kotlin no desenvolvimento nativo?
● Código Nativo
● Backend baseado no LLVM
● Interoperabilidade com código n...
Kotlin Native supported targets
● Windows (x86_64)
● Linux (x86_64, arm32, MIPS e MIPS little endian)
● MacOS (x86_64)
● i...
Kotlin Native - C interop
components.main {
targets = ['macos_x64', 'linux_x64']
dependencies {
cinterop('libcurl-interop'...
Kotlin Native - C interop
headers = curl/curl.h
headerFilter = curl/*
linkerOpts.osx = -L/opt/local/lib -L/usr/local/opt/c...
Kotlin Native - C interop
fun fetch() {
val res = curl_easy_perform(curl)
if (res != CURLE_OK)
println("curl_easy_perform(...
Integração com IDE
23
Reference links
https://kotlinlang.org/docs/reference/android-overview.html
https://kotlinlang.org/docs/reference/server-o...
MÓDULOS
MULTIPLATAFORMA
25
Kotlin Multiplataforma
● Suporte introduzido na versão 1.2
● JVM & JavaScript (Native "meio que" funciona)
● módulos commo...
Módulos Multiplataforma
common: Contém código que não é específico a nenhuma plataforma, assim
como a declaração de APIs q...
Multiplatform Module - Gradle
buildscript {
ext.kotlin_version = '1.2.70'
repositories {
mavenCentral()
}
dependencies {
c...
Multiplatform Module - Gradle
buildscript {
ext.kotlin_version = '1.2.70'
repositories {
mavenCentral()
}
dependencies {
c...
Multiplatform Module - JVM target
...
apply plugin: 'kotlin-platform-jvm'
repositories {
mavenCentral()
}
dependencies {
c...
Multiplatform Module - JVM target
...
apply plugin: 'kotlin-platform-jvm'
repositories {
mavenCentral()
}
dependencies {
c...
Multiplatform Module - JavaScript target
...
apply plugin: 'kotlin-platform-js'
repositories {
mavenCentral()
}
dependenci...
Multiplatform Module - JavaScript target
...
apply plugin: 'kotlin-platform-js'
repositories {
mavenCentral()
}
dependenci...
Multiplatform Module - Native target
...
buildscript {
repositories {
maven { url 'https://jetbrains.bintray.com/kotlin-na...
Multiplatform Module - Native target
...
apply plugin: 'kotlin-platform-native'
dependencies {
compile "org.jetbrains.kotl...
Multiplatform Module - Common code
package com.example.foo
expect class Foo(bar: String) {
fun frob()
}
fun main(args: Arr...
Multiplatform Module - JVM implementation
package com.example.foo
actual class Foo actual constructor(val bar: String) {
a...
DI Multiplataforma
38
Mock Multiplataforma
39
KOTLIN GRADLE DSL
Bonus - por que não usar em todo o projeto então?
Por que usar a Kotlin Gradle DSL?
● Aumento na velocidade de análise e compilação
dos build scripts, em comparação com Gro...
Gradle - Groovy (default)
// build.gradle
allprojects {
buildscript {
ext.kotlin_version = '1.2.70'
repositories {
mavenCe...
Gradle - Kotlin DSL
// build.gradle.kts
allprojects {
buildscript {
val kotlin_version by extra { "1.2.70" }
repositories ...
e se...
44
a gente tivesse um projeto definitivamente full stack em
Kotlin?
45
47
https://github.com/JetBrains/kotlinconf-app
Ktor / ReactJS / Android / iOS
48
https://github.com/MarcinMoskala/KotlinAcademyApp
Ktor / ReactJS / Android / iOS / JavaFX
Links
BLOG OFICIAL
https://blog.jetbrains.com/kotlin
KOTLIN KOANS
https://kotlinlang.org/docs/tutorials/koans.html
KOTLIN ...
OBRIGADO!
Questions and feedbacks?
Rafael Toledo
rdtoledo@thoughtworks.com
speakerdeck.com/rafaeltoledo
github.com/rafaelt...
Compartilhando código com Kotlin multiplataforma - Rafael Toledo
Upcoming SlideShare
Loading in …5
×

Compartilhando código com Kotlin multiplataforma - Rafael Toledo

124 views

Published on

Rafael Toledo - Consultor de Desenvolvimento Líder da ThoughtWorks, fala sobre Compartilhando código com Kotlin multiplataforma no Kotlin Community Summit.

Saiba mais em https://eventos.imasters.com.br/kotlinsummit/.

Published in: Internet
  • Be the first to comment

  • Be the first to like this

Compartilhando código com Kotlin multiplataforma - Rafael Toledo

  1. 1. KOTLIN Compartilhando código com Kotlin Multiplataforma
  2. 2. /_rafaeltoledo /rafaeltoledo
  3. 3. ADOTE
  4. 4. https://pusher.com/state-of-kotlin
  5. 5. Plataformas 5 JVM JS NATIVE ANDROID
  6. 6. Por que usar Kotlin no desenvolvimento Android? ● Compatibilidade - Java 6 ● Performance ● Interoperabilidade ● Footprint: standard library & runtime ~100Kb ● Tempo de Compilação não é mais um problema ● Tooling evoluindo 6
  7. 7. https://bit.ly/2ATKly0
  8. 8. Por que usar Kotlin no desenvolvimento para JVM? ● Expressividade ● Escalabilidade & Performance - Kotlin Coroutines ● Interoperabilidade com código já existente - migração gradual ● Tooling 8
  9. 9. https://bit.ly/2jV4utA
  10. 10. JavaFX Framework for Kotlin https://github.com/edvin/tornadofx
  11. 11. Ktor for building servers and clients https://ktor.io
  12. 12. Por que usar Kotlin no desenvolvimento JavaScript? ● JavaScript Optimized - DCE (Dead Code Elimination) ● JavaScript legível e depurável ● Compatibilidade com código JavaScript pré-existente ● Mesmas features da Standard Library da JVM - incluindo Coroutines 12
  13. 13. https://github.com/JetBrains/kotlin-wrappers
  14. 14. Kotlin para JavaScript - e a tipagem? ● É possível interagir com qualquer tipo de código JavaScript ● Statically typed APIs / TypeScript -> https://github.com/kotlin/ts2kt ● Dynamic types para outros cenários 14
  15. 15. KotlinJS - jQuery fun main(args: Array<String>) { jq("#message").html("Hello from Kotlin") } 15
  16. 16. KotlinJS - React class HelloComponent: RComponent<RProps, RState>() { override fun RBuilder.render() { div(classes = "content") { h1 { +"Hello!" } } } } fun RBuilder.hello() = child(HelloComponent::class) { } 16
  17. 17. KotlinJS - NodeJS fun main(args: Array<String>) { val express = require("express") val app = express() app.get("/", { req, res -> res.type("text/plain") res.send("i am a beautiful butterfly") }) app.listen(3000, { println("Listening on port 3000") }) } 17
  18. 18. Por que usar Kotlin no desenvolvimento nativo? ● Código Nativo ● Backend baseado no LLVM ● Interoperabilidade com código nativo e bibliotecas - binding gerado a partir de arquivos .h ● MacOS / iOS - Objective C e Swift ● Atualmente na versão 0.9 - em desenvolvimento - 1.3 18
  19. 19. Kotlin Native supported targets ● Windows (x86_64) ● Linux (x86_64, arm32, MIPS e MIPS little endian) ● MacOS (x86_64) ● iOS (arm32, arm64, x64) ● Android (arm32 e arm64) ● STM32 ● WebAssembly (wasm32) 19
  20. 20. Kotlin Native - C interop components.main { targets = ['macos_x64', 'linux_x64'] dependencies { cinterop('libcurl-interop') { defFile 'src/main/c_interop/libcurl.def' target('linux_x64') { includeDirs.headerFilterOnly '/usr/include' } target('macos_x64') { includeDirs.headerFilterOnly '/opt/local/include', '/usr/local/include' } } } 20
  21. 21. Kotlin Native - C interop headers = curl/curl.h headerFilter = curl/* linkerOpts.osx = -L/opt/local/lib -L/usr/local/opt/curl/lib -lcurl linkerOpts.linux = -L/usr/lib64 -L/usr/lib/x86_64-linux-gnu -lcurl 21
  22. 22. Kotlin Native - C interop fun fetch() { val res = curl_easy_perform(curl) if (res != CURLE_OK) println("curl_easy_perform() failed") } fun CPointer<ByteVar>.toKString(length: Int): String { val bytes = this.readBytes(length) return bytes.stringFromUtf8() } 22
  23. 23. Integração com IDE 23
  24. 24. Reference 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 24
  25. 25. MÓDULOS MULTIPLATAFORMA 25
  26. 26. Kotlin Multiplataforma ● Suporte introduzido na versão 1.2 ● JVM & JavaScript (Native "meio que" funciona) ● módulos common, platform e regular 26
  27. 27. Módulos 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. 28. Multiplatform Module - Gradle buildscript { ext.kotlin_version = '1.2.70' 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. 29. Multiplatform Module - Gradle buildscript { ext.kotlin_version = '1.2.70' 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. 30. Multiplatform Module - JVM target ... 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. 31. Multiplatform Module - JVM target ... 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. 32. Multiplatform Module - JavaScript target ... 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. 33. Multiplatform Module - JavaScript target ... 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. 34. Multiplatform Module - Native target ... buildscript { repositories { maven { url 'https://jetbrains.bintray.com/kotlin-native-dependencies' } } dependencies { classpath 'org.jetbrains.kotlin:kotlin-native-gradle-plugin:0.8.2' } } apply plugin: 'kotlin-platform-native' dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" expectedBy project(":common") } ... 34
  35. 35. Multiplatform Module - Native target ... apply plugin: 'kotlin-platform-native' dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" expectedBy project(":common") } sourcesets.main.component { baseName.set('MyCommonModule') target 'ios_arm64', 'ios_x64' outputKinds = [ FRAMEWORK ] } ... 35
  36. 36. Multiplatform Module - Common code package com.example.foo expect class Foo(bar: String) { fun frob() } fun main(args: Array<String>) { Foo("Hello").frob() } 36
  37. 37. Multiplatform Module - JVM implementation package com.example.foo actual class Foo actual constructor(val bar: String) { actual fun frob() { println("Frobbing the $bar") } } 37
  38. 38. DI Multiplataforma 38
  39. 39. Mock Multiplataforma 39
  40. 40. KOTLIN GRADLE DSL Bonus - por que não usar em todo o projeto então?
  41. 41. Por que usar a Kotlin Gradle DSL? ● Aumento na velocidade de análise e compilação dos build scripts, em comparação com Groovy ● IDE friendly, melhor autocomplete ● Unificação da linguagem de desenvolvimento ● 1.0 RC 6 incluído no Gradle 4.10.1, estável no Gradle 5.0 (próxima versão) 41
  42. 42. Gradle - Groovy (default) // build.gradle allprojects { buildscript { ext.kotlin_version = '1.2.70' repositories { mavenCentral() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } repositories { mavenLocal() } } 42
  43. 43. Gradle - Kotlin DSL // build.gradle.kts allprojects { buildscript { val kotlin_version by extra { "1.2.70" } repositories { mavenCentral() } dependencies { classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version") } } repositories { mavenLocal() } } 43
  44. 44. e se... 44
  45. 45. a gente tivesse um projeto definitivamente full stack em Kotlin? 45
  46. 46. 47 https://github.com/JetBrains/kotlinconf-app Ktor / ReactJS / Android / iOS
  47. 47. 48 https://github.com/MarcinMoskala/KotlinAcademyApp Ktor / ReactJS / Android / iOS / JavaFX
  48. 48. 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 49
  49. 49. OBRIGADO! Questions and feedbacks? Rafael Toledo rdtoledo@thoughtworks.com speakerdeck.com/rafaeltoledo github.com/rafaeltoledo 50

×