C++からRustに移行して幸せになる人、そうならない人 その違いは?:どちらを選ぶべきか
C++はRustが登場する前から成熟度の高い言語だった。開発者はC++からRustに切り替える必要があるのだろうか。必ずしもそうとは限らない。C++とRustの品質、両言語の相違点と類似点を調べて、どちらのプログラミング言語を選ぶかを決めたい。
C++はRustが登場する前から成熟度の高い言語だった。開発者はC++からRustに切り替える必要があるのだろうか。必ずしもそうとは限らない。
新たなプロジェクトに携わるプログラマーは、プログラミング言語の選択肢が不足することはない。プログラミング言語「C++」と「Rust」は、 ブラウザベースのソフトウェアからビデオゲームに至るまで、さまざまなプロジェクトに適しており、それぞれに利点がある。
C++は効率的で信頼性の高いプログラミング言語だ。信頼性、パフォーマンス、スケーラビリティの高さから開発者はC++を選ぶ。C++の標準テンプレートライブラリ(STL:Standard Template Library)の関数には、広範なライブラリによってサポートが提供される。C++は、システムプログラミング、ビデオゲーム開発、さまざまなOSやWebブラウザで実行されるモダンアプリケーションに使用されている。
Rustは、マルチパラダイムのコンパイル型プログラミング言語で、「C」言語やC++の最新バージョンと考えることもできる。Rustは静的かつ厳密に型指定される関数型言語だ。RustはC++に似た構文を使用し、安全第一の原則を実現する。そのため、プログラマーは安定していて拡張可能な非同期コードを作成できる。Rustは、一般的なプログラミング、Web開発、データサイエンス、ビデオゲームの他、拡張現実(AR)、仮想現実(VR)、ブロックチェーンなどのプロジェクトに使用されている。
C++が誕生したのは1985年だが、Rustはその30年後の2015年に最初の安定版がリリースされた。使用年数の差はあるが、安全性を高める機能が追加されているとしても、C++の全てのコードベースをRustに移行しなければならないわけではない。C++とRustの品質、両言語の相違点と類似点を調べて、どちらのプログラミング言語を選ぶかを決めたい。
Rustが使われる理由
Rustの機能セットは、スレッドの安全性、メモリレイアウトの制御、同時実行を重視する。組み込みのセキュリティは、最新のソフトウェアやシステムにとってはプラスに働く。
システム言語の中には、同時実行が破綻しやすく、エラーが起こりがちな言語もある。こうした弱点があると、情報の喪失や整合性の欠如につながる恐れがある。
スレッドを使えば、さまざまなソフトウェアコンポーネントを同時に実行できる。ただし、スレッドによる同時実行によってソフトウェアに課題が生まれる可能性がある。Rustでは、スレッドによる同時実行の安全性が確保される。そのため、マイクロサービスアプリケーションが想定通りに動作する。Rustは、「1つの変数は任意の特定の値を一度だけ所有できる」という所有権の原則に基づいている。
Rustでは、コンパイルの単位を「クレート」と呼ぶ。Rustコンパイラではクレートがコードの最小単位になる。Rustでは、メモリに対して安全ではない使い方を試みるプログラムはコンパイルされない。Rustコンパイラは、構文や言語メタファーを使って、nullポインタやダングリングポインタ、データ競合など、スレッド関連やメモリ関連の問題が運用環境で発生するのを防ぐ。
Rustコンパイラの静的分析ツール「ボローチェッカー(Borrow Checker)」は、安全ではないコードが原因でメモリエラーを起こす前にコンパイルを停止する。そのため、プログラマーは開発プロセスの早い段階でこうした問題を解決しなければならない。ボローチェッカーは、プログラムの存続期間全体で値の所有権の変化を分析する。コードベースでは、ある場所で保持されている値を他の場所で借用する可能性がある。ボローチェッカーは、一連の規則を用いて、同時実行コードでデータの競合が発生するのを防ぐ。
Rustコンパイラは、複数のオブジェクト間にある所有権の分散やメモリの割り当ても管理し、実行時に問題が発生するのを防ぐ。メモリの安全性を確保する機能によって、バッファーオーバーフローが防止され、メモリのアクセスと使用に関連する一連のバグに対する保護が提供される。つまり、例えば、ブラウザベースのアプリケーション内で使うRustコードの量を増やせば、侵害や脆弱(ぜいじゃく)性に関する攻撃対象領域が減少することになる。
Rustは強力な抽象化ももたらす。同言語の「rustup」インストーラが開発環境とクロスコンパイルの設定を行う。Rustバイナリの作成に必要な全ての要素は、同じパッケージ内に収容される。
Rustに着手する方法
Rustを初めて扱う開発者は、「Cargo」パッケージマネジャーの使い方を学ぶことで、Rustの核となる原則を習得できる。Cargoは、共通のライブラリやフレームワークへの多種多様なAPIバインディングを備えている。開発者は、Microsoftの「Visual Studio Code」、JetBrains の「CLion」「IntelliJ IDEA」などのIDEを利用するのが一般的だ。Rust用のWebフレームワークとしては、「Actix Web」「Rocket」が広く使用されている。
Cargoライブラリでは、クレートの有効性をランク付けしない。そのため、開発者はそれを試してみたり、Rustのコミュニティーから情報を入手したりする必要がある。Rustのコミュニティーは包括的かつ協力的だ。非営利団体「Rust Foundation」は、エコシステムへの有意義な貢献をサポートし、Rustのアウトリーチを高め、Rustの利用を促進している。Rust FoundationはRustを創設したMozillaから同言語を引き継いでいる。
C++が使われる理由
C++は、クロスプラットフォームプログラミングを目的にC言語を拡張する形で誕生した。C++は、効果的な機能、安全性、使いやすさを実現する。3年単位のリリースサイクルで新機能が定期的に導入される。C++のバージョン23のリリースは2023年12月に予定されている。
C++は他の言語と比べて構文が複雑で、抽象化のレベルも高い。高いレベルの抽象化によって、開発者はハードウェアの詳細やOS実装の詳細をカプセル化できる。C++は、IoTデバイス、スマートウオッチ、医療機器など、ハードウェアの近辺にコードを配置する必要のある組み込み型システムに適している。
抽象クラスは純粋仮想関数を表す。プログラマーは、プログラムのコードベースを整理して理解しやすくなるようにクラスをグループ化することに力を注ぐ。抽象化することで、プログラムの重複が減り、再利用性が高まる。開発者は設計時に抽象化を利用してプログラムのプライバシーを高め、自身に関連するデータだけがユーザーに表示されるようにすることも可能だ。
C++はコンパイル言語だ。作成したコードが直接機械コードに変換される。そのため、高速になり、効率と柔軟性が高まる。C++はハードウェア機能を利用して低レベルで制御することで、スケーラビリティを高める。この機能は、ビデオゲーム、GUI、科学シミュレーション、金融アプリケーションに適している。大量のデータを処理できるので、臨場感あふれる3DのAR/VR体験を生み出すために必要な大量のデータセットを効果的に処理できる。
C++のメモリ管理では、実行時にメモリが割り当てられ、不要になったらその割り当てが解除される。C++では使われていない空きメモリにアクセスできるので、これがバッファーオーバーランやスタックオーバーフローの脆弱性を引き起こす恐れがある。こうした安全性とセキュリティの不足によって、デバッグに時間やリソースが必要になることがC++の欠点だ。こうした懸念事項は、自動車業界や医療業界、航空宇宙や航空の分野など、組み込み言語を使用する領域に特に影響を及ぼす。ただし、C++のセキュリティガイドラインに従えば、メモリの安全性を確保できる。
C++はこれまで比較的長く使われてきたので、 広範なオープンソースSTL、多数のフレームワーク、コミュニティーのサポートに貢献してきている。開発者は、多種多様な組み込み関数、コンテナ、ハッシュマップ、ヒープ、関連機能にアクセスして、開発作業を容易にすることができる。
STLのコードは、コミュニティーのメンバーによって検証と精査が完了している。こうしたコミュニティーの取り組みによって、コーディングがシンプルになり、プログラマーはクリーンなコードを迅速に記述でき、メンテナンスの問題を回避できる。ライブラリには、命令の構文とセマンティクスを指定して利用できる汎用(はんよう)アルゴリズムも含まれている。こうしたアルゴリズムのパフォーマンス要件は、認定済みの規格やベンチマークに対応している。
C++のコミュニティーは協力的で熱心だが、一元管理されるフォーラムやグループは存在しない。コミュニティーの委員会は毎年開催され、公式ドキュメントを更新している。
開発者は、既存のコードをC++から安全性の高いRustに切り替えることができる。とはいえ、新たなレベルの安全性を必要としない既存のC++コードも数百万行ある。つまり、RustはC++の新たな代替言語だが、C++は今後も存続する可能性のある息の長い選択肢だといえる。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- プログラミング言語「Rust」とは? "Hello, World!"で基本を押さえる
Rustはどのようなプログラミング言語なのでしょうか? 本連載のスタートとなる今回は、Rust言語の概略と、手元にRustの動作環境構築までを紹介します。導入で利用可能になるコマンドと、最初のHello, World!プログラムも取り上げます。 - Javaの”やらかし”でC#と人気逆転か 激変プログラミング言語人気ランキング
TIOBE Softwareが発表したプログラミング言語の人気ランキング「TIOBEインデックス」の2023月10月版では、JavaとC#のレーティングが1.2ポイントのわずかな差に縮まっている。 - C/C++でWebAssembly――「Emscripten」を体験する
第4回は、WebAssembly開発で人気のあるC/C++とEmscriptenによる開発事例を紹介します。標準的なC/C++の関数の出力をWebページに反映させる事例の他に、C/C++の関数をJavaScriptから呼び出す事例も紹介します。