7月21日、TurborepoはGoからRustへの移行を発表しました。
この移行方法について詳しく説明します。
GoからRustへの移行は戦略的な選択であり、新機能のリリースや既存の機能の修正を続けながら移行を行うことができます。
ポートと書き換え ー それぞれのトレードオフ
ポートと完全な書き換えは、GoからRustへの移行方法の2つのアプローチです。
ポートは、コードを一部ずつ移行する方法であり、新しいコードと古いコードを同時に実行します。
一方、完全な書き換えは、新しいバージョンを古いバージョンと完全に置き換える方法です。
ポートのメリットは、新しい機能を追加しながら既存の機能を維持できることです。
また、ポートは、新しいバージョンが古いバージョンと比べてシームレスであることを保証することができます。
完全な書き換えでは、新しいバージョンが古いバージョンと一致しない場合があり、ユーザーが変更や欠落した機能によって不満を抱く可能性があります。
また、ポートは新しいコードベースを構築する必要がないため、未使用のコードが増えることもありません。
移行の開始
TurborepoのGoからRustへの移行は、新しいTurborepoの機能をRustで開発し、徐々にコードを移行していくという段階的なアプローチを選択しました。
これにより、新機能の追加や既存の機能の修正を続けながら移行を進めることができます。
Global turbo: Rust shimを使用したGoの既存コードへの組み込み
Turborepoでは、Rustで実装された新機能をGoの既存コードに組み込むためのRust shimを作成しました。
これにより、GoとRustのコードを連携させることができます。
CLI parsing: CLI引数の解析と言語間の通信
Rustでは、CLI引数を解析するためにclap crateを使用し、RustとGoの間でCを使用して通信するためにJSONシリアライズを使用しました。
これにより、GoとRustの間でのデータの受け渡しをスムーズに行うことができます。
Ship it?: 最初のリリースと問題の発生
GoとRustの組み合わせで最初のリリースを行いましたが、WindowsとAlpine Linuxでいくつかの問題が発生しました。
これらの問題に対処するために、さらなるテストと修正が行われています。
その他のポイントや変更点については、詳しい内容は「How Turborepo is porting from Go to Rust – Vercel」を参照してください。
まとめ
TurborepoのGoからRustへの移行は、戦略的な選択であり、新機能のリリースや既存の機能の修正を続けながら移行を行うことができます。
GoからRustへの移行方法や移行の戦略について学ぶことができます。
現在は移行が進行中であり、新機能のリリースや既存の機能の修正が行われています。
移行が完了した後、開発効率の向上が期待されます。