Multiplatform Fractals with Kotlin
_
JetBrains, @jonnyzzz,KTUG Munchen 2018
@jonnyzzz
JetBrains, Kotlin user, phd, developer advocacy
Blogger https://jonnyzzz.com
Kotlin, Java, Go, C/C++, Qt, Toolbox App
Server-side, Desktop, DSLs, fun!
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
https://en.wikipedia.org/wiki/Mandelbrot_set#/media/File:Mandel_zoom_00_mandelbrot_set.jpg
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
Languages Hell
JetBrains, @jonnyzzz,KTUG Munchen 2018
Multiplatform Kotlin
JetBrains, @jonnyzzz,KTUG Munchen 2018
Why Multiplatform
Share common code� Business logic, Utilities, UI-core, DTO, …
Use platform for else� UI, API, Frameworks
JetBrains, @jonnyzzz,KTUG Munchen 2018
JS in JVM�JVM in JS�Native in JS
JetBrains, @jonnyzzz,KTUG Munchen 2018
Kotlin common code
actual / expect
JetBrains, @jonnyzzz,KTUG Munchen 2018
Fractals App
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
JS/JVM/Native Fractals
JS application to try in browser
JVM web server to render fractals
Console application for text-mode fans
JetBrains, @jonnyzzz,KTUG Munchen 2018
The Application
common: Render fractal for a given area
jvm: ktor web app
js: render in browser (fast) and fetch
native: console fractals
JetBrains, @jonnyzzz,KTUG Munchen 2018
Fractals
JetBrains, @jonnyzzz,KTUG Munchen 2018
https://en.wikipedia.org/wiki/Mandelbrot_set#/media/File:Mandel_zoom_00_mandelbrot_set.jpg
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
https://commons.wikimedia.org/wiki/File:Mandel_zoom_04_seehorse_tail.jpg
JetBrains, @jonnyzzz,KTUG Munchen 2018
https://en.wikipedia.org/wiki/Mandelbrot_set#/media/File:Mandelbrot_set_image.png
JetBrains, @jonnyzzz,KTUG Munchen 2018
Complex Numbers?
JetBrains, @jonnyzzz,KTUG Munchen 2018
Complex Numbers
JetBrains, @jonnyzzz,KTUG Munchen 2018
Mandelbrot Set
JetBrains, @jonnyzzz,KTUG Munchen 2018
M = Mandelbrot set
https://en.wikipedia.org/wiki/Mandelbrot_set
JetBrains, @jonnyzzz,KTUG Munchen 2018
https://en.wikipedia.org/wiki/Mandelbrot_set#/media/File:Mandel_zoom_00_mandelbrot_set.jpg
JetBrains, @jonnyzzz,KTUG Munchen 2018
Pixel Color
Depends how fast Zn leaves the 2-area
HSL color space (not RGB)
Magic formula from Wikipedia
Color = HSL( Zn, 60, 80 )
JetBrains, @jonnyzzz,KTUG Munchen 2018
Pixel Color Library
We have no kotlin-common library
expect / actual
a library for JS and JVM
a stub implementation for Native Console App
JetBrains, @jonnyzzz,KTUG Munchen 2018
actual / expected
JetBrains, @jonnyzzz,KTUG Munchen 2018
expect (common)
JetBrains, @jonnyzzz,KTUG Munchen 2018
actual (JVM)
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
HSL in Kotlin/Native
We render to console, monochrome
JetBrains, @jonnyzzz,KTUG Munchen 2018
Demo Time!
JetBrains, @jonnyzzz,KTUG Munchen 2018
Standard Libraries
Kotlin-stdlib� Collections & sequences & functional API� Higher order functions (with, apply, etc)� Exceptions
kotlin.test�infrastructure libraries (e.g. kotlinx.html)
JetBrains, @jonnyzzz,KTUG Munchen 2018
Tests
Multiplatform kotlin.test library
Check your code is OK for every platform
Write once debug everywhere!
JetBrains, @jonnyzzz,KTUG Munchen 2018
Gradle plugins
kotlin-platform-common => common
kotlin-platform-jvm => JVM / Android
kotlin-platform-js => JavaSctipt
konan => Native
JetBrains, @jonnyzzz,KTUG Munchen 2018
expectedBy dependency in Gradle
JetBrains, @jonnyzzz,KTUG Munchen 2018
JavaScript with Kotlin
JetBrains, @jonnyzzz,KTUG Munchen 2018
JavaScript in Kotlin
module.js
common� *.kt
Kotlin/JS
*.kt
JetBrains, @jonnyzzz,KTUG Munchen 2018
JavaScript: kotlin-frontend-plugin
app.js
Webpack
module.js
npm deps
JetBrains, @jonnyzzz,KTUG Munchen 2018
Useful for JavaScript
JetBrains, @jonnyzzz,KTUG Munchen 2018
Useful for Full Stack
JetBrains, @jonnyzzz,KTUG Munchen 2018
KotlinConf App
Common code
Kotlin-JS code
Kotlin-JVM code
Kotlin/Native
JetBrains, @jonnyzzz,KTUG Munchen 2018
Useful Links
JetBrains, @jonnyzzz,KTUG Munchen 2018
Q & A
_
Ask me @jonnyzzz
JetBrains, @jonnyzzz,KTUG Munchen 2018
Trick: Different Libraries?
Use expect for API
Use actual to glue
Logging framework? Networking? JSON? �Android?
JetBrains, @jonnyzzz,KTUG Munchen 2018
Summary
Common code, expect/actual
Code reuse between platforms
Kotlin/Native, Kotlin/JS, Kotlin/JVM
JetBrains, @jonnyzzz,KTUG Munchen 2018
NO TRESPASSING
beyond this slide
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
RGB vs HSL
Common code - on implementation!
JetBrains, @jonnyzzz,KTUG Munchen 2018
HSL in JavaScript
JetBrains, @jonnyzzz,KTUG Munchen 2018
HSL in Java
Same as in JavaScript
Call a copy-pasted Java snippet
No need to convert code to make it work
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
Apache 2.0 / GitHub
JetBrains, @jonnyzzz,KTUG Munchen 2018
Build Applications For
JetBrains, @jonnyzzz,KTUG Munchen 2018
Why Kotlin?
JetBrains, @jonnyzzz,KTUG Munchen 2018
Releases & Commits
<sometime> 2010 | <started> |
15 February 2016 | Kotlin 1.0 |
28 November 2017 | Kotlin 1.2 |
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
Coding Time!
JetBrains, @jonnyzzz,KTUG Munchen 2018
Useful Links
JetBrains, @jonnyzzz,KTUG Munchen 2018
DSLs in Kotlin
JetBrains, @jonnyzzz,KTUG Munchen 2018
DSL
A domain-specific language (DSL) is a computer language specialized to a particular application domain. This is in contrast to a general-purpose language (GPL), which is broadly applicable across domains...
(from Wikipedia)
JetBrains, @jonnyzzz,KTUG Munchen 2018
Specific DSLs
SQL / Regexp
State machines
Custom Stack�JetBrains MPS can help!
JetBrains, @jonnyzzz,KTUG Munchen 2018
Embedded DSLs
Uses existing language
Java-style builders
Fluent APIs
Your current stack
JetBrains, @jonnyzzz,KTUG Munchen 2018
Fluent API. C#
JetBrains, @jonnyzzz,KTUG Munchen 2018
DSLs = Domain Specific ...
Kotlin Syntax 💖 DSLs
Static typed
IDE support, Code Completion, ...
easy to read/write/express/share
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
DSL Coding Time!
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
kotlinx.html�library�on GitHub
JetBrains, @jonnyzzz,KTUG Munchen 2018
Docs
Extension Functions�kotlinlang.org/.../extensions.html
Lambdas�kotlinlang.org/.../lambdas.html
Type-Safe builders�kotlinlang.org/.../type-safe-builders.html
JetBrains, @jonnyzzz,KTUG Munchen 2018
Coroutines
Minimalistic compiler part� suspend keyword
Libraries to provide� fun: async/await, actors, � channels, yield returns, …
JetBrains, @jonnyzzz,KTUG Munchen 2018
generators / yield return
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
kotlinx.coroutines �library�on GitHub
JetBrains, @jonnyzzz,KTUG Munchen 2018
Multiplatform
Common modules� platform independent
Reuse Kotlin code between platforms� expect / actual keywords
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
Kotlin Usage Highlights
JetBrains, @jonnyzzz,KTUG Munchen 2018
At JetBrains
40+ people in Kotlin Team
Used in most JetBrains Products
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
Q & A
JetBrains, @jonnyzzz,KTUG Munchen 2018
Videos / Slides�
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
kotlin.xml.bind
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
coroutine: launch & delay
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
Story: TeamCity.Node
Support for NodeJS related build runners for TeamCity
Released on 14 January 2013
github.com/jonnyzzz/TeamCity.Node
jonnyzzz.com/blog/2013/01/14/kotlin-nodejs-and-teamcity/
JetBrains, @jonnyzzz,KTUG Munchen 2018
What else is possible?
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
What I did with Kotlin?
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
Committer in Spek
JetBrains, @jonnyzzz,KTUG Munchen 2018
kotlin.xml.dsl
JetBrains, @jonnyzzz,KTUG Munchen 2018
kotlin.xml.bind
JetBrains, @jonnyzzz,KTUG Munchen 2018
Story: Config DSLs
JetBrains, @jonnyzzz,KTUG Munchen 2018
Java Server Side
Internal project. Java 1.8, SpringFramework, GRPC, Gradle, HTTP, Jetty
Use from January 2016
New code 99% Kotlin code: � 698 Java vs 404 Kotlin files
JetBrains, @jonnyzzz,KTUG Munchen 2018
Building Kotlin
CMD, Ant
Gradle, Maven
Kobalt
Webpack
IntelliJ IDEA, Android Studio
...
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
Back in 2010: Why Kotlin?
A better language for JetBrains
plus experience in tooling & languages support
C#, Scala, Groovy, JavaScript, C/C++, …
Static, Concise, Effective, Toolable, Interoperable, Pragmatic
JetBrains, @jonnyzzz,KTUG Munchen 2018
Multi Platform Kotlin
JVM
Android (Dalvik)
JavaScript
Native (LLVM), preview
JetBrains, @jonnyzzz,KTUG Munchen 2018
Kotlin in 42 minutes
JetBrains, @jonnyzzz,KTUG Munchen 2018
Show me the code!
JetBrains, @jonnyzzz,KTUG Munchen 2018
100% Java Interop
We have 17+ years codebase in Java
No way to re-write it
.kt and .java files are OK in one module/project
JetBrains, @jonnyzzz,KTUG Munchen 2018
100% Android Friendly
Java bytecode version is 1.6
All language features �(and lambdas) are available
Official on Android
JetBrains, @jonnyzzz,KTUG Munchen 2018
Kotlin for JavaScript
Static typed web programming
Reuse code between platforms
Webpack, React, Gradle support
JetBrains, @jonnyzzz,KTUG Munchen 2018
Kotlin / Native
Preview, Work in Progress
No VM & fast
LLVM� macOS, iOS� Linux, r. Pi
Soon:Windows
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018
JetBrains, @jonnyzzz,KTUG Munchen 2018