Your SlideShare is downloading. ×
0
Kotlin as an AltJS
Kotlin as an AltJS
Kotlin as an AltJS
Kotlin as an AltJS
Kotlin as an AltJS
Kotlin as an AltJS
Kotlin as an AltJS
Kotlin as an AltJS
Kotlin as an AltJS
Kotlin as an AltJS
Kotlin as an AltJS
Kotlin as an AltJS
Kotlin as an AltJS
Kotlin as an AltJS
Kotlin as an AltJS
Kotlin as an AltJS
Kotlin as an AltJS
Kotlin as an AltJS
Kotlin as an AltJS
Kotlin as an AltJS
Kotlin as an AltJS
Kotlin as an AltJS
Kotlin as an AltJS
Kotlin as an AltJS
Kotlin as an AltJS
Kotlin as an AltJS
Kotlin as an AltJS
Kotlin as an AltJS
Kotlin as an AltJS
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Kotlin as an AltJS

347

Published on

KotlinをAltJSとして使うことについていろいろと検討した結果

KotlinをAltJSとして使うことについていろいろと検討した結果

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
347
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Kotlin as an AltJS @mike_neck
  • 2. おことわり • たぶん15分も話せません • いろいろ言い訳ありますが… • 要するに雑に話します Kotlin as an AltJS
  • 3. 誰? • 持田真哉(@mike_neck) • たんなるJava、Groovy好きのおっさん • Kotlin歴3時間弱 Kotlin as an AltJS
  • 4. 概要 • モティベーション • Java使いにとってのAltJSの候補 • Interoperating with existing JS libs • Kotlin as an AltJS Kotlin as an AltJS
  • 5. モティベーション 生JS書きたくない 普通のプログラミングしたい
  • 6. モティベーション • 普通のプログラミングとは?(あくまで私見です) • 型があって、不正な操作はコンパイル時にエラー にしてくれる • IDE(IntelliJ IDEA)で補完してくれる • 欲を言えばGradleでビルドできる • 老害脳なので、新しいツール覚えるの辛い
  • 7. Java使いにとってのAltJS • TypeScript • Scala.js • Kotlin • ClojureScript…ごめんLisp覚えるの辛い
  • 8. キワモノから… Java使いにとってのAltJS
  • 9. Kotlin • デフォルトでJavaScriptへのコンパイルをサポートしている better Java • Java、C#やっていれば学習コストは大して高くない • 生成されるJavaScriptはそこそこ複雑 • JetBrains製なのでIntelliJ IDEAでもサクサク書ける • 対応している既存JSライブラリーがjQueryしかない • kotlin2jsプラグインでGradleでもビルドできる Java使いにとってのAltJS
  • 10. Scala.js • ScalaコンパイラーのプラグインでJavaScriptを生成する • それなりに学習コストが高い(私見です) • 生成されるJavaScriptが巨大 • IntelliJのScalaプラグインによってそこそこ補完が効く • jQuery、Angular、Reactに対応するライブラリーがある • sbtという人間には早すぎたビルドツールが必要(0.6.0からはMaven/ Gradleでも利用可能にするためにMaven artifact化しているらしいけ ど、現在プラグインがない) Java使いにとってのAltJS
  • 11. TypeScript • JavaScriptを拡張したAltJS • Java、C#やってれば学習コストは大して高くない • 生成されるJavaScriptはシンプル • IntelliJ IDEAで補完が効くのでサクサク書ける • エコシステム(DefinitelyTypedのd.ts)が豊富 • Gradleプラグインがあった! • sothmann/typescript-gradle-plugin • grezi/gradle-typescript-plugin Java使いにとってのAltJS
  • 12. 悪いこと言わないから TypeScriptを使え Java使いにとってのAltJS
  • 13. おわり
  • 14. ・・・
  • 15. Kotlinの勉強会でし たね…
  • 16. Interoperating with existing JS libraries • インターフェースを作る必要がある • native(“foo”)のような形で既存JSライブラリーのインター フェースを準備する • 中身は実装する必要ないのでnoImplを指定する • 型安全なハンドラーを指定したい場合はジェネリクスを用い る • 型安全にしたいからKotlinを使うのであって、Any使って たらあまり意味無いですよね
  • 17. 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
  • 18. 自分で既存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
  • 19. 自分で既存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にコンパイルし た時の出力される名前を指定
  • 20. 自分で既存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 を指定する
  • 21. 自分で既存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 ハンドラーの引数は型安全に したいのでジェネリクスを付 ける
  • 22. Interoperating with existing JS libraries • JavaScriptのシンプルなオブジェクトが欲しい場 合 • 普通のclassを用いれば後はよしなにやってくれる class Person( val firstName: String, val lastName: String) // Person(“foo”, “bar”) // -> {firstName:”foo”, lastName: “bar”}
  • 23. 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 // のようなエラーが発生する
  • 24. 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)) } }
  • 25. Kotlin as an AltJS • まだAltJSとして使うにはつらいところが多々ある • Kotlinから生成されるJavaScriptの品質につい てはJetBrainsに頑張ってもらう一方で、ユー ザーである我々もフィードバックしていくことが望 まれる • Kotlinが使ってもらえるAltJSとなるには、エコ システムの構築にカギがある
  • 26. Kotlin as an AltJS • TypeScript • DefinitelyTypedプロジェクトによるエコシ ステム • tsdやdtsmのような簡易に型情報を収集する ツール
  • 27. Kotlin as an AltJS • Scala.js • scala-js.orgでライブラリーへのリンクが貼ってあ る • 基本的なスタンスは「sbtで取ってきてね」という感じ • 最初はギャグと言われていたけど、Scalaのユーザー 数が増えているのでScala.jsのエコシステムも充実し つつあるという印象
  • 28. Kotlin as an AltJS • AltJSとしてKotlinを使ってもらうためには… • エコシステムの構築 • レポジトリーの構築 • 必要なライブラリーを管理するツールの構築 • そもそものユーザー数を増やしていく • ちなみにKotlin自体は3時間さわった感じでは、よい言語に分類でき ると思ってます
  • 29. おわり Kotlin as an AltJS

×