歡迎來到培訓(xùn)無憂網(wǎng)!

全國切換

咨詢熱線 400-001-5729

位置:培訓(xùn)無憂網(wǎng) > 新聞資訊 > 電腦/IT > c語言 >  七月編程語言榜:C語言又登榜首!

七月編程語言榜:C語言又登榜首!

來源:培訓(xùn)無憂網(wǎng)——彭二胖 發(fā)布人:彭二胖

2021-12-26 21:41:52|已瀏覽:148次

如果想讓程序員之間吵起來,怎么辦呢?

很簡單,你只需要大喊一聲:PHP是最好的語言!“

但是感覺網(wǎng)上那些語言爭論和鄙視鏈完全沒必要,做底層的看不起應(yīng)用層的,做后臺的看不起前端,做算法的看不起純開發(fā)......

其實(shí)沒有一種編程語言能勝任所有領(lǐng)域,軟件開發(fā)也沒銀彈。

比如操作系統(tǒng)、數(shù)據(jù)庫、Web 服務(wù)器、驅(qū)動、高頻交易、游戲、搜索引擎等場景則是 C/C++ 更加適合。

而機(jī)器學(xué)習(xí)、數(shù)據(jù)分析、爬蟲等則 Python 更加適合。

后臺業(yè)務(wù)開發(fā)、大數(shù)據(jù)開發(fā)等則是 Java、Go PHP等語言的天下。

前端開發(fā)則是 JavaScript

TIOBE 編程語言榜單可以看到,C、Python、Java、C++ 基本上是穩(wěn)居前四名,尤其是 C ,作為偏底層的語言還能常年穩(wěn)居前三,可見其影響力:

我們可以對不同的編程語言進(jìn)行不同維度的分類,比如通過執(zhí)行方式來劃分:

我們可以分為:

匯編執(zhí)行型

編譯匯編執(zhí)行型

編譯解釋執(zhí)行型

解釋執(zhí)行型

編譯轉(zhuǎn)化-解釋執(zhí)行型

1、匯編執(zhí)行型

這種方式一般指匯編語言,匯編語言(assembly)的源文件由匯編器(assembler)轉(zhuǎn)換為 CPU 可直接執(zhí)行的二進(jìn)制程序文件,并且多個二進(jìn)制文件通過鏈接器(linker),鏈接為一個二進(jìn)制程序。

當(dāng)然,現(xiàn)在大多數(shù)人可能都不會再學(xué)習(xí)匯編了,這玩意吃力不討好,但是我還是建議有時間的話可以學(xué)一下匯編。

倒不是說匯編多底層多多牛逼,主要是匯編其實(shí)是離計(jì)算機(jī)最近的一種語言,學(xué)匯編有助于讓我們理解計(jì)算機(jī)執(zhí)行的方式,比如各種指令其實(shí)就是對應(yīng)計(jì)算機(jī)在存儲、計(jì)算的特征。

另外就是,不管 C/C++ 還是 Java 等語言,出問題了可能都要單步調(diào)試,就算是 Java 這種虛擬機(jī)型的語言也有類似匯編的指令集,遇到程序崩潰的時候也許查看匯編代碼,一步步 debug 匯編是你唯一的選擇。

2、編譯匯編執(zhí)行型

對于現(xiàn)在很多高級語言來說是這種方式,比如 C、C++、Go、Rust 等。

他們的源文件一般由編譯器(compiler)先編譯為匯編指令,再由匯編器生成 CPU 可直接執(zhí)行的二進(jìn)制程序文件。

當(dāng)然我們有時候也將編譯、匯編整個過程合并說為:編譯。

但是一般這里的編譯又分為前端和后端,前端是指通過語法分析、語義分析生成中間代碼的過程。

語法分析就是解析 Token(符號)并且建立抽象語法樹(AST) 的過程,本質(zhì)上編程語言執(zhí)行過程,就是遍歷這顆語法樹的過程。

比如對于這段代碼:

var a = 42;

var b = 5;

function addA(d) {

    return a + d;

}

var c = addA(2) + b;

生成的語法樹如下:

當(dāng)然了,現(xiàn)在編譯器不特殊指定的情況下,一般不會把編譯出來的匯編指令輸出到文件,在內(nèi)存中直接交給內(nèi)置的匯編器進(jìn)行處理,所以我們會看到這些編程語言的編譯器直接就輸出一個可執(zhí)行的程序文件。

比如

gcc hello.c

就會直接輸出 a.out 可執(zhí)行文件,但是如果你想看到編譯、匯編這個過程的話,可以這樣:

gcc -s hello.c -o hello.s

它會在當(dāng)前目錄生成 hello.s 匯編文件,

匯編過程則將上一步的匯編代碼轉(zhuǎn)換成機(jī)器碼,這一步產(chǎn)生的文件叫做目標(biāo)文件,是二進(jìn)制格式。

編譯的命令為:

gcc -c hello.s -o hello.o

