SlideShare uma empresa Scribd logo
1 de 50
Baixar para ler offline
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: standard library & runtime ~100Kb
● Tempo de Compilação não é mais um problema
● Tooling evoluindo
6
https://bit.ly/2ATKly0
Por que usar Kotlin no desenvolvimento para JVM?
● Expressividade
● Escalabilidade & Performance - Kotlin Coroutines
● Interoperabilidade com código já existente - migração gradual
● Tooling
8
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ível e depurável
● Compatibilidade com código JavaScript pré-existente
● Mesmas features da Standard Library da JVM - incluindo Coroutines
12
https://github.com/JetBrains/kotlin-wrappers
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
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 = "content") {
h1 {
+"Hello!"
}
}
}
}
fun RBuilder.hello() = child(HelloComponent::class) { }
16
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
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
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
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
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
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
Integração com IDE
23
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
MÓDULOS
MULTIPLATAFORMA
25
Kotlin Multiplataforma
● Suporte introduzido na versão 1.2
● JVM & JavaScript (Native "meio que" funciona)
● módulos common, platform e regular
26
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
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
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
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
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
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
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
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
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
Multiplatform Module - Common code
package com.example.foo
expect class Foo(bar: String) {
fun frob()
}
fun main(args: Array<String>) {
Foo("Hello").frob()
}
36
Multiplatform Module - JVM implementation
package com.example.foo
actual class Foo actual constructor(val bar: String) {
actual fun frob() {
println("Frobbing the $bar")
}
}
37
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 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
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
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
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 IN ACTION
https://www.manning.com/books/kotlin-in-action
49
OBRIGADO!
Questions and feedbacks?
Rafael Toledo
rdtoledo@thoughtworks.com
speakerdeck.com/rafaeltoledo
github.com/rafaeltoledo
50

Mais conteúdo relacionado

Mais procurados

Estaleiro o uso de kubernetes no serpro
Estaleiro   o uso de kubernetes no serproEstaleiro   o uso de kubernetes no serpro
Estaleiro o uso de kubernetes no serproRicardo Katz
 
12 factor app. Melhor com Docker
12 factor app. Melhor com Docker12 factor app. Melhor com Docker
12 factor app. Melhor com DockerWellington Silva
 
TDC 2015 POA - O Fantástico Mundo de Docker
TDC 2015 POA - O Fantástico Mundo de DockerTDC 2015 POA - O Fantástico Mundo de Docker
TDC 2015 POA - O Fantástico Mundo de DockerStefan Teixeira
 
Troubleshooting docker
Troubleshooting dockerTroubleshooting docker
Troubleshooting dockerRafael Gomes
 
CRI-O - TDC Floripa 2018
CRI-O - TDC Floripa 2018CRI-O - TDC Floripa 2018
CRI-O - TDC Floripa 2018Jonh Wendell
 
Docker + Kubernetes: Orquestrando containers e escalando rapidamente suas apl...
Docker + Kubernetes: Orquestrando containers e escalando rapidamente suas apl...Docker + Kubernetes: Orquestrando containers e escalando rapidamente suas apl...
Docker + Kubernetes: Orquestrando containers e escalando rapidamente suas apl...Renato Groff
 
Docker de ponta a ponta: do Desenvolvimento à Nuvem - Azure Talks - Agosto-2018
Docker de ponta a ponta: do Desenvolvimento à Nuvem - Azure Talks - Agosto-2018Docker de ponta a ponta: do Desenvolvimento à Nuvem - Azure Talks - Agosto-2018
Docker de ponta a ponta: do Desenvolvimento à Nuvem - Azure Talks - Agosto-2018Renato Groff
 
Docker de ponta a ponta - do Desenvolvimento à Nuvem - .NET SP - Outubro-2018
Docker de ponta a ponta - do Desenvolvimento à Nuvem - .NET SP - Outubro-2018Docker de ponta a ponta - do Desenvolvimento à Nuvem - .NET SP - Outubro-2018
Docker de ponta a ponta - do Desenvolvimento à Nuvem - .NET SP - Outubro-2018Renato Groff
 
Qt tchelinux-2010
Qt tchelinux-2010Qt tchelinux-2010
Qt tchelinux-2010Wagner Reck
 
