SlideShare a Scribd company logo
Kotlin as an
AltJS
@mike_neck
おことわり
• たぶん15分も話せません
• いろいろ言い訳ありますが…
• 要するに雑に話します
Kotlin as an AltJS
誰?
• 持田真哉(@mike_neck)
• たんなるJava、Groovy好きのおっさん
• Kotlin歴3時間弱
Kotlin as an AltJS
概要
• モティベーション
• Java使いにとってのAltJSの候補
• Interoperating with existing JS libs
• Kotlin as an AltJS
Kotlin as an AltJS
モティベーション
生JS書きたくない
普通のプログラミングしたい
モティベーション
• 普通のプログラミングとは?(あくまで私見です)
• 型があって、不正な操作はコンパイル時にエラー
にしてくれる
• IDE(IntelliJ IDEA)で補完してくれる
• 欲を言えばGradleでビルドできる
• 老害脳なので、新しいツール覚えるの辛い
Java使いにとってのAltJS
• TypeScript
• Scala.js
• Kotlin
• ClojureScript…ごめんLisp覚えるの辛い
キワモノから…
Java使いにとってのAltJS
Kotlin
• デフォルトでJavaScriptへのコンパイルをサポートしている
better Java
• Java、C#やっていれば学習コストは大して高くない
• 生成されるJavaScriptはそこそこ複雑
• JetBrains製なのでIntelliJ IDEAでもサクサク書ける
• 対応している既存JSライブラリーがjQueryしかない
• kotlin2jsプラグインでGradleでもビルドできる
Java使いにとってのAltJS
Scala.js
• ScalaコンパイラーのプラグインでJavaScriptを生成する
• それなりに学習コストが高い(私見です)
• 生成されるJavaScriptが巨大
• IntelliJのScalaプラグインによってそこそこ補完が効く
• jQuery、Angular、Reactに対応するライブラリーがある
• sbtという人間には早すぎたビルドツールが必要(0.6.0からはMaven/
Gradleでも利用可能にするためにMaven artifact化しているらしいけ
ど、現在プラグインがない)
Java使いにとってのAltJS
TypeScript
• JavaScriptを拡張したAltJS
• Java、C#やってれば学習コストは大して高くない
• 生成されるJavaScriptはシンプル
• IntelliJ IDEAで補完が効くのでサクサク書ける
• エコシステム(DefinitelyTypedのd.ts)が豊富
• Gradleプラグインがあった!
• sothmann/typescript-gradle-plugin
• grezi/gradle-typescript-plugin
Java使いにとってのAltJS
悪いこと言わないから
TypeScriptを使え
Java使いにとってのAltJS
おわり
・・・
Kotlinの勉強会でし
たね…
Interoperating with
existing JS libraries
• インターフェースを作る必要がある
• native(“foo”)のような形で既存JSライブラリーのインター
フェースを準備する
• 中身は実装する必要ないのでnoImplを指定する
• 型安全なハンドラーを指定したい場合はジェネリクスを用い
る
• 型安全にしたいからKotlinを使うのであって、Any使って
たらあまり意味無いですよね
jQueryのajax関数
(kotlin-js-libraryでは未定義)を使う
import jquery.jq
public fun main(args: Array<String>) {
jq {
jq(“.button”).click(e -> {
val options = ajaxOptions(
“greeting”, “GET”,
Person(“foo”,”bar”))
ajax<Message,Any>(options)
.done { msg, raw, jqXHR ->
jq(“name”).text(msg.text)
jq(“message”).text(msg.message)
}
})
}
}
Interoperating with existing JS libs
自分で既存JSライブラリーの
インターフェースを定義する
native(“$.ajax”)
public fun ajax<R,E>(
options: jqAjaxOption):
jqPromise<R,E> = noImpl
native(“jqXHR”)
open class jqPromise<R,E>() {
fun done(handler:
(R,String,jqDeferred<R,E>)->Unit):
jqDeferred<R,E> = noImpl
fun fail(handler:
(jqDeferred<R,E>,String,E)->Unit):
jqDeferred<R,E> = noImpl
}
Interoperating with existing JS libs
自分で既存JSライブラリーの
インターフェースを定義する
native(“$.ajax”)
public fun ajax<R,E>(
options: jqAjaxOption):
jqPromise<R,E> = noImpl
native(“jqXHR”)
open class jqPromise<R,E>() {
fun done(handler:
(R,String,jqDeferred<R,E>)->Unit):
jqDeferred<R,E> = noImpl
fun fail(handler:
(jqDeferred<R,E>,String,E)->Unit):
jqDeferred<R,E> = noImpl
}
Interoperating with existing JS libs
nativeアノテーションで
JavaScriptにコンパイルし
た時の出力される名前を指定
自分で既存JSライブラリーの
インターフェースを定義する
native(“$.ajax”)
public fun ajax<R,E>(
options: jqAjaxOption):
jqPromise<R,E> = noImpl
native(“jqXHR”)
open class jqPromise<R,E>() {
fun done(handler:
(R,String,jqDeferred<R,E>)->Unit):
jqDeferred<R,E> = noImpl
fun fail(handler:
(jqDeferred<R,E>,String,E)->Unit):
jqDeferred<R,E> = noImpl
}
Interoperating with existing JS libs
実装はいらないのでnoImpl
を指定する
自分で既存JSライブラリーの
インターフェースを定義する
native(“$.ajax”)
public fun ajax<R,E>(
options: jqAjaxOption):
jqPromise<R,E> = noImpl
native(“jqXHR”)
open class jqPromise<R,E>() {
fun done(handler:
(R,String,jqDeferred<R,E>)->Unit):
jqDeferred<R,E> = noImpl
fun fail(handler:
(jqDeferred<R,E>,String,E)->Unit):
jqDeferred<R,E> = noImpl
}
Interoperating with existing JS libs
ハンドラーの引数は型安全に
したいのでジェネリクスを付
ける
Interoperating with
existing JS libraries
• JavaScriptのシンプルなオブジェクトが欲しい場
合
• 普通のclassを用いれば後はよしなにやってくれる
class Person(
val firstName: String,
val lastName: String)
// Person(“foo”, “bar”)
// -> {firstName:”foo”, lastName: “bar”}
Interoperating with
existing JS libraries
• 落とし穴
• deep copyをするなどのJavaScriptの実装によっては実
行時エラーが発生する
class jqAjaxOption<T>(
val url: String,
val method: String,
val data: T)
// jQueryがdataパラメーターを処理しているときに
// cannot set property ‘firstName’ of undefined
// のようなエラーが発生する
Interoperating with
existing JS libraries
• 解決策
• json(Pair<String,Any>…): Json を使う
interface JsonSerializable {
fun asJson(): Json
}
class Person(
val firstName: String, val lastName: String):
JsonSerializable {
override fun asJson(): Json {
return json(Pair(“firstName”,firstName),
Pair(“lastName”, lastName))
}
}
Kotlin as an AltJS
• まだAltJSとして使うにはつらいところが多々ある
• Kotlinから生成されるJavaScriptの品質につい
てはJetBrainsに頑張ってもらう一方で、ユー
ザーである我々もフィードバックしていくことが望
まれる
• Kotlinが使ってもらえるAltJSとなるには、エコ
システムの構築にカギがある
Kotlin as an AltJS
• TypeScript
• DefinitelyTypedプロジェクトによるエコシ
ステム
• tsdやdtsmのような簡易に型情報を収集する
ツール
Kotlin as an AltJS
• Scala.js
• scala-js.orgでライブラリーへのリンクが貼ってあ
る
• 基本的なスタンスは「sbtで取ってきてね」という感じ
• 最初はギャグと言われていたけど、Scalaのユーザー
数が増えているのでScala.jsのエコシステムも充実し
つつあるという印象
Kotlin as an AltJS
• AltJSとしてKotlinを使ってもらうためには…
• エコシステムの構築
• レポジトリーの構築
• 必要なライブラリーを管理するツールの構築
• そもそものユーザー数を増やしていく
• ちなみにKotlin自体は3時間さわった感じでは、よい言語に分類でき
ると思ってます
おわり
Kotlin as an AltJS

