為什麼感覺 C和C++ 不火了?

2022-06-15     大方老師單片機

原標題:為什麼感覺 C和C++ 不火了?

為什麼感 CC++不火了?

你身邊的所有電子設備,C或者C++, 淘汰嗎,有本事你們別用電子設備C語言和C++在網際網路領域熱度肯定不Javapythonjs,我現在做的是工業軟體,在工業軟體、機器人、自動駕駛、嵌入式等等工業自動化相關領域C/C++仍然是絕對的霸主地位。我這裡有一套單片機物聯網資料大全,想自學的小夥伴把我想白嫖已經三連打在評論區,我給你發。選擇什麼程式語言不是根據難易程度,而是生態,比如做工業軟體開發也可以選Java,畢Java可以非常簡單的調C++的代碼android裡面應用比較多,但是做工業軟體開發一個團隊都Java,那底C++算法出問題誰去解決,一個團隊程式語言越多扯皮也是越多。

CC++是兩個非常不一樣的程式語言C語言在系統開發領域地位非常穩固,幾乎沒有替代產品。應用層開發今年來略微有Rust取代的跡象C++由於支持的編程範式過多,導致不同水平的人寫出來的代碼質量差異太大,這給軟體的穩健性帶來了很大的問題。所以除了對性能有很高要求的系統,一般都會選擇其他程式語言Java之所以流行,一部分原因就是它比較死板,不太容易玩出騷操作。招來Java程式設計師寫出來的代碼質量差異不至於太大。

長期來看C++不會被淘汰,但是會變得小眾。說穿了C++只不過C語言的升級版,C語言中存在的弊端C++中依舊存在,直到後來,1995JavaSUN公司正式推出Java的一些特性很受程式設計師們的歡迎,比如再也沒C語言那樣的指針,再也不用考慮內存管理,而且還有真正的可移植性,編寫一次,到處運行,為了實現跨平台Java中在作業系統和應用程式之間增加了一個抽象層Java虛擬機Java寫的程序都跑在虛擬機上,除非個別情況,都不用看到作業系統。

程式語言只是工具

工具的意義在於被使用

c被發明出來,有其歷史的局限性,當時的人,只能做到那個程度

科學技術要發展,就不可能局限在當時那個程度,所以才會有後來c++

c++++--,也就java最開始的名字

java在誕生之初,有各種問題,但是有問題就去解決問題,並不代表因為它有問題,所以人類科技就不要進步了

這裡要特別感謝蘋果和谷歌這種公司,尤其是在矽谷的那一干企業,因為正是他們的努力,才使得我們的程式語言越來越簡單

