組み込みシステム用のプログラミング言語を決めることは、システム構築にあたって最も重要な決定になるかもしれません。私はこれまでにさまざまな言語を使用して、膨大な数の組み込みシステムを構築してきました。本記事では、言語の使用と選択に関する提言に加えて、他の開発エキスパートによるヒントも紹介します。
記事の内容:
組み込みプログラミング言語とは、組み込みシステムの開発に使用するプログラミング言語です。一般的にこの言語では、デバイスハードウェアに対するローレベルのアクセスが可能です。開発者は組み込みシステム用に複数の共通のプログラミング言語を使用します。
これは組み込みコーディング言語と呼ばれる場合もあります。しかしプログラミングにはコーディング以外にもさまざまな要素が含まれています。
開発者は組み込みシステムで多様なプログラミング言語を使用します。最も一般的な言語としては、C、C++、Python、MicroPython、Javaが挙げられます。
開発者が組み込みシステムで頻繁に使用するプログラミング言語には、いくつかの重要なメリットがありますが、ほとんどの言語にはデメリットもあります。ここでは一般的な組み込みプログラミング言語のメリットと制限を示します。
C開発者は、組み込みシステムのニーズに応じてその他の言語も使用しています。それらの言語は組み込みシステムで一般的なものではありませんが、特定の用途ではよく使用されており、システムによっては非常によく適合する場合があります。
Ada
一般的にプログラミング言語と呼ばれている言語の中には、実際には「ハードウェア記述言語(HDL)」であるものがあります。主なHDLとしては、VerilogとVHDLの2つが挙げられます。
エンジニアはHDLを使用して電子回路をシミュレートし、そのシミュレーションを電子回路から独立させて活用できます。HDLはシステムの設計、テスト、デバッグ、タイミング解析に使用されています。
Qtの組み込み製品の計画と要件ガイドブックでは、上位6つの組み込みプログラミング言語の詳細を説明するとともに、比較表を示しています。この表ではプログラミング言語の重要な特徴を比較しています。
C | C++ | Java | Python / MicroPython | JavaScript | Rust | |
Strenghts | HTML5/CSS | Embedded, baremetal, standalone apps, IoT |
Web, cloud | Cloud, data science | Web | Embedded, bare-metal |
Ease of development | ★★★ | ★★ | ★★★ | ★★★★★ | ★★ | ★★★★ |
Expressive power |
★ | ★★★★ | ★★ | ★★★★★ | ★★★ | ★★★★ |
Ease of maintenance | ★★★★ | ★★★★ | ★★★★ | ★★★ | ★ | ★★★★ |
Longevity | ★★★★★ | ★★★★ | ★★★ | ★★★ | ★ | ★ |
Runtime efficiency | ★★★★★ | ★★★★★ | ★★★ | ★★ | ★ | ★★★★ |
Library/module availability | ★★★★ | ★★★★ | ★★★ | ★★★★ | ★★★★ | ★★ |
Low-level interface | ★★★★★ | ★★★★★ | ★★ | ★★★ | ★ | ★★★★ |
Connectivity support | ★★ | ★★★/★★★★★¹ | ★★★★ | ★★★★★ | ★★★★★ | ★★ |
Graphics support | ★★★★ | ★★★★★ | ★★★ | ★★★ | ★★★★★ | ★ |
Developer community |
★★★ |
★★★ | ★/★★★★² | ★★★★ | ★★★★★ | ★★ |
★ is the lowest ranking while ★★★★★ is the highest.
1 Provides high level of connectivity and networking support when platform libraries included
2 Java Developer community exclusive of Android (low) and inclusive of Android (high)
組み込みシステム用のプログラミング言語を選択するには、各言語の強みと弱みを理解する必要があると専門家は指摘しています。またシステムの制限事項と目標を認識することも重要です。
組み込みシステムでは多くの場合、CまたはC++が最適な選択になります。それらが「コンパイル型」言語であり、効率性が非常に高いことが1つの理由です。コンパイル型言語の場合、マシン(組み込みデバイス)が直接コードを変換するため、高速で安定性が高くなります。
メモリーや電力が限られているデバイスでは、その効率性が必要です。そうしたデバイスで多くのプログラマーがCまたはC++を使用するのはそのためです。CまたはC++は、マイクロコントローラーや、リアルタイムOSを搭載した組み込みデバイスでよく使用されています。そのようなシステムではCとC++で得られる速度と効率性を必要とします。CやC++は、その他の組み込みシステムでも使用されています。すべての組み込みシステムの約80%でCプログラミング言語が使用されていると見積もる専門家もいます。
しかし組み込みシステムは、「インタープリター」方式のプログラミング言語でも同等に、あるいはさらに効率的に機能する可能性があります。インタープリター方式の言語の場合、組み込みデバイスではコードを直接変換しません。代わりに別の、デバイス上で動作するインタープリタープログラムがコードを実行します。組み込みシステムによっては、インタープリター方式の言語の利点は非常に大きくなります。コンパイル型言語とは異なり、インタープリター方式の言語はOS間での移植も簡単です。またプログラマーが容易に習得できる言語です。
インタープリター方式のプログラミング言語の例としては、PythonとJavaScriptが挙げられます。インタープリター方式では追加の処理が必要になるため、コンパイル型言語よりも処理が遅くなりがちです。ただし速度は向上しつつあります。組み込みデバイスで機械学習を行う場合は、PythonとMicroPythonには非常に大きなメリットがあります。
Adaは、デバイスに高度なセキュリティと安定性を求める場合(医療機器、航空機、軍装備品など)に適したプログラミング言語です。
専門家は、プログラミングチームの能力と経験を認識することが重要であると指摘しています。Beningo氏は次のように説明しています。「私はいつも、エンジニアのスキルセットをよく確認すべきであるとアドバイスしています。そして可能であれば、C++の使用を勧めています。しかしCに慣れたエンジニアの場合は、C++への移行がむずかしいケースがあります。つまり、チームの経験とスキルセットをよく確認することが重要なのです」(組み込みエンジニアが必要とするスキルの詳細をご確認ください)。
組み込みシステムを専門とする独立系ソフトウェア開発者でコンサルタントのBurkhard Stubert氏は、企業ではプログラミング言語の選択肢が限られていることが多いと説明しています。既存のシステムまたは関連システムで使用されているプログラミング言語をそのまま使用するためです。
「実際には、言語を選ぶというよりも、言語に選ばれると言ったほうがいいかもしれません。組み込みシステムでは、それが一般的にC、C++、またはPythonになります。そこから始めるしかありません」とStubert氏は語ります。
どのような組み込みプログラミング言語にもメリットとデメリットがあります。たとえば、グラフィカルユーザーインターフェースについてメリットを発揮する言語があります。選択する言語について調査する場合は、GUIについても考慮することが重要です。GUIを使用するシステムではJavaScriptのようなインタープリター方式の言語が適しているでしょう。
組み込みプロジェクトのニーズに最適な言語を明確に判断できる場合もあります。開発者の習熟度と個人的な嗜好が重要な基準になることも多いからです。Qtでは、できるだけ開発者が使い慣れたプログラミング言語でソフトウェアを作成できることを考慮しています。The Qt CompanyはC++、QML(Qtが開発した使いやすい宣言型言語)、Pythonをサポートしており、コミュニティではさらにRustやGoなどの言語もサポートしています。
Qt QMLを使用してシステムのユーザーインターフェースを設計する方法や、他のQt製品を使用して多様な言語で優れた組み込みシステムを構築する方法をご確認ください。
商用ライセンスのトライアルやオープンソースを利用したい方は、ぜひQtの無料トライアルを開始してみてください!また、Qtについてご質問あり場合は、お気軽にお問い合わせください。