接下來我們還需要鏈接才能成為可執(zhí)行文件,鏈接過程使用鏈接器將該目標(biāo)文件與其他目標(biāo)文件、庫文件、啟動文件等鏈接起來生成可執(zhí)行文件。

附加的目標(biāo)文件包括靜態(tài)連接庫和動態(tài)連接庫,包括我們常見的 stdlib、stdio 等庫。

鏈接過程的命令為:

gcc hello.o -o hello

基于 AST 我們甚至可以做到語言間轉(zhuǎn)化,也就是從一門編程語言轉(zhuǎn)化為另外一門語言。

3.編譯解釋執(zhí)行型

這種對于 JavaScala 等編譯型虛擬機(jī)語言比較常見,通常是由 Java 編譯器編譯為 class 文件(字節(jié)碼文件),我們可以把 class 文件和 C 語言編譯后的二進(jìn)制格式文件類比,只不過各自語法不同罷了。

class 文件由 Java 虛擬機(jī)(Java virtual machine ,簡稱 JVM)解釋執(zhí)行。

C#、VB 等語言則由其編譯器編譯為二進(jìn)制的 exe dll(動態(tài)鏈接庫) 文件,由 .net 運(yùn)行時(runtime)程序解釋執(zhí)行。

顯然這類語言沒有編譯匯編型高效,因?yàn)樾枰ソ忉寛?zhí)行,這個過程是逐條翻譯、效率相對低下。

但是 JVM 為了解決這個問題引入了 JITJust In Time),簡單來說就是:

首先我們的 Java 代碼由 javac 等編譯器 編譯為JVM 可執(zhí)行的字節(jié)碼(ByteCode),然后JVM 會判斷這段代碼是否為熱點(diǎn)代碼,如果是那么使用 JIT 技術(shù),如果不是那么解釋執(zhí)行,最后變成機(jī)器碼,由操作系統(tǒng)分配然后 CPU 具體執(zhí)行:

4. 解釋執(zhí)行型

解釋執(zhí)行型語言通常又被稱為腳本(script)語言。

典型比如 shellPowershell、JavaScript、Python、PHP、Ruby 等。

它們的源文件由相應(yīng)的運(yùn)行時程序直接讀取并解釋執(zhí)行。

當(dāng)然了,到底是編譯執(zhí)行還是解釋執(zhí)行其實(shí)不是編程語言本身的特點(diǎn),比如你要是愿意也可以寫個解釋器去解釋執(zhí)行 C  語言。

也可以寫個編譯器去編譯腳本語言,比如谷歌的 V8 執(zhí)行 JS 高效的一個重要原因就是會類似 JVM 一樣,對熱點(diǎn)代碼進(jìn)行標(biāo)記為HotSpot,然后將其編譯為更高效的機(jī)器碼,下次執(zhí)行到的時候直接使用機(jī)器碼代替字節(jié)碼執(zhí)行。

5、編譯轉(zhuǎn)換、解釋執(zhí)行型語言

這種其實(shí)和上面幾種差別不大,就是多了一個編譯轉(zhuǎn)化的過程,比如 TypeScript、JSXCoffeeScript 等語言通常是先由編譯轉(zhuǎn)換程序轉(zhuǎn)換為 JavaScript,再由 JavaScript 運(yùn)行時解釋執(zhí)行。

因?yàn)闉g覽器引擎、NodeJS 等環(huán)境只能執(zhí)行 JavaScript,所以 TS、CS 等語言就只能先通過編譯器轉(zhuǎn)化為 JS。

現(xiàn)在有很多成熟的工具都能提供這樣的能力,可以去試下,比如將源語言先編譯為 AST,將語法樹輸出為 XML 格式,再轉(zhuǎn)化為 目標(biāo)語言。

已經(jīng)有可用的了,GCC-XML

http://gccxml.github.io/HTML/Running.html

6、執(zhí)行效率

很顯然,編譯得越徹底的語言執(zhí)行起來越高效,比如 C、C++ 這類都是直接編譯為了二進(jìn)制,是 CPU 可以直接識別、執(zhí)行的指令。

Java 則是編譯為 class 格式文件,由虛擬機(jī)在運(yùn)行時將其轉(zhuǎn)化為不同平臺上的 CPU 指令執(zhí)行,不需要再對源代碼進(jìn)行語法分析、詞法分析等過程,會比解釋執(zhí)行型的腳本效率要高很多。

但是編譯、解釋執(zhí)行型語言在執(zhí)行時又比匯編 / 編譯執(zhí)行型語言多一個將虛擬機(jī)指令轉(zhuǎn)換為 CPU 指令的過程,所以它們運(yùn)行效率通常又比匯編 / 編譯執(zhí)行型語言的低。

因此,在對執(zhí)行效率要求高的場景(例如高頻交易、數(shù)據(jù)庫、搜索引擎),通常不采用解釋執(zhí)行型語言,而是采用編譯執(zhí)行型語言來開發(fā)。

