これを行うにはいくつかの方法があります。
まず、「OS レベル」で実行されるコードは、OS と同じ言語で記述する必要はありません。OS コードと一緒にリンクできればよいだけです。事実上すべての言語が C と相互運用できます。実際に必要なのはこれだけです。
言語的には、技術的には問題ありません。Java 関数は C 関数を呼び出すことができ、C 関数は Java 関数を呼び出すことができます。また、OS が C で記述されていない場合 (C++ で記述されているという議論のために言いましょう)、OS の C++ コードは中間の C コードを呼び出すことができ、それが Java に転送されます。C は、ほぼプログラミングの共通語です。
プログラムが (ネイティブ コードに) コンパイルされると、そのソース言語は関係なくなります。アセンブラは、コンパイル前にソース コードがどの言語で記述されていても、ほとんど同じように見えます。OSと同じ呼び出し規約を使えば問題ありません。
より大きな問題は、ランタイム サポートです。OS で利用できるソフトウェア サービスは多くありません。たとえば、通常、Java 仮想マシンはありません。(技術的に存在しない理由はありませんが、通常は、存在しないと想定しても安全です)。
残念ながら、Java バイトコードとしての「デフォルト」表現では、Java プログラムは多くのインフラストラクチャーを必要とします。バイトコードを解釈して JIT する Java VM と、クラス ライブラリなどが必要です。
しかし、これを回避する方法が 2 つあります。
- カーネルで Java をサポートします。これは珍しいステップですが、実行できます。
- または、Java ソース コードをネイティブ形式にコンパイルします。Java プログラムを Java バイトコードにコンパイルする必要はありません。x86アセンブラにコンパイルできます。同じことが、使用するクラス ライブラリにも当てはまります。それらもアセンブラまでずっとコンパイルできます。もちろん、Java クラス ライブラリの一部には、使用できない特定の OS 機能が必要ですが、それらのクラスの使用は回避できます。
はい、それは可能です。しかし、それは簡単なことではなく、何を得ることができるかは不明です。
もちろん、別の問題として、Java では任意のメモリ位置にアクセスできないため、多くのハードウェア通信が非常に複雑になる可能性があります。しかし、おそらく、関連するメモリ領域を Java が処理する配列として返すだけの非常に単純な C 関数を呼び出すことによって、回避することもできます。