Это можно сделать двумя способами.
Во-первых, код, работающий на «уровне ОС», не обязательно должен быть написан на том же языке, что и ОС. Он просто должен быть связан с кодом ОС. Практически все языки могут взаимодействовать с C, а это действительно все, что нужно.
Так что с точки зрения языка проблем технически нет. Функции Java могут вызывать функции C, а функции C могут вызывать функции Java. И если ОС написана не на C (скажем, ради аргумента, что она написана на C ++), то код ОС C ++ может вызывать некоторый промежуточный код C, который пересылается на вашу Java, и наоборот. C - это в значительной степени lingua franca программирования.
После того, как программа была скомпилирована (в машинный код), ее исходный язык больше не актуален. Ассемблер выглядит одинаково независимо от того, на каком языке исходный код был написан до компиляции. Пока вы используете то же соглашение о вызовах, что и ОС, это не проблема.
Более серьезная проблема - это поддержка во время выполнения. В ОС доступно не так много программных сервисов. Например, обычно нет виртуальной машины Java. (Нет причин, по которым технически не могло быть, но обычно, но обычно можно с уверенностью предположить, что его нет).
К сожалению, в своем "стандартном" представлении в виде байт-кода Java программа Java требует большой инфраструктуры. Ему нужна виртуальная машина Java для интерпретации и JIT байт-кода, а также библиотека классов и так далее.
Но есть два способа обойти это:
- Поддержка Java в ядре. Это был бы необычный шаг, но его можно было бы сделать.
- Или скомпилируйте исходный код Java в собственный формат. Программу Java не нужно компилировать в байт-код Java. Вы можете скомпилировать его на ассемблер x86. То же самое касается любых библиотек классов, которые вы используете. Их тоже можно было скомпилировать до ассемблера. Конечно, для частей библиотеки классов Java требуются определенные функции ОС, которые будут недоступны, но тогда использования этих классов можно было бы избежать.
Так что да, это можно сделать. Но это непросто, и непонятно, что вы получите.
Конечно, еще одна проблема может заключаться в том, что Java не позволит вам получить доступ к произвольным участкам памяти, что сделало бы большую часть аппаратной связи довольно сложной. Но это тоже можно обойти, возможно, вызвав очень простые функции C, которые просто возвращают соответствующие области памяти в виде массивов для работы Java.
person
jalf
schedule
26.03.2009