尤其是高頻交易,它們?yōu)榱颂嵘稽c(diǎn)點(diǎn)延時,做了極致的優(yōu)化,甚至?xí)M可能的利用編譯器完成計(jì)算(C++模板元編程):

盡量避免系統(tǒng)調(diào)用(例如做內(nèi)核旁);

2)盡量避免運(yùn)行時動態(tài)內(nèi)存分配;

3)會自己做超低延時的通訊協(xié)議;

4)會做大量的 benchmark以及特定場景的優(yōu)化;

5)會盡量在編譯期解決問題(模板元編程),少用多態(tài);

7、系統(tǒng)級編程語言

我個人對系統(tǒng)編程比較感興趣,而以前系統(tǒng)編程基本上就是 C/C++ 編程,所有的系統(tǒng)級軟件幾乎毫無例外都是 C/C++ 編寫。

因?yàn)榫幾g解釋型語言或者腳本語言的運(yùn)行效率不如編譯執(zhí)行型語言,而且需要虛擬機(jī)或者解釋器才能運(yùn)行,因此在操作系統(tǒng)或者驅(qū)動程序的編程中通常使用的是編譯執(zhí)行型的語言。

前兩天我推薦了一門系統(tǒng)語言:Rust。

因?yàn)?/span> Rust 優(yōu)點(diǎn)很多,比如 足夠底層、極高的內(nèi)存利用率、高性能、可靠性,Rust 本身設(shè)計(jì)機(jī)制和所有權(quán)模型就能保證內(nèi)存安全和線程安全,盡可能把錯誤在編譯期暴露出來了。

總的來說,Rust 是一門可靠的系統(tǒng)編程語言,擁有 C++ 一樣的高性能、底層和抽象層次,但是又比 C++ 安全。

在系統(tǒng)編程之下就是更加底層的場景,比如和 CPU 架構(gòu)密切相關(guān)的地方,例如操作系統(tǒng)的內(nèi)存管理模塊的設(shè)置頁表地址的程序,或者需要使用 CPU IO / 中斷等指令的時候,基本上只能使用匯編語言。

或者是 C 語言 + 內(nèi)聯(lián)匯編等。

8、到底學(xué)什么語言呢?

說了這么多,那么到底學(xué)什么語言呢?

說實(shí)話當(dāng)你入門之后,我覺得這個問題就不是問題了,因?yàn)槟阈枰玫绞裁凑Z言就去學(xué)什么,而且基本上都會很快學(xué)會。

但是入門的話, Python、C 都可以,如果是非科班的我覺得先學(xué) Python 比較好,Python上手快、簡單一些,先用 Python 養(yǎng)成編程思維、喜歡上編程,再去學(xué)其它的。

當(dāng)然科班的依然可以先學(xué) Python,并且國外不少高校第一門語言現(xiàn)在比較喜歡教 PythonSchema 這類。

但是我個人更建議科班大一的同學(xué)可以先學(xué) C,先把難啃的啃下來,之后學(xué)其它語言就很快了。

入門之后,我個人建議的配置是:

1-2 門編譯執(zhí)行型 + 1-2 門解釋執(zhí)行型 + 1 門函數(shù)式編程語言。

比如 C/C++  +  Python + Haskell

或者 Java + Python、Shell + HaskellErlang

這樣可以讓我們學(xué)習(xí)掌握多種編程范式,尤其是函數(shù)式編程語言,和我們常規(guī)的編程思維截然不同。

好了,這期就到這里吧,下期我們再來從其它維度來看編程語言,以及各種編程語言的適合領(lǐng)域和就業(yè)前景~

       本文由培訓(xùn)無憂網(wǎng)北京達(dá)內(nèi)教育課程顧問老師整理發(fā)布,更多C語言培訓(xùn)課程信息可關(guān)注培訓(xùn)無憂網(wǎng)C語言培訓(xùn)頻道或添加老師微信:15033336050

      注:尊重原創(chuàng)文章,轉(zhuǎn)載請注明出處和鏈接 http://m.universityresearchassociates.com/news-id-10120.html 違者必究!部分文章來源于網(wǎng)絡(luò)由培訓(xùn)無憂網(wǎng)編輯部人員整理發(fā)布,內(nèi)容真實(shí)性請自行核實(shí)或聯(lián)系我們,了解更多相關(guān)資訊請關(guān)注c語言頻道查看更多,了解相關(guān)專業(yè)課程信息您可在線咨詢也可免費(fèi)申請?jiān)囌n。關(guān)注官方微信了解更多:150 3333 6050

留下你的信息,課程顧問老師會一對一幫助你規(guī)劃更適合你的專業(yè)課程!
  • 姓名:

  • 手機(jī):

  • 地區(qū):

  • 想學(xué)什么:

  • 培訓(xùn)無憂網(wǎng)
免 費(fèi) 申 請 試 聽
提交申請,《培訓(xùn)無憂網(wǎng)》課程顧問老師會一對一幫助你規(guī)劃更適合你的專業(yè)課程!