軍工,即軍事工業,是工業領域的一個分支。工業控制,必然是C/C++的主戰場。工業控制,講究的是極高的穩定性,穩定壓倒一切。同時,還講究實時性。在控制過程中,一旦出現不穩定或大的延時,后果可能就是致命的。軍工,那要求更加嚴格,簡直就是性命攸關!
游戲有時也有類似的特點,但是出現問題,大不了就輸一局比賽,損失一件高端游戲裝備,這與軍工的損失完全不在一個重量級。
而Java廣泛用于應用級開發,特別是web平臺和手機app。哪怕是在線支付,對于穩定性和實時性的要求也沒有那么高。經常我們遇到服務不可用之類的錯誤,“請刷新重試”。關系不大,多刷新幾下就好了嘛。事務機制基本能保證不會亂扣錢,但是保證不了一次性成功以及高度的實時性。
而在工業控制中,關鍵操作可不敢“刷新重試”。在類似駕駛的控制中,關鍵指令延遲0.1秒可能都是致命的。
說了這么多,這與C/C++和Java有什么關系的?
兩者最大的區別就是:Java是帶虛擬機的,是帶垃圾回收的,而C/C++不帶。垃圾回收往往是不可控的,不知道什么時候就執行了垃圾回收,這個時間可能很短,也可能很長。在垃圾回收時,就會帶來卡頓。Java雖然也有運行時編譯、“預熱”機制,但都是難以控制的,具有不確定性。說的直白點,你把一切希望都寄托到了Java虛擬機(JVM)。而對于工業控制,尤其是軍工,肯定盡量要求一切要盡在掌控中。
對于要求最高的控制場景,那都不能用windows或常規Linux,因為它們是分時系統,是多任務的,是非實時的。這時候,可能最簡單的才是最可靠的。單任務、單進程、單線程,去除一切用不到的功能。連聲卡、顯卡、網卡、硬盤/SD卡,都不是必需的。甚至更夸張一點,連操作系統都沒有!
windows、普通的Linux,能做到10毫秒的精度。定制的嵌入式系統,能做到毫秒級的精度。而高度優化的,不帶操作系統的板子,甚至可以做到微秒級別的實時控制。
注意一下,光在真空中1微秒只傳輸300米。最極端的,最快的控制是最原始的機械緊急停止按鈕。它的延遲恰好就是光在線路中的傳輸時間。所以大家就能明白,為什么越簡單越可靠越快。
有了這些基礎,大家就能明白,在非常“低級”的系統中,只有匯編和C可以運行起來,虛擬機和解釋器是跑不動的。就算跑起來,也是很慢的,很消耗資源的。
Java,其底層就是用C語言寫的。大家若不相信,請馬上去閱讀Java源代碼中有關壓縮、JPG圖像、科學運算(sin、cos、log、pow等)的部分。另外虛擬機也是用C寫的。所以理論上來說,只要是Java能做到的,特別是性能方面,C語言都可以做到。
對于業務系統,Java是非常合適的,開發效率高,生態系統好。但是對于軍工,開發效率要讓位于執行效率以及可靠性、實時性、低功耗。人們愿意花費更多的研發時間去開發這樣的系統,哪怕是重復造輪子也在所不辭,因為這是性命攸關的,有時甚至是不計成本的。