More Related Content

PDF
Kotlinのwebフレームワーク探訪
PDF
Kotlinこんなん出ましたけど
PDF
普段C#を使っている僕から見たKotlin
PPTX
Spring boot劇的ビフォーアフター
PDF
Kotlinメジャーver リリースを前に
PDF
KuromojiをKotlinで動かす
PDF
Kotlinあるある言いたい
PDF
3分で作る Kotlin Friendly な API
Kotlinのwebフレームワーク探訪
Kotlinこんなん出ましたけど
普段C#を使っている僕から見たKotlin
Spring boot劇的ビフォーアフター
Kotlinメジャーver リリースを前に
KuromojiをKotlinで動かす
Kotlinあるある言いたい
3分で作る Kotlin Friendly な API

What's hot (20)

PDF
Kotlinソースコード探訪
PDF
KotlinつかってQiitaクライアント作った時の話
PDF
KotlinAndroidLibを使ってみた
PDF
Kotlinにお触り
PDF
Kotlinで快適Android開発 #W8lt
PDF
NDS36 Kotlin Cute
PDF
言語設計者が意味論を書くときに考えていたこと
PDF
コルーチンの実装について
PDF
Rubyistのためのkotlin紹介
PDF
Kotlinの紹介
PDF
KotlinでWebアプリ開発
PPTX
オープンセミナー香川2012 LT
PPTX
Kids, Ruby, Fun! ぼくたち、 Rubyプログラミング少年団! 〜小学生からはじめる Ruby プログラミング〜
PDF
Potato03 KotlinでAndroidアプリ開発(後編)
PPTX
Java8 code kata (Japanese)
PDF
かわいいKotlinでAndroidアプリをつくろう
PPT
LDDによるWebアプリケーション開発
PDF
Kanrk05 .Netでお仕事しているプログラマがスクリプト言語として使うRuby
PDF
Play meetup 2 2015.07.05
PDF
オブジェクト指向プログラマが今関数型言語を学ばないといけない理由
Kotlinソースコード探訪
KotlinつかってQiitaクライアント作った時の話
KotlinAndroidLibを使ってみた
Kotlinにお触り
Kotlinで快適Android開発 #W8lt
NDS36 Kotlin Cute
言語設計者が意味論を書くときに考えていたこと
コルーチンの実装について
Rubyistのためのkotlin紹介
Kotlinの紹介
KotlinでWebアプリ開発
オープンセミナー香川2012 LT
Kids, Ruby, Fun! ぼくたち、 Rubyプログラミング少年団! 〜小学生からはじめる Ruby プログラミング〜
Potato03 KotlinでAndroidアプリ開発(後編)
Java8 code kata (Japanese)
かわいいKotlinでAndroidアプリをつくろう
LDDによるWebアプリケーション開発
Kanrk05 .Netでお仕事しているプログラマがスクリプト言語として使うRuby
Play meetup 2 2015.07.05
オブジェクト指向プログラマが今関数型言語を学ばないといけない理由
Ad

