當前位置: 華文問答 > 數位

為什麽 Java 語言會有「虛擬機器」這個概念?

2022-11-01數位

循序漸進,簡單易懂概括一下虛擬機器執行環境的好處和壞處。

第一步跨平台。這個是最基礎的一個好處,不同芯片不同指令集不同環境,虛擬機器提供了一個統一的指令執行環境,不同的平台只要適配了虛擬機器,程式就能夠相容執行。

"你也不想每個平台重新編譯一次,對吧"。

第二步方便偵錯。就像你在題目中說的,如果只是跨平台,c語言一樣可以做到啊,我們把底層的硬體相關程式碼統一介面,上層呼叫,我們做好底層庫的支持呼叫就行了,上層程式碼不照樣跨平台,但一個工程計畫開發環境最重要的並不僅僅是編譯環境,還有偵錯環境,而c語言的偵錯環境是具有非常強的平台相關性,並與編譯器有高度的依賴習慣性,不同的平台偵錯程式,偵錯程式實作起來千差萬別,因此,基於虛擬機器來實作一個通用的偵錯環境,要比直接依賴平台實作偵錯程式方便的多。

"你也不想每個平台重新編寫一套偵錯程式,對吧"。

第三方便抽象,例如new一個物件這個過程,本質上涉及到了很多的包裝細節,例如物件的記憶體分配管理,構造,靜態區初始化,如果這個直接讓原生指令集來支持,幾乎是不現實的,一則沒有必要,二來這會導致電路設計極度復雜甚至是不可實作,但虛擬機器環境你可以對這些實作細節交給底層程式碼進行管理,能夠簡化上層編譯器工作量減少上層程式碼的空間,同時能夠提供邊界檢查,空指標參照,gc機制等多種查錯及管理方案。如果沒有這些抽象功能:

"你也不想被派去做這款芯片,對吧"。

第四方便進行任務排程。多工執行(比如多執行緒)很多時候也是強平台相關的,如果上os沒有直接的多工支持,比如在嵌入式裸機開發中,一個非常頭疼的問題是大多開發大量使用fsm(有限狀態機),導致一個任務執行下來,要寫一大堆的狀態進行切換,導致程式碼越堆越大,後期越來越難維護,但虛擬機器環境可以實作一個平台無關的多工執行機制,完全由自己掌控指令切片及資源分配,為上層語言提供方便,減輕上層開發人員工作量。

"你也不想再過幾年就脫發了,對吧"。

第五容錯率更高,在原生程式碼中,如果一個程式中出現了錯誤,那麽整個程式很可能都沒辦法繼續執行下去了,如果沒有作業系統進行行程管理之類的操作外,一些MCU環境需要一系列類似於看門狗之類的操作來讓程式重設,當然使用一些程式架構的方式可以讓程式具有一定的魯棒性,但總體來說開發成本仍然太高了,如果一個程式需要承載幾萬幾百萬的的並行及任務,幾個任務的錯誤導致整個程式都隨之崩潰顯然是不可接受的。因此,我們希望程式具有一定的容錯能力,就像作業系統一樣一個軟體程式崩潰了不會導致整個系統宕機,虛擬機器恰好就能提供這種功能,把那些發生錯誤的任務中止而不影響正常點業務

"你也不想每個周末都被叫回辦公室擦屁股,對吧"。

第六方便建立生態,為什麽Java,Python能夠流行起來的原因主要是有幾點,一是上層語言學習曲線簡單友好,方便入坑,培訓機構三個月上崗,有時還真不是吹的,二是統一的執行環境方便各種庫的開發,大量好用的庫又吸引了大量開發者進一步完善,進一步又提高了生產力,形成良性的生態迴圈。

我一直認為一個技術方向是否成功,必須放在工業界看看能否真正提高生產力真正用更低成本解決實際問題。實踐始終是檢驗真理的唯一標準。

"你也不想學了一個網上都在吹,PPT和軟廣新聞各種發,最後出來發現根本就沒人用的東西,對吧。"

虛擬機器壞處:一胖一慢毀所有。

自制虛擬機器+對應語言+偵錯程式以示我不是在雲