為什麼感覺 C和C++不火了?
你身邊的所有電子設備內,都是C或者C++寫的, 會淘汰嗎,有本事你們別用電子設備,C語言和C++在網際網路領域熱度肯定不如Java、python、js,我現在做的是工業軟體,在工業軟體、機器人、自動駕駛、嵌入式等等工業自動化相關領域,C/C++仍然是絕對的霸主地位。我這裡有一套單片機物聯網資料大全,想自學的小夥伴把,我想白嫖已經三連打在評論區,我給你發哦。選擇什麼程式語言不是根據難易程度,而是生態,比如做工業軟體開發也可以選擇Java,畢竟Java可以非常簡單的調用C++的代碼,android裡面應用比較多,但是做工業軟體開發一個團隊都是Java,那底層C++算法出問題誰去解決,一個團隊程式語言越多扯皮也是越多。
首先C和C++是兩個非常不一樣的程式語言。C語言在系統開發領域地位非常穩固,幾乎沒有替代產品。應用層開發今年來略微有被Rust取代的跡象。C++由於支持的編程範式過多,導致不同水平的人寫出來的代碼質量差異太大,這給軟體的穩健性帶來了很大的問題。所以除了對性能有很高要求的系統,一般都會選擇其他程式語言。Java之所以流行,一部分原因就是它比較死板,不太容易玩出騷操作。招來的Java程式設計師寫出來的代碼質量差異不至於太大。
長期來看,C++不會被淘汰,但是會變得小眾。說穿了,C++只不過是C語言的升級版,但C語言中存在的弊端在C++中依舊存在,直到後來,1995年,Java被SUN公司正式推出,Java的一些特性很受程式設計師們的歡迎,比如再也沒有C語言那樣的指針,再也不用考慮內存管理,而且還有真正的可移植性,編寫一次,到處運行,為了實現跨平台,Java中在作業系統和應用程式之間增加了一個抽象層叫Java虛擬機。用Java寫的程序都跑在虛擬機上,除非個別情況,都不用看到作業系統。
程式語言只是工具
工具的意義在於被使用
c被發明出來,有其歷史的局限性,當時的人,只能做到那個程度
科學技術要發展,就不可能局限在當時那個程度,所以才會有後來的c++
以及c++++--,也就是java最開始的名字
當然java在誕生之初,有各種問題,但是有問題就去解決問題,並不代表因為它有問題,所以人類科技就不要進步了
這裡要特別感謝蘋果和谷歌這種公司,尤其是在矽谷的那一干企業,因為正是他們的努力,才使得我們的程式語言越來越簡單
比如java在一開始就提供了內存自動管理機制,也就是gc,有了gc之後,內存泄漏的可能性就大幅下降了,但是gc會有在執行時候整個程序暫停的問題,那怎麼辦?這是一個問題,就要去解決這個問題,蘋果提出了arc,谷歌提出了將heap按照runner切割,java自身則在盡一切可能優化gc暫停時間,那到現在,即便是最暴力的縮短gc停頓時間這一維度上,都已經優化到了1ms以內,目前測試結果是16t的內存,可以在1ms以內完成,而且最大的暫停時間,只有區區的0.13ms[1],然後這個還在不斷優化中,並且在這個科技樹上,還進一步衍生出了比如shenandoah,lxr[2]等多種短暫停gc的選擇,並且這些gc策略,都由不同的公司完成,比如shenandoah主要有red hat紅帽完成,而lxr則是由Google的人完成,這進一步促進了這個領域的繁榮和發展
那gc都能被優化到1ms以內,還有幾個軟體不能接受這個時長的暫停呢?
作為參照和對比,人的反應時間是0.2秒,也就是200ms以上,經過訓練的運動員,可以達到0.1s也就是100ms,再低就不太可能了,然後人的眼睛,對於動畫的敏感度,大概在60幀左右,也就是1/60,大約是16-17ms之間這樣子,所以低於1ms的暫停,人是感覺不到的,你感覺得到的話應該去國家安全機構應聘,因為國家需要你這種超能力者
這是一方面
另外一方面,c++對於c的兼容性,在早期也是一個優勢,就比如你用c++,調用c寫的類庫,比較簡單,相比之下,用java的jni,就很麻煩,那jni就是ffi的一種,所謂ffi,就是調用其他語言的api的這麼一個功能
比如你用java,要調用c寫的類庫,dll/so/dylib這種,就非常麻煩,jni用起來,既要懂c,又要懂java,那這個就明顯阻礙了普通用戶的使用
那ffi這一塊這些年也是發展迅速,改善明顯,現在普遍能夠實現的就是,讓用戶不需要碰c等代碼,通過工具,可以自動生成對應的語言接口,這樣就可以讓用戶在不懂c的前提下,也能調用c編寫的api,那native部分語言,大部分都提供了跟c兼容的方式,比如說swift的@_cdecl,那通過c,就可以將大部分語言連接起來,而且不需要用戶了解c的知識,也能夠將其利用
那這個就很方便了,就會出現一種情況,就是,我不需要知道你是怎麼做的,我也不需要懂你所用的知識,但是這都不妨礙我使用你的勞動成果
ffi領域這些年的發展,主要就是要達成這個目標
這一塊不管是蘋果還是谷歌,都有自身相應產品,比如上文說的swift的@_cdcel,swift沒有gc,所以跟c兼容起來比較容易,那flutter和java這種,需要的工作量就大一點,因為c沒有gc,所以c畫出來的內存,你是不是也要將其納入gc掃描的範疇之內呀?你看,這裡就有很多工作要做
但是經過七八年的發展,也基本上接近完工了,相關文檔,直接看官方文檔就行了,java的內容多一點,那有了ffi之後,你對有gc的軟體性能不滿意,你完全可以自己動手,用native語言實現一個,然後嫁接到你的代碼中去
然後是第三個發展方向,就是將帶有gc的語言編寫出來的軟體自身,編譯成native
之前java等語言,跟c等native語言,一個實質性的差別就是編譯產物,java編譯成位元組碼,然後在執行時候,再將位元組碼翻譯成機器碼執行,而c,c++語言則是直接編譯成機器碼
那除了位元組碼以外,還有其他的中間碼,比如llvm用的bitcode,當然原因不是為了跨平台,而是為了復用編譯器後端,為動態類型和靜態類型語言提供一個統一的編譯器後端
那因為在這些代碼執行的時候,多了編譯成機器碼這一步,所以啟動時候相對較慢,而且運行時也相對大一點,因為多了一步工作嘛,那這個在某些場景下,就會降低用戶的體驗
所以將源碼編譯成機器碼的需求,其實是存在的
那最早開始對這一塊動手的,還就是谷歌,的安卓,因為客戶端app對這些性能比較敏感,你下載一個app,又大又慢,用戶肯定會有意見,早些年的安卓,被詬病說,不如ios流暢,就是因為jvm變種dalvik的緣故,時至今日,蘋果在介紹swift的時候,還在暢談aot和jit對比下,aot的好處
所謂aot就是將源碼編譯成機器碼,而jit就是傳統java那種方式,先編譯成位元組碼,然後在運行時再編譯成機器碼再執行
那既然蘋果和谷歌都認為,aot有好處,那這裡就有需求存在,所以安卓後來就製作出了art,android runtime,安卓運行時,就是把app直接編譯成機器碼,就是aot
隨後誕生的flutter,也同時提供了jit和aot兩種編譯選項,允許用戶在測試時候,使用jit編譯,編譯執行,並在app發布的時候,使用aot編譯,編譯成機器碼,以給終端用戶更好的使用體驗
隨後java又提供了graal等項目,實現了aot,時至今日,java也已經表態,要制作project leyden,也就是正式的aot功能
這一塊是將來大概十年左右時間的發展重點,那java等語言能夠同時提供jit和aot兩種選擇,那相比之下,c/c++只能aot,不能jit,那自然受眾就要小一點了
其他還有一些功能性上的特性,比如值類型,可以連續內存,在軟體吃特別大內存時候,這些特性可以幫助節省內存,還有虛擬線程等等,不一一列舉
但是總得說來,這些年,程式語言發展方向是朝著開發越來越簡單,對用戶要求越來越低的方向上去在發展
過去,我們需要一個程式設計師懂指針,懂得回收內存垃圾,懂各種古里古怪的語法,還有各種知識
但是隨著科學技術的發展,我們越來越不需要一個程式設計師什麼都懂,你不懂也沒關係,不妨礙我們實現我們的目的就好了
隨著科學技術的發展和進步,編程手段會越來越豐富,越來越簡單,越來越規範
這或許能回答你的問題,為什麼不火了,因為現在你有更加簡單的手段去實現你的目的