java在一開始就提供了內存自動管理機制,也就gc,有gc之後,內存泄漏的可能性就大幅下降了,但gc會有在執行時候整個程序暫停的問題,那怎麼辦?這是一個問題,就要去解決這個問題,蘋果提出arc,谷歌提出了heaprunner切割java自身則在盡一切可能優gc暫停時間,那到現在,即便是最暴力的縮gc停頓時間這一維度上,都已經優化到1ms以內,目前測試結果16t的內存,可以1ms以內完成,而且最大的暫停時間,只有區區0.13ms[1],然後這個還在不斷優化中,並且在這個科技樹上,還進一步衍生出了比如shenandoahlxr[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寫的類庫,比較簡單,相比之下,javajni,就很麻煩,jni就是ffi的一種,所ffi,就是調用其他語言api的這麼一個功能

比如你java,要調c寫的類庫dll/so/dylib這種,就非常麻煩jni用起來,既要c,又要java,那這個就明顯阻礙了普通用戶的使用

ffi這一塊這些年也是發展迅速,改善明顯,現在普遍能夠實現的就是,讓用戶不需要c等代碼,通過工具,可以自動生成對應的語言接口,這樣就可以讓用戶在不c的前提下,也能調c編寫apinative部分語言,大部分都提供了c兼容的方式,比如swift@_cdecl,那通c,就可以將大部分語言連接起來,而且不需要用戶了c的知識,也能夠將其利用

那這個就很方便了,就會出現一種情況,就是,我不需要知道你是怎麼做的,我也不需要懂你所用的知識,但是這都不妨礙我使用你的勞動成果

ffi領域這些年的發展,主要就是要達成這個目標

這一塊不管是蘋果還是谷歌,都有自身相應產品,比如上文說swift@_cdcelswiftgc,所以c兼容起來比較容易,flutterjava這種,需要的工作量就大一點,因cgc,所c畫出來的內存,你是不是也要將其納gc掃描的範疇之內呀?你看,這裡就有很多工作要做

但是經過七八年的發展,也基本上接近完工了,相關文檔,直接看官方文檔就行了java的內容多一點,那有ffi之後,你對gc的軟體性能不滿意,你完全可以自己動手,native語言實現一個,然後嫁接到你的代碼中去

然後是第三個發展方向,就是將帶gc的語言編寫出來的軟體自身,編譯native

java等語言,cnative語言,一個實質性的差別就是編譯產物java編譯成位元組碼,然後在執行時候,再將位元組碼翻譯成機器碼執行,cc++語言則是直接編譯成機器碼

那除了位元組碼以外,還有其他的中間碼,比llvm用的bitcode,當然原因不是為了跨平台,而是為了復用編譯器後端,為動態類型和靜態類型語言提供一個統一的編譯器後端

那因為在這些代碼執行的時候,多了編譯成機器碼這一步,所以啟動時候相對較慢,而且運行時也相對大一點,因為多了一步工作嘛,那這個在某些場景下,就會降低用戶的體驗

所以將源碼編譯成機器碼的需求,其實是存在的

那最早開始對這一塊動手的,還就是谷歌,的安卓,因為客戶app對這些性能比較敏感,你下載一app,又大又慢,用戶肯定會有意見,早些年的安卓,被詬病說,不ios流暢,就是因jvmdalvik的緣故,時至今日,蘋果在介swift的時候,還在暢aotjit對比下,aot的好處

aot就是將源碼編譯成機器碼,jit就是傳java那種方式,先編譯成位元組碼,然後在運行時再編譯成機器碼再執行

那既然蘋果和谷歌都認為aot有好處,那這裡就有需求存在,所以安卓後來就製作出artandroid runtime,安卓運行時,就是app直接編譯成機器碼,就aot

隨後誕生flutter,也同時提供jitaot兩種編譯選項,允許用戶在測試時候,使jit編譯,編譯執行,並app發布的時候,使aot編譯,編譯成機器碼,以給終端用戶更好的使用體驗

java又提供graal等項目,實現aot,時至今日java也已經表態,要制project leyden,也就是正式aot功能

這一塊是將來大概十年左右時間的發展重點,java等語言能夠同時提jitaot兩種選擇,那相比之下c/c++aot,不jit,那自然受眾就要小一點了

其他還有一些功能性上的特性,比如值類型,可以連續內存,在軟體吃特別大內存時候,這些特性可以幫助節省內存,還有虛擬線程等等,不一一列舉

但是總得說來,這些年,程式語言發展方向是朝著開發越來越簡單,對用戶要求越來越低的方向上去在發展

過去,我們需要一個程式設計師懂指針,懂得回收內存垃圾,懂各種古里古怪的語法,還有各種知識

但是隨著科學技術的發展,我們越來越不需要一個程式設計師什麼都懂,你不懂也沒關係,不妨礙我們實現我們的目的就好了

隨著科學技術的發展和進步,編程手段會越來越豐富,越來越簡單,越來越規範

這或許能回答你的問題,為什麼不火了,因為現在你有更加簡單的手段去實現你的目的

文章來源: https://twgreatdaily.com/zh-hk/a842d2339be2e2ef753b1228f8a9b4f1.html