1 of 123

Multiplatform Fractals with Kotlin

_

Eugene Petrenko

eugene.petrenko@jetbrains.com

@jonnyzzz

JetBrains, @jonnyzzz,KTUG Munchen 2018

2 of 123

@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

3 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

4 of 123

https://en.wikipedia.org/wiki/Mandelbrot_set#/media/File:Mandel_zoom_00_mandelbrot_set.jpg

JetBrains, @jonnyzzz,KTUG Munchen 2018

5 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

6 of 123

Languages Hell

JetBrains, @jonnyzzz,KTUG Munchen 2018

7 of 123

Multiplatform Kotlin

JetBrains, @jonnyzzz,KTUG Munchen 2018

8 of 123

Why Multiplatform

Share common code� Business logic, Utilities, UI-core, DTO, …

Use platform for else� UI, API, Frameworks

JetBrains, @jonnyzzz,KTUG Munchen 2018

9 of 123

JS in JVM�JVM in JS�Native in JS

JetBrains, @jonnyzzz,KTUG Munchen 2018

10 of 123

Kotlin common code

actual / expect

JetBrains, @jonnyzzz,KTUG Munchen 2018

11 of 123

Fractals App

JetBrains, @jonnyzzz,KTUG Munchen 2018

12 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

13 of 123

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

14 of 123

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

15 of 123

Fractals

JetBrains, @jonnyzzz,KTUG Munchen 2018

16 of 123

https://en.wikipedia.org/wiki/Mandelbrot_set#/media/File:Mandel_zoom_00_mandelbrot_set.jpg

JetBrains, @jonnyzzz,KTUG Munchen 2018

17 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

18 of 123

https://commons.wikimedia.org/wiki/File:Mandel_zoom_04_seehorse_tail.jpg

JetBrains, @jonnyzzz,KTUG Munchen 2018

19 of 123

https://en.wikipedia.org/wiki/Mandelbrot_set#/media/File:Mandelbrot_set_image.png

JetBrains, @jonnyzzz,KTUG Munchen 2018

20 of 123

Complex Numbers?

JetBrains, @jonnyzzz,KTUG Munchen 2018

21 of 123

Complex Numbers

JetBrains, @jonnyzzz,KTUG Munchen 2018

22 of 123

Mandelbrot Set

JetBrains, @jonnyzzz,KTUG Munchen 2018

23 of 123

M = Mandelbrot set

https://en.wikipedia.org/wiki/Mandelbrot_set

JetBrains, @jonnyzzz,KTUG Munchen 2018

24 of 123

https://en.wikipedia.org/wiki/Mandelbrot_set#/media/File:Mandel_zoom_00_mandelbrot_set.jpg

JetBrains, @jonnyzzz,KTUG Munchen 2018

25 of 123

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

26 of 123

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

27 of 123

actual / expected

JetBrains, @jonnyzzz,KTUG Munchen 2018

28 of 123

expect (common)

JetBrains, @jonnyzzz,KTUG Munchen 2018

29 of 123

actual (JVM)

JetBrains, @jonnyzzz,KTUG Munchen 2018

30 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

31 of 123

HSL in Kotlin/Native

We render to console, monochrome

JetBrains, @jonnyzzz,KTUG Munchen 2018

32 of 123

Demo Time!

JetBrains, @jonnyzzz,KTUG Munchen 2018

33 of 123

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

34 of 123

Tests

Multiplatform kotlin.test library

Check your code is OK for every platform

Write once debug everywhere!

JetBrains, @jonnyzzz,KTUG Munchen 2018

35 of 123

Gradle plugins

kotlin-platform-common => common

kotlin-platform-jvm => JVM / Android

kotlin-platform-js => JavaSctipt

konan => Native

JetBrains, @jonnyzzz,KTUG Munchen 2018

36 of 123

expectedBy dependency in Gradle

JetBrains, @jonnyzzz,KTUG Munchen 2018

37 of 123

JavaScript with Kotlin

JetBrains, @jonnyzzz,KTUG Munchen 2018

