組込み・低レイヤーで使う言語
マイコンやOS寄りはC/C++が基本です。新規の安全性重視ではRustも候補になります。
- C
- C++
- Rust
- Bash
| 目的 | 見るポイント |
|---|---|
| 早く作る | 公式ドキュメント、サンプル、既存資産 |
| 長く保守する | 型、テスト、パッケージ管理、採用しやすさ |
| 学習する | 最初の成功体験、教材、開発環境 |
追加調査で押さえる実務ポイント
組込み・低レイヤーで使う言語は、CPU、memory、interrupt、register、device、realtime制約へどこまで直接触れるかで選びます。「低級言語」は単に難しい言語を指すのではなく、hardware表現へ近く、runtime抽象化が小さい言語・assemblyを指す文脈があります。MCU、Linux SoC、safety、battery、memory量、vendor SDKを先に決めて、C、C++、Rust、Ada、Zig、assembly等を比較します。
目的から選ぶ
| 条件 | 候補 |
|---|---|
| 小型MCU・vendor SDK | C |
| C++ library・RTOS | C++ |
| memory safety | Rust |
| safety-critical | Ada、SPARK |
| C置換を試す | C3、Zig |
| register直接制御 | Assembly / C |
| TinyGo ecosystem | TinyGo |
| Linux SBC | C、C++、Rust、Go |
「低級言語」の整理
| 用語 | 意味 |
|---|---|
| machine code | CPU instructionのbinary |
| assembly | mnemonicによるCPU命令 |
| low-level language | hardware抽象が小さい |
| system language | OS・runtime・driver向け |
| embedded language | 組込み用途で使われる言語 |
Cはassemblyより高水準ですが、一般にsystem programming languageとして扱われます。
選定軸
- CPU architecture。
- RAM/flash。
- realtime。
- interrupt。
- vendor SDK。
- compiler。
- debugger。
- certification。
- power。
- update。
最小例: memory-mapped register
#define GPIO_OUT (*(volatile unsigned int *)0x40020014u)
int main(void) {
GPIO_OUT = 1u;
for (;;) {
}
}
addressは架空例です。実機ではdatasheetとvendor headerを使います。
CとRust
Cはvendor SDKと既存codeが豊富です。Rustはownershipとtype systemでmemory errorを減らせますが、target support、HAL、debugger、unsafe boundaryを確認します。
Ada/SPARK
Adaはstrong typing、tasking、range checkを備え、SPARKはformal verificationを追加します。certification toolchainとruntime profileを確認します。
RTOSとの関係
languageとRTOSは別です。FreeRTOS、Zephyr、NuttX等がscheduler、driver、network stackを提供し、その上でCやRust等を使います。
Bare metalとLinux
| 環境 | 主な制約 |
|---|---|
| bare metal | startup、interrupt、linker |
| RTOS | task、priority、stack |
| embedded Linux | process、MMU、driver |
| FPGA softcore | toolchain、custom peripheral |
採用を保留する条件
- target未対応
- vendor driverなし
- debuggerなし
- safety evidence不足
- binary size超過
- interrupt latency不明
- OTA/rollback未設計
次に読む
参考リンク
- www.open-std.org - C standard
- doc.rust-lang.org - Embedded Rust
- www.adaic.org - Ada 2022
- nuttx.apache.org - Apache NuttX