📚

IT技術解説③:なぜ、組み込み業界ではRustが流行らず、未だC言語が主流なのか?

2025/03/19に公開4
37

はじめに

組み込みソフトウェア開発の世界では、プログラミング言語の選択が製品の品質、開発効率、そして長期保守性に大きな影響を与えます。近年、メモリ安全性や並行処理の安全性を強みとするRust言語が様々な分野で注目を集め、採用が進んでいます。Webバックエンド、システムプログラミング、そしてLinuxカーネルのような重要なプロジェクトでもRustの導入が進んでいるにもかかわらず、組み込み開発の現場では依然としてC言語が主流であり続けています。本稿では、最新の安全な言語であるRustが、なぜ組み込み開発において広く採用されず、数十年の歴史を持つC言語が今なお主要な選択肢であり続けているのか、その技術的・実務的な要因を詳しく検討します。

1.ヒープを使わない開発が多いのでRustの本領が発揮されない

組み込み開発では、動的メモリ管理を避ける設計が一般的です(ヒープを使わない)。
Rustの特徴である所有権システムや安全なメモリ管理の多くは、動的メモリの管理やスレッド安全性を高める設計で威力を発揮します。
しかし、ヒープを使わないシステムでは、これらのRustの利点がフルに活かされないため、Cで十分と判断されるケースが多いです。

2.ドライバやライブラリが静的に結合されることが多い

組み込みシステムでは、ドライバやライブラリを事前にビルドして静的にリンクすることが一般的です。
既存のC言語のドライバやライブラリをRustのプロジェクトに統合する際、RustとCのビルドプロセスやリンカスクリプトを調整する必要があり、煩雑になります。
結果として、Rustを導入するメリットを上回る労力が発生する可能性があります。

3.インクリメンタル開発が多いので、Cの資産が活用できないと困る

組み込み開発では既存のコードや設計を活かして新しい製品を開発することが一般的です。
C言語で構築されたドライバやミドルウェアが豊富に存在し、それらを活用することでコストを抑えています。
Rustを導入する場合、既存のCコードとの相互運用が必要ですが、FFI(Foreign Function Interface)の設計には手間がかかります。

4.多様なチップでのベアメタル開発が多く、Rustコンパイラが提供されていない

組み込み開発では、ARM Cortex-MシリーズのようにRustが比較的対応しやすいチップもありますが、独自アーキテクチャのマイクロコントローラや特殊なハードウェアも多く存在します。
RustはLLVMをバックエンドにしているため、ターゲットアーキテクチャがLLVMに対応していないとRustコンパイラを使うことができません。
特に、ローエンドの8ビットや16ビットマイコンでは、Cやアセンブリ言語が主流で、Rustの利用は難しいです。

5.開発・デバッグ環境がRustに対応していない

組み込み分野ではIAR Embedded WorkbenchやKeil μVision、Green Hills MULTIといった統合開発環境が広く使用されています。これらの環境はC/C++向けに最適化されており、ターゲットデバッグやトレース機能が強力です。一方で、Rustはオープンソースツールチェーン(例: cargoやlldb)に依存しており、これらの商用ツールとの統合が進んでいません。このため、ターゲットハードウェアでのデバッグが必要な場合にRustを使用するのは困難です。

6.コンパイラの機能安全適合が要求されやすい

組み込み分野では車載(ISO 26262)や産業機器(IEC 61508)などの機能安全規格への適合が求められることが多いです。既存のCコンパイラ(例: GCC、Green Hills、IARなど)はこれらの規格に対応している実績があります。一方で、Rustの公式コンパイラ(rustc)はオープンソースであり、これらの規格への適合が保証されていないため、機能安全が必須の分野では採用が難しい現状があります。

7.MISRA-CやCERT-Cが普及している

C言語向けのガイドラインであるMISRA-CやCERT-Cは、組み込み分野で広く採用されています。これらに対応した静的解析ツール(例: QA·C、Coverity、CodeSonarなど)も多く普及しており、企業での利用実績が長年積み上げられています。Rustには独自の安全性機能がありますが、これらのガイドラインやツールとの互換性がないため、導入に追加の手間が発生します。

まとめ

組み込み開発におけるC言語の優位性は、単に歴史的な慣性や開発者の習慣だけではなく、様々な技術的・実務的制約に根ざしています。Rustが提供するメモリ安全性や並行処理の保証は魅力的ですが、ヒープを使わない設計が主流の組み込み環境ではその利点が十分に活かされません。また、既存のC資産との統合の複雑さ、多様なマイクロコントローラへの対応状況、専用開発環境との互換性、機能安全認証の問題など、組み込み開発特有の課題がRustの普及を妨げています。
しかし、組み込み開発の世界も徐々に変化しています。より高性能なマイクロコントローラの普及、組み込みLinuxの広がり、そしてセキュリティ要件の高まりにより、将来的にはRustのような安全な言語の需要が増加する可能性があります。特に安全性やセキュリティが重視される分野では、コンパイラの認証問題や開発環境の整備が進めば、Rustが一定の役割を担うようになるでしょう。当面はC言語が主流であり続けますが、両言語の長所を活かした共存・連携の形が模索されていくことが予想されます。

37

Discussion

アムリタアムリタ

バイナリサイズが工夫しないとデカいのも原因かもですね。プロトタイプ基板ならリッチな環境にできますけど、最終的に利益の為にカツカツの環境で動かすので…

pdfractalpdfractal

未だにRL78とかの16ビットマイコン(ROM/RAMが数十~数百KB)とかの開発も多いですからね。たとえチップベンダーが言語をサポート舌としてもRUSTとか無謀ですよね(そもそも出来ないけど)。

rikkicatrikkicat

的確なご指摘だと思います。
スタックに4バイトしか積めなかった頃からC使ってますが、 alloca が提供された時点で無理にヒープ使わんで良いわと感じました。怖いので試しに一回使っただけですが…
ヒープのリファレンスカウンタは辛いですよね。
iPhone アプリを真剣に作る時は Objective-C で作りますが、流石に ARC 使いますね。