Web開発者が「Cと組み込み開発」を調べて驚いたこと

目次
for文すらも気を抜けない世界だった
私はこれまで、3年ほどWordPressやjQueryなどを使ったWeb制作を経験し、その後は2年ほどReactを中心としたWebアプリケーションのフロントエンド開発に携わってきました。最近、とある事情で「C言語(以下C)での組み込み系開発」に関心を持ち、関連する資料や技術情報を調べる機会がありました。
その中で、Web開発と組み込み系のC言語開発では考えるべきことがまったく違うと実感し、ある種カルチャーショックを受けました。今回はその気づきをいくつか共有してみたいと思います。
for文すらも雑に書けない世界
Web開発では、100件の配列を単純にループ処理すること自体に特に慎重さを求められることは少ないかもしれません。Cではどうでしょうか。次のような例で考えてみます。
int array[100] = {0};
for (int i = 0; i < sizeof(array); i++) {
printf(“%d\n”, array[i]);
}
一見すると問題ないように見えます。しかし、残念ながらこれでは期待した通りの結果にはなりません。まず sizeof(array) は「バイト数」なので、sizeof(array)/sizeof(array[0]) にしなければ正しくループできません。
JavaScriptではlength()というような配列の要素数をそのまま返してくれるメソッドが用意されているため、上記のように書いて期待した通りの動作にならなかったときに少し戸惑いました。
では、上記のように修正したら期待通り動くでしょうか。結論、問題なく動きます。
では、これで良いのかというとそうとも言えないところが組み込み系にはあるようでした。
つまり、本当に100回ループする必要があるのか?ということです。
組み込みではCPU資源が限られており、ループ回数の最小化や、処理すべき要素の事前フィルタリングについてもシビアに検討する必要があるようでした。
「なんとなくループしておくか」といった実装は通用しない可能性がある、と感じました。
それってメモリのどこに確保されてるの?
Web開発では、変数や配列の確保についてメモリの細かい場所まで意識する必要はほとんどありません。しかしCでは、グローバル変数/スタック領域/ヒープ領域といったメモリの使い分けが非常に重要なようでした。
特に組み込み環境では「スタック領域が数キロバイトしかない」といった状況もあるようで、少しでも無駄なメモリを割り当てるとバグやフリーズの原因になり得ます。
時間ってそんなに大事? → 組み込みでは超重要
「処理時間が多少かかっても、結果的に動けばOK」と考えることも、Webではときに許容されます。しかし組み込みではこちらにも細心の注意が必要だと感じました。
たとえば車載カメラやセンサー処理のような場合を想像してみてください。「センサーからの応答は数ミリ秒以内に済ませなければ異常扱いとする」という条件が必要になりそうです。処理に時間がかかってしまって衝突を回避するための緊急ブレーキ作動が遅れてしまっては命に関わることも考えられます。
このような例を考えてみると、処理時間の計測・最適化が重要になることは自明に感じました。
割り込みが来たらアウト?長い処理はリスクになる
組み込みでは「割り込み処理」という、CPUが外部イベントに即時反応する仕組みがあるようでした。ここに重い処理を入れてしまうと、他の重要な処理が止まってしまう危険性があります。
「この処理は3秒かかるけどまあいいか」では済まされない世界です。コードのどの部分がいつ・どこで止まるのか、その影響範囲まで意識する必要があると感じました。
try-catch?そんなものないよ
調べてみたところ、C言語には例外処理(try-catch)がありませんでした。つまり、異常系はすべて明示的に return 値などでハンドリングする必要があります。
これは書く側にも、使う側にも厳しい制約ですが、「あいまいに処理しない」「戻り値を必ず確認する」といった文化の裏付けにもなっていると感じました。
まとめ:「Cで組み込みをやる」ということは、まったく別の思考法が必要
C言語自体も、ポインタやメモリ操作などで難しい言語ですが、それ以上に組み込み開発の現場では「どこに何があるのか」「何がいつ実行されるのか」「処理はどのくらい重いのか」といった厳格な設計判断が必要であると感じました。
まだ調べ始めたばかりの段階ですが、Webエンジニアとしての感覚で組み込みに飛び込むと、思わぬ落とし穴にはまることもありそうだなと感じました。
また引き続き、気づいたことなどをブログに書き残していけたらと思っています。