38 of 123

JavaScript in Kotlin

module.js

common� *.kt

Kotlin/JS

*.kt

JetBrains, @jonnyzzz,KTUG Munchen 2018

39 of 123

JavaScript: kotlin-frontend-plugin

app.js

Webpack

module.js

npm deps

JetBrains, @jonnyzzz,KTUG Munchen 2018

40 of 123

Useful for JavaScript

gradle kotlin-frontend-plugin

npm create-react-kotlin-app

library kotlin-wrappers� react, css, styled-components, etc.

JetBrains, @jonnyzzz,KTUG Munchen 2018

41 of 123

Useful for Full Stack

GitHub kotlin-fullstack-sample� js, jvm

KotlinConf App� js, jvm, iOS, Android

JetBrains, @jonnyzzz,KTUG Munchen 2018

42 of 123

KotlinConf App

Common code

Kotlin-JS code

Kotlin-JVM code

Kotlin/Native

JetBrains, @jonnyzzz,KTUG Munchen 2018

43 of 123

Useful Links

JetBrains, @jonnyzzz,KTUG Munchen 2018

44 of 123

Q & A

_

Ask me @jonnyzzz

JetBrains, @jonnyzzz,KTUG Munchen 2018

45 of 123

Trick: Different Libraries?

Use expect for API

Use actual to glue

Logging framework? Networking? JSON? �Android?

JetBrains, @jonnyzzz,KTUG Munchen 2018

46 of 123

Summary

Common code, expect/actual

Code reuse between platforms

Kotlin/Native, Kotlin/JS, Kotlin/JVM

JetBrains, @jonnyzzz,KTUG Munchen 2018

47 of 123

NO TRESPASSING

beyond this slide

JetBrains, @jonnyzzz,KTUG Munchen 2018

48 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

49 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

50 of 123

RGB vs HSL

Common code - on implementation!

JetBrains, @jonnyzzz,KTUG Munchen 2018

51 of 123

HSL in JavaScript

JetBrains, @jonnyzzz,KTUG Munchen 2018

52 of 123

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

53 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

54 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

55 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

56 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

57 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

58 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

59 of 123

Apache 2.0 / GitHub

JetBrains, @jonnyzzz,KTUG Munchen 2018

60 of 123

Build Applications For

JetBrains, @jonnyzzz,KTUG Munchen 2018

61 of 123

Why Kotlin?

JetBrains, @jonnyzzz,KTUG Munchen 2018

62 of 123

Releases & Commits

<sometime> 2010

<started>

15 February 2016

Kotlin 1.0

28 November 2017

Kotlin 1.2

JetBrains, @jonnyzzz,KTUG Munchen 2018

63 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

64 of 123

Coding Time!

JetBrains, @jonnyzzz,KTUG Munchen 2018

65 of 123

Useful Links

JetBrains, @jonnyzzz,KTUG Munchen 2018

66 of 123

DSLs in Kotlin

JetBrains, @jonnyzzz,KTUG Munchen 2018

67 of 123

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

68 of 123

Specific DSLs

SQL / Regexp

State machines

Custom Stack�JetBrains MPS can help!

JetBrains, @jonnyzzz,KTUG Munchen 2018

69 of 123

Embedded DSLs

Uses existing language

Java-style builders

Fluent APIs

Your current stack

JetBrains, @jonnyzzz,KTUG Munchen 2018

70 of 123

Fluent API. C#

JetBrains, @jonnyzzz,KTUG Munchen 2018

71 of 123

DSLs = Domain Specific ...

Kotlin Syntax 💖 DSLs

Static typed

IDE support, Code Completion, ...

easy to read/write/express/share

JetBrains, @jonnyzzz,KTUG Munchen 2018

72 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

73 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

74 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

75 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

76 of 123

DSL Coding Time!

JetBrains, @jonnyzzz,KTUG Munchen 2018

77 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

78 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

79 of 123

kotlinx.html�library�on GitHub

JetBrains, @jonnyzzz,KTUG Munchen 2018

