На моей работе мы недавно завершили системную архитектуру для управляющего приложения, максимальная задержка которого составляет примерно одну-две секунды. Он распространяется на небольших встроенных в ARM блоках, взаимодействующих через IP-сеть.
Изначально мы предвидели, что будем использовать C или C ++, поскольку это классический язык системы управления. После обсуждения того, как реализовать приложение, мы теперь понимаем, что C ++ имеет довольно ограниченное количество библиотек, не имеет интроспекции и обладает некоторыми другими свойствами, которые могут замедлить разработку. Мой коллега тогда предположил, что Java может подойти для этой работы.
Я действительно напуган задержкой запуска GC для управляющего приложения, и я также не хочу отбрасывать RAII, так как приложение будет использовать много внешних ресурсов (сокеты, файловые дескрипторы, дескрипторы из внешних библиотек) и т.д.).
Список pro / con в настоящее время выглядит следующим образом:
C++
+ RAII - Easy resource management - it will be a complex system
+ System language - speed if we cant't find a JIT VM for our ARM
+ No GC - no big worst case latencies from the GC
+ Easy to integrate with some shared mem libs that we have to interface with
- Fewer free as in beer libs
- Lacks introspection - Mapping classes to DB and external data formats (XML)
would benefit from this (ORM /JAXB) approach
- Easy to shoot one self in the foot - hard and expensive to find programmers
which don't make big mistakes
- Memory fragmentation - needs tuning and workarounds
Java
+ Huge amount of libs
+ Introspection - serialization becomes a breeze (see C++ section)
+ Easier to find 'good enough' programmers
- No RAII - Client has to remember finally or you leak
resources. IMO Java programmers tend to ignore this
problem unless they have server app background.
- No System Language - possibly slower although ARMj could alleviate this
- GC - latency might go up (don't know if parallel GC will work - seems that
you might get fragmentation, see note below).
- Need to write JNI for the shared mem libs that we interface with
- Maybe ORACLE will eat us
Фрагментация памяти с параллельным GC была упомянута в этой статье AMD
Я бы хотел использовать Java, если задержка GC не была проблемой, и мы могли бы получить RAII. Следовательно
Я также изучил другие языки, которые имеют RAII и могли бы послужить хорошей альтернативой, и до сих пор я обнаружил, что D, Ada, VB, Perl, Python (C), PHP, tcl и Lua, похоже, имеют своего рода Вне области обратного вызова. Моя спонтанная реакция на то, что, возможно, D, Python и ADA могут подойти для приложения управления. D и ADA мои любимые.
Итак, мой вопрос: есть ли у вас какие-либо рекомендации по этому поводу? Является ли Java жизнеспособным вариантом, и если бы вы могли выбрать какой-либо язык, каким он был бы?