BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Metaがどのようにして100万行のAndroidコードをJavaからKotlinに移行したか?

Metaがどのようにして100万行のAndroidコードをJavaからKotlinに移行したか?

原文リンク(2024-12-28)

生産性と安全性の面でKotlinがもたらす利点を最大化するため、Metaのエンジニアは1,000万行のAndroidコードベースをJavaからKotlinに翻訳する作業に懸命に取り組んできた。このプロセスの1年で、彼らはコードベースの約半分を移行し、プロセスを可能な限り自動化するための特別なツールKotlinatorを開発した。

Metaのエンジニアたちは、もっとも便利なアプローチに聞こえるであろう積極的に開発されたコードだけを翻訳するのではなく、完全な移行で進めることに決めた。これは、残っているJavaコードがnull許容性の問題の原因となるリスクを避けるためだけではなく、2つの異なるツールチェーンを並行して使用する欠点を取り除くため、および混在したコードベースをコンパイルしなければならないことによるパフォーマンスの打撃を取り除くためでもあった。

当初からMeta社のエンジニアにとって、IntelliJのJ2K翻訳ツールが提供するサポートはこのような大規模なコードベースには十分ではなく、変換プロセスを可能な限り自動化する必要があることは明らかだった。しかしながら、J2Kは彼らの変換ソリューションであるKotlinatorの基盤は提供した。

最初のステップは、J2Kをリモートマシン上で実行できるヘッドレスツールに変換することだった。ヘッドレスJ2KはIntelliJのプラグインとして実装され、ApplicationStarterクラスを拡張し、IntelliJの変換ボタンと同じようにJavaToKotlinConverterを直接呼び出した。

ヘッドレスJ2Kを実行する前に、Kotlinatorは変換前と変換後のステップを使用して、変換されたコードがビルドできることを確認する。これらのステップでは、null許容性を扱い、いくつかの既知のJ2K回避策を適用し、生成されたコードをより慣用的にする。

どちらのフェーズにも、翻訳されるファイルに対して何十ものステップが含まれており、それを分析し(時にはその依存関係や依存先も含めて)、必要であればJava->JavaまたはKotlin->Kotlin変換を実行します。

Metaはこれらの変換の一部をオープンソース化し、直接利用できるようにした。オープンソース化は、KotlinコンパイラAPIを使ったKotlin AST操作の例を提供するためでもある。

変換ステップのほとんどは、JetBrainsのProgram Structure Interface(PSI)ライブラリを活用したメタプログラミングツールを使って構築されており、コンパイラに頼ることなくファイルを解析し、構文モデル・意味モデルを作成できる。Meta社のエンジニアによると、これはとても重要なことで、多くの場合、後処理されたコードはまったくコンパイルされないため、それを変換する別の方法が必要であり、PSIがまさにそれを提供してくれた。

これらのステップの結果生じるビルドエラーは、人間が行うのと同じようにコンパイラのエラーメッセージを解釈することで処理されるが、いくつかのメタプログラミングを使用して指定された自動化された方法で行われる、とMetaのエンジニアは説明する。

単に開発者の労力を減らすのではなく、これらの自動化されたステップは、手作業でコードを変換する際のヒューマンエラーの可能性を最小化するためにも使われた。その過程で、MetaのエンジニアはJetBrainsと協力してJ2Kを拡張し、クライアント・ライブラリから注入されたフックをIDEで直接実行できるようにした。

Metaのエンジニアが説明するように、JavaコードをKotlinに翻訳可能にする努力の大部分は、nullセーフにすることを目的としている。これは、Nullsafeや NullAwayのような静的アナライザーを使って、疑わしいケースをすべて検出することでシンプルに達成できるが、nullポインタ例外(NPE)のリスクを排除するにはまだ不十分だ。

NPEは、例えば、nullセーフでない依存関係が、関数への形式上nullでないパラメータにnull値を渡す場合に発生する可能性がある。このリスクを減らすためにKotlinatorがとったアプローチの1つは、「nullableの方を選ぶようにする」ことである。これは、コードが実際にnon-nullableを示唆していない場合、パラメータや戻り値の型をnullableとみなすようにデフォルト設定することを意味する。さらに彼らは、実行時にnullを許容するデータを収集し、nullableと宣言されていないにもかかわらずnullになる可能性のあるパラメータや戻り値の型を特定するJavaコンパイラ・プラグインを構築した。

Metaのレポートから明らかなように、大規模なJavaコードベースをKotlinに翻訳することは、些細な努力ではなく、非常に高度なエンジニアリングを必要とする。Metaのコードベースを100%Kotlinにする旅はまだ終わっていないが、2つの言語の違いや、どのようにKotlinコードをプログラム的な方法で変換するかを深く理解する機会を与えてくれることは間違いない。この件に関してはここではカバーしきれないほどさらにたくさんのことがあるため、完全な詳細に興味がある方は元記事をお見逃しなく。

作者について

この記事に星をつける

おすすめ度
スタイル

BT