Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Goodbye JSR305, Hello JSpecify!

Kengo TODA
November 21, 2021

Goodbye JSR305, Hello JSpecify!

Kengo TODA

November 21, 2021
Tweet

More Decks by Kengo TODA

Other Decks in Technology

Transcript

  1. スピーカーについて 3 • Kengo TODA ◦ SpotBugs (FindBugs後継) メンテナのひとり ◦

    JSpecifyにはSpotBugs Teamとして参画 ◦ 他にも spotbugs-gradle-plugin, gradle-semantic-release-plugin, などを開発 • 過去のJJUG CCCセッション ◦ Java8〜16におけるバイトコード生成の変化 ◦ SpotBugs3.1.xの現状と内部実装が抱える問題 ◦ SpotBugs(FindBugs)による 大規模ERPのコード品質改善 ◦ etc.
  2. 静的解析用アノテーション発展の歴史(~Java SE 8) 6 2004/Sep J2SE 5.0 2006/Aug JSR305 launched

    2006/Jul FindBugs annotations 2007/May Checker framework 2008/Mar JSR305 annotations 2009/Jan Netbeans api-annotations-common 2012/Jan JSR305 annotations v2 2012/May JSR305 was marked as dormant 2009/Jan the last discussion at jsr-305 Google Group
  3. 静的解析用アノテーション発展の歴史(~Java SE 8) 7 2004/Sep J2SE 5.0 2006/Aug JSR305 launched

    2006/Jul FindBugs annotations 2007/May Checker framework 2008/Mar JSR305 annotations 2009/Jan Netbeans api-annotations-common 2012/Jan JSR305 annotations v2 2012/May JSR305 was marked as dormant 2009/Jan the last discussion at jsr-305 Google Group • J2SE 5.0のアノテーションを使えば、静的解析に活用可能な情報を更 に追加できるというアイデア • FindBugsとChecker frameworkが先鞭、JSR305を立ち上げ • 独自アノテーションはまだ多くない
  4. 静的解析用アノテーション発展の歴史(Java SE 8~) 8 2014/Mar Java SE 8 2014/Apr CF

    checker-qual 2014/Jul JSR305 annotations v3 2014/Jul Eclipse JDT annotations 2017/Feb Infer annotations 2017/May Android support library annotations 2017/Sep SpringFramework v5 with annotations (SPR-15540) 2013/Dec Jetbrains Annotations 2017/Sep Java SE 9 2017/Aug KEEP: JSR-305 custom nullability qualifiers
  5. 静的解析用アノテーション発展の歴史(Java SE 8~) 9 2014/Mar Java SE 8 2014/Apr CF

    checker-qual 2014/Jul JSR305 annotations v3 2014/Jul Eclipse JDT annotations 2017/Feb Infer annotations 2017/May Android support library annotations 2017/Sep SpringFramework v5 with annotations (SPR-15540) 2013/Dec Jetbrains Annotations 2017/Sep Java SE 9 2017/Aug KEEP: JSR-305 custom nullability qualifiers • Java SE 8リリース後に独自定義が増加 • JSR305 v3はJavadocの更新のみ • KotlinサポートのためNullnessを明示する必要性が増加
  6. なぜ静的解析用アノテーションが多く作られたのか 1. “標準”APIが機能不足だった a. Genericsや型の使用(TYPE_USE)をサポートしていない 2. “標準”APIが持続可能ではなかった a. JSR305が休止状態とされた b.

    "javax." パッケージの利用が認められていないため、互換を保っての forkができない c. API設計が不明かつ仕様が文書化されていないため、建設的な議論の土台として使いにくい d. "javax.annotation" パッケージが@Generatedなど他の公式モジュールに使われている i. Java moduleは各パッケージがひとつのモジュールからのみ提供されることを前提としている (a.k.a. split packages problem) 3. Kotlin起因によるNullness明示手法への再注目? 10
  7. 標準アノテーションが無いことによる課題 • アノテーションを扱う処理の複雑化 ◦ Kotlin v1.5.31は8種類ものアノテーションに対応 ◦ すべてのツールにすべてのアノテーションを対応させるのは非現実的では? • 実装ごとにアノテーションの解釈が変わる

    ◦ 「ツールAの@NotNullの解釈がツールBと違う」などが発生 ◦ 親クラスやインタフェース、パッケージのアノテーションが競合した際の解釈の揺れ ◦ Java APIの扱いもばらばら(例: System.outはNullableかNonNullか?) 11
  8. この未来を回避するためにJSpecifyが目指しているもの • 既存ツールのコミュニティと合意を得ることを意識 ◦ People from the following projects and

    organizations are collaborating on this project: Facebook (Infer), Google (Android, Error Prone, Guava), JetBrains (IntelliJ IDEA, Kotlin), Uber (NullAway), PMD Team (PMD), VMWare (Spring), SonarSource (SonarQube), SpotBugs Team (SpotBugs), Square ◦ Checker frameworkのサポートも視野 • まずNullnessに絞り、関連機能を試験的に実装してもらう ◦ Kotlin 1.5.20: Support for JSpecify nullness annotations ◦ IntelliJ IDEA: 実装中 ◦ SpotBugs: プラグイン実装中 13
  9. JSpecify 0.2.0が提供するもの 14 • Nullness関係の2つのアノテーション ◦ @NullMarked: 修飾されたクラスやパッケージにおいて、型の使用は明示されない限り非 null ◦

    @Nullable: 修飾された型の使用が nullを含むことを明示 • 議論と改善の機会 ◦ github.com/jspecify で様々な議論を実施 ◦ ドキュメントの日本語化は、ある程度議論が落ち着いてからの予定 • リリースノートに記載の注意点 ◦ アノテーションをMaven Centralで公開しているが、1.0までに仕様を変更する可能性が高い ◦ これを利用したライブラリをリリースしないように注意
  10. 参考資料 1. JSpecify公式サイト (jspecify.dev) 2. JVMLS19 overview presentation 3. JSpecify

    v0.2.0 release note 4. Eclipse FoundationによるJSR305を吸収する案 16
  11. Appendix: 独自定義がQualifier Nicknameかどうか 17 Annotation is JSR305 Qualifier Nickname? Checker

    framework N FindBugs/SpotBugs N Netbeans Y Jetbrains N Eclipse JDT N Infer N Android Support Library N Spring Framework Y Lombok N RxJava 3 N