80 of 123

Docs

JetBrains, @jonnyzzz,KTUG Munchen 2018

81 of 123

Coroutines

Minimalistic compiler part� suspend keyword

Libraries to provide� fun: async/await, actors, � channels, yield returns, …

JetBrains, @jonnyzzz,KTUG Munchen 2018

82 of 123

generators / yield return

JetBrains, @jonnyzzz,KTUG Munchen 2018

83 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

84 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

85 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

86 of 123

kotlinx.coroutines �library�on GitHub

JetBrains, @jonnyzzz,KTUG Munchen 2018

87 of 123

Multiplatform

Common modules� platform independent

Reuse Kotlin code between platforms� expect / actual keywords

JetBrains, @jonnyzzz,KTUG Munchen 2018

88 of 123

App in Kotlin� Server-side

Android / iOS� Web

https://github.com/jetbrains/kotlinconf-app

JetBrains, @jonnyzzz,KTUG Munchen 2018

89 of 123

Kotlin Usage Highlights

JetBrains, @jonnyzzz,KTUG Munchen 2018

90 of 123

At JetBrains

40+ people in Kotlin Team

Used in most JetBrains Products

JetBrains, @jonnyzzz,KTUG Munchen 2018

91 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

92 of 123

Q & A

JetBrains, @jonnyzzz,KTUG Munchen 2018

93 of 123

Videos / Slides�

kotlinconf.com

JetBrains, @jonnyzzz,KTUG Munchen 2018

94 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

95 of 123

kotlin.xml.bind

JetBrains, @jonnyzzz,KTUG Munchen 2018

96 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

97 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

98 of 123

coroutine: launch & delay

JetBrains, @jonnyzzz,KTUG Munchen 2018

99 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

100 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

101 of 123

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

102 of 123

What else is possible?

JetBrains, @jonnyzzz,KTUG Munchen 2018

103 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

104 of 123

What I did with Kotlin?

JetBrains, @jonnyzzz,KTUG Munchen 2018

105 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

106 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

107 of 123

Committer in Spek

JetBrains, @jonnyzzz,KTUG Munchen 2018

108 of 123

kotlin.xml.dsl

JetBrains, @jonnyzzz,KTUG Munchen 2018

109 of 123

kotlin.xml.bind

JetBrains, @jonnyzzz,KTUG Munchen 2018

110 of 123

Story: Config DSLs

A XML configuration files editor via Kotlin DSL

jonnyzzz/TeamCity2DSL

jonnyzzz/Log4j2DSL

JetBrains, @jonnyzzz,KTUG Munchen 2018

111 of 123

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

112 of 123

Building Kotlin

CMD, Ant

Gradle, Maven

Kobalt

Webpack

IntelliJ IDEA, Android Studio

...

JetBrains, @jonnyzzz,KTUG Munchen 2018

113 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

114 of 123

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

115 of 123

Multi Platform Kotlin

JVM

Android (Dalvik)

JavaScript

Native (LLVM), preview

JetBrains, @jonnyzzz,KTUG Munchen 2018

116 of 123

Kotlin in 42 minutes

JetBrains, @jonnyzzz,KTUG Munchen 2018

117 of 123

Show me the code!

JetBrains, @jonnyzzz,KTUG Munchen 2018

118 of 123

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

119 of 123

100% Android Friendly

Java bytecode version is 1.6

All language features �(and lambdas) are available

Official on Android

JetBrains, @jonnyzzz,KTUG Munchen 2018

120 of 123

Kotlin for JavaScript

Static typed web programming

Reuse code between platforms

Webpack, React, Gradle support

JetBrains, @jonnyzzz,KTUG Munchen 2018

121 of 123

Kotlin / Native

Preview, Work in Progress

No VM & fast

LLVM� macOS, iOS� Linux, r. Pi

Soon:Windows

JetBrains, @jonnyzzz,KTUG Munchen 2018

122 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018

123 of 123

JetBrains, @jonnyzzz,KTUG Munchen 2018