Deploying Docker Containers
Deploying Docker ContainersDeploying Docker Containers
Deploying Docker ContainersHugo Henley
 
O poder do Docker (7 Masters)
O poder do Docker (7 Masters)O poder do Docker (7 Masters)
O poder do Docker (7 Masters)Wellington Silva
 
Testadores 2015 - O Fantástico Mundo de Docker
Testadores 2015 - O Fantástico Mundo de DockerTestadores 2015 - O Fantástico Mundo de Docker
Testadores 2015 - O Fantástico Mundo de DockerStefan Teixeira
 
TDC 2016 Floripa - Workshop docker
TDC 2016 Floripa - Workshop dockerTDC 2016 Floripa - Workshop docker
TDC 2016 Floripa - Workshop dockerRafael Gomes
 

Mais procurados (20)

Java em 2021
Java em 2021Java em 2021
Java em 2021
 
Estaleiro o uso de kubernetes no serpro
Estaleiro   o uso de kubernetes no serproEstaleiro   o uso de kubernetes no serpro
Estaleiro o uso de kubernetes no serpro
 
12 factor app. Melhor com Docker
12 factor app. Melhor com Docker12 factor app. Melhor com Docker
12 factor app. Melhor com Docker
 
Iniciando com kubernetes
Iniciando com kubernetesIniciando com kubernetes
Iniciando com kubernetes
 
5. rodando containers docker na aws
5. rodando containers docker na aws5. rodando containers docker na aws
5. rodando containers docker na aws
 
TDC 2015 POA - O Fantástico Mundo de Docker
TDC 2015 POA - O Fantástico Mundo de DockerTDC 2015 POA - O Fantástico Mundo de Docker
TDC 2015 POA - O Fantástico Mundo de Docker
 
Troubleshooting docker
Troubleshooting dockerTroubleshooting docker
Troubleshooting docker
 
CRI-O - TDC Floripa 2018
CRI-O - TDC Floripa 2018CRI-O - TDC Floripa 2018
CRI-O - TDC Floripa 2018
 
Docker + Kubernetes: Orquestrando containers e escalando rapidamente suas apl...
Docker + Kubernetes: Orquestrando containers e escalando rapidamente suas apl...Docker + Kubernetes: Orquestrando containers e escalando rapidamente suas apl...
Docker + Kubernetes: Orquestrando containers e escalando rapidamente suas apl...
 
Docker de ponta a ponta: do Desenvolvimento à Nuvem - Azure Talks - Agosto-2018
Docker de ponta a ponta: do Desenvolvimento à Nuvem - Azure Talks - Agosto-2018Docker de ponta a ponta: do Desenvolvimento à Nuvem - Azure Talks - Agosto-2018
Docker de ponta a ponta: do Desenvolvimento à Nuvem - Azure Talks - Agosto-2018
 
Docker de ponta a ponta - do Desenvolvimento à Nuvem - .NET SP - Outubro-2018
Docker de ponta a ponta - do Desenvolvimento à Nuvem - .NET SP - Outubro-2018Docker de ponta a ponta - do Desenvolvimento à Nuvem - .NET SP - Outubro-2018
Docker de ponta a ponta - do Desenvolvimento à Nuvem - .NET SP - Outubro-2018
 
Qt tchelinux-2010
Qt tchelinux-2010Qt tchelinux-2010
Qt tchelinux-2010
 
Deploying Docker Containers
Deploying Docker ContainersDeploying Docker Containers
Deploying Docker Containers
 
Conceitos Basicos e Docker - Java Noroeste
Conceitos Basicos e Docker - Java NoroesteConceitos Basicos e Docker - Java Noroeste
Conceitos Basicos e Docker - Java Noroeste
 
O poder do Docker (7 Masters)
O poder do Docker (7 Masters)O poder do Docker (7 Masters)
O poder do Docker (7 Masters)
 
Estudo de caso - Uso Docker no Desenvolvimento
Estudo de caso - Uso Docker no DesenvolvimentoEstudo de caso - Uso Docker no Desenvolvimento
Estudo de caso - Uso Docker no Desenvolvimento
 
