Kotlinソースコード探訪

769 views

Published on

Kotlin Internal勉強会の発表資料です
https://connpass.com/event/40360/

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

  • Be the first to like this

No Downloads
Views
Total views
769
On SlideShare
0
From Embeds
0
Number of Embeds
169
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Kotlinソースコード探訪

  1. 1. Kotlinソースコード探訪 Kotlin Internal 勉強会 2016-11-26 @yy_yank
  2. 2.           こいつです           ・JavaとKotlinが好き           ・viキーバインド好き           サクラエディタアイコン ヤンク(@yy_yank) 自己紹介
  3. 3. ということで、恐縮ですが、 発表させてもらいます。 ゆるふわです
  4. 4. その前に、 ちょっとだけ宣伝。。。
  5. 5. Javaのカンファレンス に登壇します 来週の土曜日です
  6. 6. JVM言語とJava、 切っても切れないその関係
  7. 7. ・ひたすらKotlinのリポジトリの各モジュールのソース を僕が追いかけた結果報告 ・たまにソースコードとか出します ・ざっと見た解釈なので間違っていればつっこんでくだ さい 発表の流れ
  8. 8. internalということなので、 Kotlinのリポジトリを覗いてみる https://github.com/JetBrains/kotlin Kotlinリポジトリ
  9. 9. git clone https://github.com/JetBrains/kotlin.git tree kotlin Kotlinリポジトリ
  10. 10. ・・・・ 8104 directories, 49441 files 割とごった煮感がある Kotlinリポジトリ
  11. 11. annotations build-common compiler core eval4j generators grammer Kotlinリポジトリのモジュール idea idea-runner j2k jps-plugin js lib libraries license plugins spec-docs ultimate
  12. 12. annotations build-common compiler core eval4j generators grammer Kotlinリポジトリのモジュール idea idea-runner j2k jps-plugin js lib libraries license plugins spec-docs ultimate
  13. 13. annotations ・IntelliJ IDEAのExternal Annotation(@NotNull @Nullable)がほとんど ・annotation.xml https://www.jetbrains.com/help/idea/2016.2/e xternal-annotations.html annotationsモジュール
  14. 14. annotations build-common compiler core eval4j generators grammer Kotlinリポジトリのモジュール idea idea-runner j2k jps-plugin js lib libraries license plugins spec-docs ultimate
  15. 15. build-common ・KotlinとJavaのMix ・Kotlinのビルド用の実装 ・srcとoutputファイル情報とか持っている ・クラスやパッケージ情報のキャッシュ処理とか ・build時のファイル生成とか諸々の動きを やっているイメージ build-commonモジュール
  16. 16. annotations build-common compiler core eval4j generators grammer Kotlinリポジトリのモジュール idea idea-runner j2k jps-plugin js lib libraries license plugins spec-docs ultimate
  17. 17. compiler ・コンパイルをする(当然) ・ざっくりと見るとコンパイラのフロントエンドとバックエンドとい う概念を持ってパッケージが構成されている フロントエンド = ソースコード解析 バックエンド = クラスバイナリ生成 compilerモジュール
  18. 18. compiler ・compiler/backend下にcodegenというコード生成用 のパッケージがある キーワードや機能ごとにパッケージが切ってある 例)coroutines,extentions,inlineなど compilerモジュール
  19. 19. こんな感じ
  20. 20. compiler ・大体予想はつくと思いますがcompileはvisitorパターンが 使われています ・KtVisitor<R, D> extends PsiElementVisitor このクラスが構文木を順に追いかけて評価するようなかたち (おそらく) ・KtExpression、KtElementなどがそれぞれのイディオムや 要素を表現。KtTokensに予約語など compilerモジュール
  21. 21. compiler ・SinceKotlinアノテーションで導入タイミングが分かる 例えばCoroutines.ktは@SinceKotlin(“1.1”) これがリリースバージョンより上だと使えないように制御され ている compilerモジュール
  22. 22. compiler ・その他REPL関連のものもこのパッケージ内に入っています ・resolutionというパッケージでsmartcastやスコープの解釈 を行っているようです compilerモジュール
  23. 23. 君はもうkotlincを読んだ か?
  24. 24. ちょっとコード kotlinc.bat rem based on scalac.bat from the Scala distribution ・・・(中略)・・・ if not "%_KOTLIN_RUNNER%"=="" ( "%_JAVACMD%" %_JAVA_OPTS% "-Dkotlin.home=%_KOTLIN_HOME%" -cp "%_KOTLIN_HOME%libkotlin-runner.jar" ^ org.jetbrains.kotlin.runner.Main %* )
  25. 25. else ( "%_JAVACMD%" %_JAVA_OPTS% -noverify -cp "%_KOTLIN_HOME%libkotlin-preloader.jar" ^ org.jetbrains.kotlin.preloading.Preloader -cp "%_KOTLIN_HOME%libkotlin-compiler.jar" ^ %_KOTLIN_COMPILER% %* ) ちょっとコード kotlinc.bat
  26. 26. object Main { private val KOTLIN_HOME: File init { val home = System.getProperty("kotlin.home") if (home == null) { System.err.println("error: no kotlin.home system property was passed") System.exit(1) } KOTLIN_HOME = File(home) ちょっとコード org.jetbrains.kotlin.runner.Main.kt(一部抜粋)
  27. 27. private fun run(args: Array<String>) { val classpath = Classpath() var runner: Runner? = null var collectingArguments = false val arguments = arrayListOf<String>() var noReflect = false classpath.add(".") var i = 0 ちょっとコード org.jetbrains.kotlin.runner.Main.kt(一部抜粋)
  28. 28. if ("-help" == arg || "-h" == arg) { printUsageAndExit() } else if ("-version" == arg) { printVersionAndExit() }else if ("-classpath" == arg || "-cp" == arg) { classpath.add(next()) }else if ("-expression" == arg || "-e" == arg) { runner = ExpressionRunner(next()) ちょっとコード org.jetbrains.kotlin.runner.Main.kt(一部抜粋)
  29. 29. 結論 kotlin/compiler/cli/cli-runnerか ら追いかければなんとかなる
  30. 30. annotations build-common compiler core eval4j generators grammer Kotlinリポジトリのモジュール idea idea-runner j2k jps-plugin js lib libraries license plugins spec-docs ultimate
  31. 31. core ・大事なものが入っています ・基本的な型を表すもの (Any、Nonthing、Char、Enum、Number、Stringなどなど) ・リフレクション関連 ・ディスクリプタ coreモジュール
  32. 32. annotations build-common compiler core eval4j generators grammer Kotlinリポジトリのモジュール idea idea-runner j2k jps-plugin js lib libraries license plugins spec-docs ultimate
  33. 33. eval4j ・evalします ・Javaのバイトコードのインタプリタ。デバッガで使うためのも のらしい (eval4j is a Java byte code interpreter written in Java. Its primary use case is implementing expression evaluation in debuggers.) https://github.com/abreslav/eval4j ・基本的にJavaのスタックマシンの命令セットの ハンドリングと実行をしているように見えます eval4jモジュール
  34. 34. fun boxType(value: Value): Value { val method = when (value.asmType) { Type.INT_TYPE -> MethodDescription("java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;", false) Type.BYTE_TYPE -> MethodDescription("java/lang/Byte", "valueOf", "(B)Ljava/lang/Byte;", false) Type.SHORT_TYPE -> MethodDescription("java/lang/Short", "valueOf", "(S)Ljava/lang/Short;", false) Type.LONG_TYPE -> MethodDescription("java/lang/Long", "valueOf", "(J)Ljava/lang/Long;", false) Type.BOOLEAN_TYPE -> MethodDescription("java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;", false) // ・・・・・(中略)・・・・・ false) else -> throw UnsupportedOperationException("Couldn't box non primitive type ${value.asmType.internalName}") } return invokeStaticMethod(method, listOf(value)) } ちょっとコード
  35. 35. ちょっとコード override fun newOperation(insn: AbstractInsnNode): Value? { return when (insn.opcode) { ACONST_NULL -> {return NULL_VALUE} ICONST_M1 -> int(-1) ICONST_0 -> int(0) ICONST_1 -> int(1) ICONST_2 -> int(2) ICONST_3 -> int(3) ICONST_4 -> int(4) ICONST_5 -> int(5) LCONST_0 -> long(0) ・・・・・
  36. 36. annotations build-common compiler core eval4j generators grammer Kotlinリポジトリのモジュール idea idea-runner j2k jps-plugin js lib libraries license plugins spec-docs ultimate
  37. 37. generators ・Kotlinコードのジェネレータっぽい ・設計書からソースコードを自動生成して生産性100 倍!!とかいうことではないが ・IntArray、DoubleArray、HogeArray・・・ とかめんどくさいから簡単に生成しようよ というやつです generatorsモジュール
  38. 38. annotations build-common compiler core eval4j generators grammer Kotlinリポジトリのモジュール idea idea-runner j2k jps-plugin js lib libraries license plugins spec-docs ultimate
  39. 39. grammer ・grmという謎のファイルが入っていて文法表現が書い てある ・BNFのようなBNFじゃないようなもの(?) This module contains a semi-formal description of Kotlin grammar. It is processed by a tool to generate the Kotlin grammar specification on the Kotlin Web site. とREADMEには書いてある grammerモジュール
  40. 40. annotations : (annotation | annotationList)* ; annotation : "@" (annotationUseSiteTarget ":")? unescapedAnnotation ; annotationList : "@" (annotationUseSiteTarget ":")? "[" unescapedAnnotation+ "]" ; ちょっと見てみる
  41. 41. ちょっと見てみる annotationUseSiteTarget : "file" : "field" : "property" : "get" : "set" : "param" : "setparam" ; unescapedAnnotation : SimpleName{"."} typeArguments? valueArguments? ;
  42. 42. annotations build-common compiler core eval4j generators grammer Kotlinリポジトリのモジュール idea idea-runner j2k jps-plugin js lib libraries license plugins spec-docs ultimate
  43. 43. idea ・ここはIntelliJ IDEAのKotlin対応の実装が入って います ・ココにContributeすればIDEでもっと便利に使える ようになりますね!ぜひ ideaモジュール
  44. 44. object KotlinHighlightingUtil { fun shouldHighlight(psiElement: PsiElement): Boolean { val ktFile = psiElement.containingFile as? KtFile ?: return false return ktFile is KtCodeFragment || ktFile.isScript || ProjectRootsUtil.isInProjectOrLibraryContent(ktFile) } fun shouldHighlightErrors(psiElement: PsiElement): Boolean { val ktFile = psiElement.containingFile as? KtFile ?: return false return ktFile is KtCodeFragment || ktFile.isScript || ProjectRootsUtil.isInProjectSource(ktFile) } } ちょっとコード
  45. 45. annotations build-common compiler core eval4j generators grammer Kotlinリポジトリのモジュール idea idea-runner j2k jps-plugin js lib libraries license plugins spec-docs ultimate
  46. 46. idea-runner This module exists for the sole purpose of providing the classpath for the IDEA run configuration. This run configuration takes a plugin from the KotlinPlugin artifact instead of the project's 'out' directory, which makes it possible for our plugin to depend on other plugins such as JUnit plugin. If you want to debug some patch to IDEA, you can add copy of IDEA class into this module and modify. ということでIntelliJ IDEAのプロジェクト構成の場合にKotlin を動かすというものらしいです idea-runnerモジュール
  47. 47. annotations build-common compiler core eval4j generators grammer Kotlinリポジトリのモジュール idea idea-runner j2k jps-plugin js lib libraries license plugins spec-docs ultimate
  48. 48. j2k ・JavaをKotlinに変換するためのモジュール ・switchならwhenへコンバートとか ・Javaの型をKotlinの型にコンバート j2kモジュール
  49. 49. annotations build-common compiler core eval4j generators grammer Kotlinリポジトリのモジュール idea idea-runner j2k jps-plugin js lib libraries license plugins spec-docs ultimate
  50. 50. jps-plugin ・https://github.com/JetBrains/JPS 用のプラグインのようです。Gantベース。 ※Gant is Groovy Ant Scripting jps-pluginモジュール
  51. 51. annotations build-common compiler core eval4j generators grammer Kotlinリポジトリのモジュール idea idea-runner j2k jps-plugin js lib libraries license plugins spec-docs ultimate
  52. 52. js.serializer js.tests js.translator npm.templates js ・KotlinのJavaScriptランタイム用の実装 jsモジュール js.dart-ast js.frontend js.inliner js.libraries js.parse
  53. 53. js このあたりの仕組みについて、 (もう覚えていない)昔の自分がブログに書いて いたので、 ご参照いただければと思います ・【コードリーディング】Kotlin to JavaScriptコンパイラメモ http://yyyank.blogspot.jp/2015/05/kotlinkotlin-to-javascript .html jsモジュール
  54. 54. js ざっくり大事なのは ・K2JSCompiler ・K2JSTranslator jsモジュール
  55. 55. annotations build-common compiler core eval4j generators grammer Kotlinリポジトリのモジュール idea idea-runner j2k jps-plugin js lib libraries license plugins spec-docs ultimate
  56. 56. lib ・jarが入ってるだけじゃー(許してください) javax.inject.jar javax.inject-src.zip jsr305-1.3.9.jar ※java.injectはJSR330とか@Injectとかそのあたり ※JSR305はソフトウェア欠陥検出。 @NotNullとかのアノテーションのやつです libモジュール
  57. 57. annotations build-common compiler core eval4j generators grammer Kotlinリポジトリのモジュール idea idea-runner j2k jps-plugin js lib libraries license plugins spec-docs ultimate
  58. 58. libraries ・このモジュールは以外に重要で Kotlinのstdlib(標準API)の実装とかが入っています ・あとjdk7、jdk8などruntimeごとのブリッジのような ものも librariesモジュール
  59. 59. annotations build-common compiler core eval4j generators grammer Kotlinリポジトリのモジュール idea idea-runner j2k jps-plugin js lib libraries license plugins spec-docs ultimate
  60. 60. license ・Kotlin自体のライセンスとサードパーティーの製品の ライセンスがおいてあります licenseモジュール
  61. 61. annotations build-common compiler core eval4j generators grammer Kotlinリポジトリのモジュール idea idea-runner j2k jps-plugin js lib libraries license plugins spec-docs ultimate
  62. 62. plugins ・Kotlinに関連するプラグインが実装 android-extensions annotation-collector annotation-processing java-moddle-wrappers lint pluginsモジュール
  63. 63. plugins ・Kotlinに関連するプラグインが実装 uast-common uast-java uast-kotlin ※UAST=Unified AST 抽象構文木がpluginとはこれ如何に pluginsモジュール
  64. 64. annotations build-common compiler core eval4j generators grammer Kotlinリポジトリのモジュール idea idea-runner j2k jps-plugin js lib libraries license plugins spec-docs ultimate
  65. 65. spec-docs ・実装仕様というか機能の特徴というか、 そんな感じのことがmdファイルに書かれています spec-docsモジュール
  66. 66. annotations build-common compiler core eval4j generators grammer Kotlinリポジトリのモジュール idea idea-runner j2k jps-plugin js lib libraries license plugins spec-docs ultimate
  67. 67. ultimate ・IntelliJ IDEAのUE(Ultimate Edition)対応実装 ・今のところ Spring Frameworkに対しての実装のみ ultimateモジュール
  68. 68. おめでとう! ここまで理解したあなたは Kotlin完全マスターです
  69. 69. まとめ ・ということで、internalな世界の浅瀬を歩いてみました ・Kotlinプロジェクトの輪郭は見えてきたのではないかと思い ます ・JavaScript runtimeとかまだ完成しきっていないのでぜひ contributeを ・バグがあったらcontributeを ・IDEのサポートもcontributeをするとみんな喜ぶ

×