Я скептически отношусь к риску обратного проектирования сложного программного обеспечения, написанного на Java, но для целей вашего вопроса я готов это оговорить. Я предполагаю, что те же самые проблемы исключают любой другой язык, который реализован только в JVM.
Наиболее существенными аспектами Java являются
- Система статического типа
- Система классов на основе классов
- Автоматическое управление памятью
- Нет автономных функций или модулей вне системы класса / интерфейса
- Дженерики
Эта комбинация может быть воспроизведена на языке, подобном C #, но я предполагаю, что те же возражения, что и у вас относительно распространения байт-кода JVM, также применимы к байт-кодам MSIL.
Мне трудно придумать язык, который обладает всеми этими функциями. Вот несколько близлежащих языков:
C ++ имеет все, кроме автоматического управления памятью, плюс он позволяет автономные функции. Однако универсальный механизм (шаблоны) C ++ не для слабонервных, и он (пока) не поддерживает модульную проверку типов. Гораздо больше гибкости, чем Java, но и гораздо больше способов оторваться. Используйте с осторожностью.
В Modula-3 есть все вышеперечисленное, но по сути это мертвый язык, плюс, как и в C ++, нет модульной проверки типов для обобщений.
Я недостаточно знаком с Эйфелевой, чтобы иметь возможность проводить хорошие сравнения, но я думаю, что стоит посмотреть.
Delphi тоже стоит посмотреть. Вроде бы все выше, кроме дженериков. В первую очередь это проприетарная среда Windows (ранее известная как Object Pascal), но, похоже, существует компилятор с открытым исходным кодом «Free Pascal», который поддерживает Delphi.
Существует множество объектно-ориентированных языков с автоматическим управлением памятью и динамической типизацией, среди которых можно выделить ruby, Python и Smalltalk. Ничто из этого не компилируется хорошо и надежно в автономный машинный код, хотя все они подталкивают к некоторой форме экспериментальной компиляции. И все они динамически набираются, что сильно отличается от того, к чему вы привыкли.
Если бы я был на вашем месте, я бы, вероятно, пошел на использование Java и допустил бы некоторый риск реверс-инжиниринга. Декомпиляторы не так хороши, как вы могли подумать, и они также не создают кода, который можно легко поддерживать. Но если вы действительно хотите иметь возможность создавать собственный машинный код, я бы исследовал Delphi и Eiffel. (Я бы сам использовал Modula-3, но это потому, что я однажды вложил значительные усилия в его изучение. Это очень хорошо продуманный язык для своей ниши, но сообщество пользователей уже ушло, и я думаю, что это пустая буква. Жаль.)