Precisamos falar sobre Gradle
Precisamos falar sobre GradlePrecisamos falar sobre Gradle
Precisamos falar sobre Gradle
 
Workshop Docker
Workshop DockerWorkshop Docker
Workshop Docker
 
Testadores 2015 - O Fantástico Mundo de Docker
Testadores 2015 - O Fantástico Mundo de DockerTestadores 2015 - O Fantástico Mundo de Docker
Testadores 2015 - O Fantástico Mundo de Docker
 
TDC 2016 Floripa - Workshop docker
TDC 2016 Floripa - Workshop dockerTDC 2016 Floripa - Workshop docker
TDC 2016 Floripa - Workshop docker
 

Semelhante a Kotlin Multiplataforma: compartilhando código entre plataformas

Kotlin no Android: desbravando as oportunidades de ponta a ponta!
Kotlin no Android: desbravando as oportunidades de ponta a ponta! Kotlin no Android: desbravando as oportunidades de ponta a ponta!
Kotlin no Android: desbravando as oportunidades de ponta a ponta! iMasters
 
ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014Giovanni Bassi
 
TDC2018SP | Trilha Kotlin - Kodando com Kotlin aplicacoes front-end.
TDC2018SP | Trilha Kotlin - Kodando com Kotlin aplicacoes front-end.TDC2018SP | Trilha Kotlin - Kodando com Kotlin aplicacoes front-end.
TDC2018SP | Trilha Kotlin - Kodando com Kotlin aplicacoes front-end.tdc-globalcode
 
Interop itcare: Interoperabilidade Java e .NET
Interop itcare: Interoperabilidade Java e .NETInterop itcare: Interoperabilidade Java e .NET
Interop itcare: Interoperabilidade Java e .NETAlessandro Binhara
 
TDC2016SP - O que há de novo no Entity Framework Core 1.0
TDC2016SP - O que há de novo no Entity Framework Core 1.0TDC2016SP - O que há de novo no Entity Framework Core 1.0
TDC2016SP - O que há de novo no Entity Framework Core 1.0tdc-globalcode
 
Entity Framework 7.0 a.k.a Entity Core 1.0
Entity Framework 7.0 a.k.a Entity Core 1.0Entity Framework 7.0 a.k.a Entity Core 1.0
Entity Framework 7.0 a.k.a Entity Core 1.0Caliel Costa
 
TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...
TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...
TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...tdc-globalcode
 
TDC2016POA | Trilha .NET - .NET Entity Core 1.0
TDC2016POA | Trilha .NET - .NET Entity Core 1.0TDC2016POA | Trilha .NET - .NET Entity Core 1.0
TDC2016POA | Trilha .NET - .NET Entity Core 1.0tdc-globalcode
 
Porque eu deveria usar TypeScript?
Porque eu deveria usar TypeScript?Porque eu deveria usar TypeScript?
Porque eu deveria usar TypeScript?Caliel Costa
 
.NET 6: O que há de novo e o que está por vir?
.NET 6: O que há de novo e o que está por vir?.NET 6: O que há de novo e o que está por vir?
.NET 6: O que há de novo e o que está por vir?akamud
 
.NET 6: O que há de novo e o que está por vir?
.NET 6: O que há de novo e o que está por vir?.NET 6: O que há de novo e o que está por vir?
.NET 6: O que há de novo e o que está por vir?Letticia Nicoli
 
Desenvolvimento web no Linux
Desenvolvimento web no LinuxDesenvolvimento web no Linux
Desenvolvimento web no LinuxEduardo Rozario
 
JS Experience 2017 - WebAssembly na Prática
JS Experience 2017 - WebAssembly na PráticaJS Experience 2017 - WebAssembly na Prática
JS Experience 2017 - WebAssembly na PráticaiMasters
 
.NET 2015, ASP.NET 5, C# 6 e tudo mais
.NET 2015, ASP.NET 5, C# 6 e tudo mais.NET 2015, ASP.NET 5, C# 6 e tudo mais
.NET 2015, ASP.NET 5, C# 6 e tudo maisakamud
 