More from Shinya Mochida (20)

PDF
サーバーサイド Kotlin のテストフレームワーク事情
PDF
IntelliJ IDEA を完全にマスターする話
PDF
クリーンアーキテクチャーを強制する方法を考えてみた(N番煎じ) #すえなみチャンス暑気払い
PDF
jjug-ccc 2019 Spring 発表資料 Collections Framework 入門 #jjug #jjug_ccc #ccc_c1
PDF
swift-log について
PDF
Vim 入門
PDF
Java プログラマーのための Swift 入門 #中央線Meetup
PDF
swift-nio のアーキテクチャーと RxHttpClient
PDF
JJUG CCC 2018 Spring - I-7 (俺が)はじめての Netty
PDF
JJUG CCC 2018 Spring LT Spring Boot アプリケーションの起動を速くする 108 の Tips #jjug_ccc #jjug
PDF
Spring Boot アプリケーションの起動をほんの少し気持ちだけ速くしてみた
PDF
Javaモジュールシステム雑なまとめ
PDF
JavaのStreamで学ぶ遅延処理実装パターン
PDF
gradle2.4のルールベースモデルコンフィギュレーション
PDF
On stream-lazy-computation
PDF
Stream脳の作り方
PDF
Java8のstreamをダラダラまとめてみる
PDF
ドラクエの金銭感覚
PDF
30億のデバイスで走るjavaを支えるjavaエコシステム
PDF
Intelli j vs-eclipse-by-mike-neck #jbugj
サーバーサイド Kotlin のテストフレームワーク事情
IntelliJ IDEA を完全にマスターする話
クリーンアーキテクチャーを強制する方法を考えてみた(N番煎じ) #すえなみチャンス暑気払い
jjug-ccc 2019 Spring 発表資料 Collections Framework 入門 #jjug #jjug_ccc #ccc_c1
swift-log について
Vim 入門
Java プログラマーのための Swift 入門 #中央線Meetup
swift-nio のアーキテクチャーと RxHttpClient
JJUG CCC 2018 Spring - I-7 (俺が)はじめての Netty
JJUG CCC 2018 Spring LT Spring Boot アプリケーションの起動を速くする 108 の Tips #jjug_ccc #jjug
Spring Boot アプリケーションの起動をほんの少し気持ちだけ速くしてみた
Javaモジュールシステム雑なまとめ
JavaのStreamで学ぶ遅延処理実装パターン
gradle2.4のルールベースモデルコンフィギュレーション
On stream-lazy-computation
Stream脳の作り方
Java8のstreamをダラダラまとめてみる
ドラクエの金銭感覚
30億のデバイスで走るjavaを支えるjavaエコシステム
Intelli j vs-eclipse-by-mike-neck #jbugj
Ad

Kotlin as an AltJS