java原名c++++--
你想知道它對比c++開發效率高在哪裏,就要看它--裏面做了什麽
做個簡單的類比, java就像開車的自動擋c2駕照,c++就像是手動擋c1駕照
之所以用java,是因為java的執行時幫你做了很多事,你不需要自己去操作,丟給java的執行時去完成就好了,當然所有東西都是有代價的,那麽我們來看,這些代價,都是什麽
一個最重要的操作,就是java不允許使用者手動管理記憶體,但隨之而來的就是gc的問題
那這時候有兩種方案,一種是,哦,gc會帶來pause停頓,那麽我們回去用c++了,然後手動管理記憶體,還有一種是,哦,gc會帶來pause,那麽我們努力最佳化gc,讓pause盡可能降低
也就是一種是有問題,我們否定問題,不承認問題的存在,我們跟問題共存;還有一種是,有問題,我們解決它,就算無法完美滴解決,我們也努力滴逼近理想狀態
前者就是很多執著於c++程式設計師的選擇,後者就是java的zgc,shenandoah等新的gc策略所做的事
還有一個差異是編譯結果,java通常編譯產物是字節碼,c,c++等可以編譯成機器碼,前者是jit,後者是aot,那麽這又遇到了同樣的選擇,一種是,java編譯不成機器碼,我們回去用c++,還有一種,哦,java有編譯成機器碼的需求,那麽我們努力,寫一個編譯器,將其編譯成機器碼
前者就是c++程式設計師,後者就是graal專案所做的事
另外一個不太引人註意的差異就是執行時的大小,也就是編譯之後,包的大小,那又面臨選擇了,退回c++等語言的選擇就不說了,java對此做出的反應是,我們先將執行時模組化,然後允許使用者客製執行時,並在上面提到的graal裏面,同樣允許使用者制作更小的執行時,也就是graal的substrate的svm,而不是jvm
還有比如c++呼叫c的api相對容易,那麽這就是java的panama專案要解決的問題,還有java沒有值類別,那這就是valhalla專案要解決的問題……
所以你看,這些問題,你用c++來手動解決,行不行?
可以
但是java好就好在,它幫你解決了這些問題,那麽當你用java的時候
你失去的是語法上的混亂,得到的卻是一大堆免費開源的工具
c++的語法特性特別多,比java多很多,它總是嘗試讓使用者懂這個,懂那個,之後才能開發,最後發現,使用者總是這不懂,那不懂,最後編寫程式碼的過程變成了一個學習的過程,所以c++程式設計師永遠在學習,終其一生,也不敢妄言說自己精通c++,但是java的學習,理論上從第二節課開始,就要編寫各種小工具了,學個幾周,其實大多數人已經可以說是掌握了java了,用數年,說精通一點問題沒有,內容無非就那麽點
總結一下,java比c++開發效率高在哪裏,高在用java的時候,你可以不懂作業系統,不懂記憶體管理,不懂怎麽最佳化程式碼,甚至不懂程式語言的各種復雜特性,就把程式碼寫出來,而且執行的效率還挺高,比很多人手寫的c++程式碼還要高,而且更可愛的是,這個世界上有一大堆開源的貢獻者在幫你維護,制作這些工具,所以即便你不懂這個不懂那個,你也能寫出軟件來