O novo IBM COBOL ENTERPRISE V5/V6 para zOS e o IBM ABO
O novo IBM COBOL ENTERPRISE V5/V6 para zOS e o IBM ABOO novo IBM COBOL ENTERPRISE V5/V6 para zOS e o IBM ABO
O novo IBM COBOL ENTERPRISE V5/V6 para zOS e o IBM ABOPaulo Batuta
 
Aplicações 12 fatores, melhor com Docker
Aplicações 12 fatores, melhor com DockerAplicações 12 fatores, melhor com Docker
Aplicações 12 fatores, melhor com DockerWellington Silva
 

Semelhante a Kotlin Multiplataforma: compartilhando código entre plataformas (20)

Kotlin no Android: desbravando as oportunidades de ponta a ponta!
Kotlin no Android: desbravando as oportunidades de ponta a ponta! Kotlin no Android: desbravando as oportunidades de ponta a ponta!
Kotlin no Android: desbravando as oportunidades de ponta a ponta!
 
ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014
 
TDC2018SP | Trilha Kotlin - Kodando com Kotlin aplicacoes front-end.
TDC2018SP | Trilha Kotlin - Kodando com Kotlin aplicacoes front-end.TDC2018SP | Trilha Kotlin - Kodando com Kotlin aplicacoes front-end.
TDC2018SP | Trilha Kotlin - Kodando com Kotlin aplicacoes front-end.
 
Kotlin first
Kotlin firstKotlin first
Kotlin first
 
Interop itcare: Interoperabilidade Java e .NET
Interop itcare: Interoperabilidade Java e .NETInterop itcare: Interoperabilidade Java e .NET
Interop itcare: Interoperabilidade Java e .NET
 
TotalCross Mini Curso
TotalCross Mini Curso TotalCross Mini Curso
TotalCross Mini Curso
 
TDC2016SP - O que há de novo no Entity Framework Core 1.0
TDC2016SP - O que há de novo no Entity Framework Core 1.0TDC2016SP - O que há de novo no Entity Framework Core 1.0
TDC2016SP - O que há de novo no Entity Framework Core 1.0
 
Entity Framework 7.0 a.k.a Entity Core 1.0
Entity Framework 7.0 a.k.a Entity Core 1.0Entity Framework 7.0 a.k.a Entity Core 1.0
Entity Framework 7.0 a.k.a Entity Core 1.0
 
TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...
TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...
TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...
 
Desenvolvendo aplicações web com GWT
Desenvolvendo aplicações web com GWTDesenvolvendo aplicações web com GWT
Desenvolvendo aplicações web com GWT
 
TDC2016POA | Trilha .NET - .NET Entity Core 1.0
TDC2016POA | Trilha .NET - .NET Entity Core 1.0TDC2016POA | Trilha .NET - .NET Entity Core 1.0
TDC2016POA | Trilha .NET - .NET Entity Core 1.0
 
Porque eu deveria usar TypeScript?
Porque eu deveria usar TypeScript?Porque eu deveria usar TypeScript?
Porque eu deveria usar TypeScript?
 
.NET 6: O que há de novo e o que está por vir?
.NET 6: O que há de novo e o que está por vir?.NET 6: O que há de novo e o que está por vir?
.NET 6: O que há de novo e o que está por vir?
 
.NET 6: O que há de novo e o que está por vir?
.NET 6: O que há de novo e o que está por vir?.NET 6: O que há de novo e o que está por vir?
.NET 6: O que há de novo e o que está por vir?
 
Desenvolvimento web no Linux
Desenvolvimento web no LinuxDesenvolvimento web no Linux
Desenvolvimento web no Linux
 
Desenvolvimento iOS
Desenvolvimento iOSDesenvolvimento iOS
Desenvolvimento iOS
 
JS Experience 2017 - WebAssembly na Prática
JS Experience 2017 - WebAssembly na PráticaJS Experience 2017 - WebAssembly na Prática
JS Experience 2017 - WebAssembly na Prática
 
.NET 2015, ASP.NET 5, C# 6 e tudo mais
.NET 2015, ASP.NET 5, C# 6 e tudo mais.NET 2015, ASP.NET 5, C# 6 e tudo mais
.NET 2015, ASP.NET 5, C# 6 e tudo mais
 
O novo IBM COBOL ENTERPRISE V5/V6 para zOS e o IBM ABO
O novo IBM COBOL ENTERPRISE V5/V6 para zOS e o IBM ABOO novo IBM COBOL ENTERPRISE V5/V6 para zOS e o IBM ABO
O novo IBM COBOL ENTERPRISE V5/V6 para zOS e o IBM ABO
 
Aplicações 12 fatores, melhor com Docker
Aplicações 12 fatores, melhor com DockerAplicações 12 fatores, melhor com Docker
Aplicações 12 fatores, melhor com Docker
 

Mais de iMasters

O que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani MonteiroO que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani MonteiroiMasters
 
Postgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio TellesPostgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio TellesiMasters
 
Por que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen MoraesPor que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen MoraesiMasters
 
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...iMasters
 
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalvesORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalvesiMasters
 
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...iMasters
 
Arquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra MartinsArquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra MartinsiMasters
 
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...iMasters
 
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana ChahoudDesenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana ChahoudiMasters
 
Use MDD e faça as máquinas trabalharem para você - Andreza Leite
 Use MDD e faça as máquinas trabalharem para você - Andreza Leite Use MDD e faça as máquinas trabalharem para você - Andreza Leite
Use MDD e faça as máquinas trabalharem para você - Andreza LeiteiMasters
 
Entendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita BernardesEntendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita BernardesiMasters
 
Backend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana ArnosBackend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana ArnosiMasters
 
Dicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato GroffeDicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato GroffeiMasters
 
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle MonteiroiMasters
 
Quem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio MaujorQuem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio MaujoriMasters
 
Service Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da SilvaService Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da SilvaiMasters
 
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto PascuttiErros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto PascuttiiMasters
 
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...iMasters
 
Construindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina KarklisConstruindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina KarklisiMasters
 
Monitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe RegalgoMonitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe RegalgoiMasters
 

Mais de iMasters (20)

O que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani MonteiroO que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
 
Postgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio TellesPostgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio Telles
 
Por que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen MoraesPor que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen Moraes
 
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
 
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalvesORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
 
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
 
Arquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra MartinsArquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra Martins
 
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
 
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana ChahoudDesenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
 
Use MDD e faça as máquinas trabalharem para você - Andreza Leite
 Use MDD e faça as máquinas trabalharem para você - Andreza Leite Use MDD e faça as máquinas trabalharem para você - Andreza Leite
Use MDD e faça as máquinas trabalharem para você - Andreza Leite
 
Entendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita BernardesEntendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita Bernardes
 
Backend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana ArnosBackend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana Arnos
 
Dicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato GroffeDicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato Groffe
 
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
 
Quem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio MaujorQuem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio Maujor
 
Service Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da SilvaService Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da Silva
 
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto PascuttiErros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
 
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...
 
Construindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina KarklisConstruindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina Karklis
 
Monitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe RegalgoMonitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe Regalgo
 

Kotlin Multiplataforma: compartilhando código entre plataformas

  • 1. KOTLIN Compartilhando código com Kotlin Multiplataforma
  • 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
  • 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
  • 10. JavaFX Framework for Kotlin https://github.com/edvin/tornadofx
  • 11. Ktor for building servers and clients https://ktor.io
  • 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
  • 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. KotlinJS - jQuery fun main(args: Array<String>) { jq("#message").html("Hello from Kotlin") } 15
  • 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. 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. 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. 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. 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. 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. 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
  • 26. Kotlin Multiplataforma ● Suporte introduzido na versão 1.2 ● JVM & JavaScript (Native "meio que" funciona) ● módulos common, platform e regular 26
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Multiplatform Module - JVM implementation package com.example.foo actual class Foo actual constructor(val bar: String) { actual fun frob() { println("Frobbing the $bar") } } 37
  • 40. KOTLIN GRADLE DSL Bonus - por que não usar em todo o projeto então?
  • 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. 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. 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
  • 45. a gente tivesse um projeto definitivamente full stack em Kotlin? 45
  • 46.
  • 50. OBRIGADO! Questions and feedbacks? Rafael Toledo rdtoledo@thoughtworks.com speakerdeck.com/rafaeltoledo github.com/rafaeltoledo 50