2021-12-26 21:41:52|已瀏覽:190次
如果想讓程序員之間吵起來,怎么辦呢?
很簡單,你只需要大喊一聲:”PHP是最好的語言!“
但是感覺網上那些語言爭論和鄙視鏈完全沒必要,做底層的看不起應用層的,做后臺的看不起前端,做算法的看不起純開發......
其實沒有一種編程語言能勝任所有領域,軟件開發也沒銀彈。
比如操作系統、數據庫、Web 服務器、驅動、高頻交易、游戲、搜索引擎等場景則是 C/C++ 更加適合。
而機器學習、數據分析、爬蟲等則 Python 更加適合。
后臺業務開發、大數據開發等則是 Java、Go 、PHP等語言的天下。
前端開發則是 JavaScript 。
從 TIOBE 編程語言榜單可以看到,C、Python、Java、C++ 基本上是穩居前四名,尤其是 C ,作為偏底層的語言還能常年穩居前三,可見其影響力:
我們可以對不同的編程語言進行不同維度的分類,比如通過執行方式來劃分:
我們可以分為:
匯編執行型
編譯匯編執行型
編譯解釋執行型
解釋執行型
編譯轉化-解釋執行型
1、匯編執行型
這種方式一般指匯編語言,匯編語言(assembly)的源文件由匯編器(assembler)轉換為 CPU 可直接執行的二進制程序文件,并且多個二進制文件通過鏈接器(linker),鏈接為一個二進制程序。
當然,現在大多數人可能都不會再學習匯編了,這玩意吃力不討好,但是我還是建議有時間的話可以學一下匯編。
倒不是說匯編多底層多多牛逼,主要是匯編其實是離計算機最近的一種語言,學匯編有助于讓我們理解計算機執行的方式,比如各種指令其實就是對應計算機在存儲、計算的特征。
另外就是,不管 C/C++ 還是 Java 等語言,出問題了可能都要單步調試,就算是 Java 這種虛擬機型的語言也有類似匯編的指令集,遇到程序崩潰的時候也許查看匯編代碼,一步步 debug 匯編是你唯一的選擇。
2、編譯匯編執行型
對于現在很多高級語言來說是這種方式,比如 C、C++、Go、Rust 等。
他們的源文件一般由編譯器(compiler)先編譯為匯編指令,再由匯編器生成 CPU 可直接執行的二進制程序文件。
當然我們有時候也將編譯、匯編整個過程合并說為:編譯。
但是一般這里的編譯又分為前端和后端,前端是指通過語法分析、語義分析生成中間代碼的過程。
語法分析就是解析 Token(符號)并且建立抽象語法樹(AST) 的過程,本質上編程語言執行過程,就是遍歷這顆語法樹的過程。
比如對于這段代碼:
var a = 42;
var b = 5;
function addA(d) {
return a + d;
}
var c = addA(2) + b;
生成的語法樹如下:
當然了,現在編譯器不特殊指定的情況下,一般不會把編譯出來的匯編指令輸出到文件,在內存中直接交給內置的匯編器進行處理,所以我們會看到這些編程語言的編譯器直接就輸出一個可執行的程序文件。
比如
gcc hello.c
就會直接輸出 a.out 可執行文件,但是如果你想看到編譯、匯編這個過程的話,可以這樣:
gcc -s hello.c -o hello.s
它會在當前目錄生成 hello.s 匯編文件,
匯編過程則將上一步的匯編代碼轉換成機器碼,這一步產生的文件叫做目標文件,是二進制格式。
編譯的命令為:
gcc -c hello.s -o hello.o
接下來我們還需要鏈接才能成為可執行文件,鏈接過程使用鏈接器將該目標文件與其他目標文件、庫文件、啟動文件等鏈接起來生成可執行文件。
附加的目標文件包括靜態連接庫和動態連接庫,包括我們常見的 stdlib、stdio 等庫。
鏈接過程的命令為:
gcc hello.o -o hello
基于 AST 我們甚至可以做到語言間轉化,也就是從一門編程語言轉化為另外一門語言。
3.編譯解釋執行型
這種對于 Java、Scala 等編譯型虛擬機語言比較常見,通常是由 Java 編譯器編譯為 class 文件(字節碼文件),我們可以把 class 文件和 C 語言編譯后的二進制格式文件類比,只不過各自語法不同罷了。
class 文件由 Java 虛擬機(Java virtual machine ,簡稱 JVM)解釋執行。
C#、VB 等語言則由其編譯器編譯為二進制的 exe 或 dll(動態鏈接庫) 文件,由 .net 運行時(runtime)程序解釋執行。
顯然這類語言沒有編譯匯編型高效,因為需要去解釋執行,這個過程是逐條翻譯、效率相對低下。
但是 JVM 為了解決這個問題引入了 JIT(Just In Time),簡單來說就是:
首先我們的 Java 代碼由 javac 等編譯器 編譯為JVM 可執行的字節碼(ByteCode),然后JVM 會判斷這段代碼是否為熱點代碼,如果是那么使用 JIT 技術,如果不是那么解釋執行,最后變成機器碼,由操作系統分配然后 CPU 具體執行:
4. 解釋執行型
解釋執行型語言通常又被稱為腳本(script)語言。
典型比如 shell、Powershell、JavaScript、Python、PHP、Ruby 等。
它們的源文件由相應的運行時程序直接讀取并解釋執行。
當然了,到底是編譯執行還是解釋執行其實不是編程語言本身的特點,比如你要是愿意也可以寫個解釋器去解釋執行 C 語言。
也可以寫個編譯器去編譯腳本語言,比如谷歌的 V8 執行 JS 高效的一個重要原因就是會類似 JVM 一樣,對熱點代碼進行標記為HotSpot,然后將其編譯為更高效的機器碼,下次執行到的時候直接使用機器碼代替字節碼執行。
5、編譯轉換、解釋執行型語言
這種其實和上面幾種差別不大,就是多了一個編譯轉化的過程,比如 TypeScript、JSX、CoffeeScript 等語言通常是先由編譯轉換程序轉換為 JavaScript,再由 JavaScript 運行時解釋執行。
因為瀏覽器引擎、NodeJS 等環境只能執行 JavaScript,所以 TS、CS 等語言就只能先通過編譯器轉化為 JS。
現在有很多成熟的工具都能提供這樣的能力,可以去試下,比如將源語言先編譯為 AST,將語法樹輸出為 XML 格式,再轉化為 目標語言。
已經有可用的了,GCC-XML:
http://gccxml.github.io/HTML/Running.html
6、執行效率
很顯然,編譯得越徹底的語言執行起來越高效,比如 C、C++ 這類都是直接編譯為了二進制,是 CPU 可以直接識別、執行的指令。
而 Java 則是編譯為 class 格式文件,由虛擬機在運行時將其轉化為不同平臺上的 CPU 指令執行,不需要再對源代碼進行語法分析、詞法分析等過程,會比解釋執行型的腳本效率要高很多。
但是編譯、解釋執行型語言在執行時又比匯編 / 編譯執行型語言多一個將虛擬機指令轉換為 CPU 指令的過程,所以它們運行效率通常又比匯編 / 編譯執行型語言的低。
因此,在對執行效率要求高的場景(例如高頻交易、數據庫、搜索引擎),通常不采用解釋執行型語言,而是采用編譯執行型語言來開發。
尤其是高頻交易,它們為了提升一點點延時,做了極致的優化,甚至會盡可能的利用編譯器完成計算(C++模板元編程):
盡量避免系統調用(例如做內核旁);
2)盡量避免運行時動態內存分配;
3)會自己做超低延時的通訊協議;
4)會做大量的 benchmark以及特定場景的優化;
5)會盡量在編譯期解決問題(模板元編程),少用多態;
7、系統級編程語言
我個人對系統編程比較感興趣,而以前系統編程基本上就是 C/C++ 編程,所有的系統級軟件幾乎毫無例外都是 C/C++ 編寫。
因為編譯解釋型語言或者腳本語言的運行效率不如編譯執行型語言,而且需要虛擬機或者解釋器才能運行,因此在操作系統或者驅動程序的編程中通常使用的是編譯執行型的語言。
前兩天我推薦了一門系統語言:Rust。
因為 Rust 優點很多,比如 足夠底層、極高的內存利用率、高性能、可靠性,Rust 本身設計機制和所有權模型就能保證內存安全和線程安全,盡可能把錯誤在編譯期暴露出來了。
總的來說,Rust 是一門可靠的系統編程語言,擁有 C++ 一樣的高性能、底層和抽象層次,但是又比 C++ 安全。
在系統編程之下就是更加底層的場景,比如和 CPU 架構密切相關的地方,例如操作系統的內存管理模塊的設置頁表地址的程序,或者需要使用 CPU 的 IO / 中斷等指令的時候,基本上只能使用匯編語言。
或者是 C 語言 + 內聯匯編等。
8、到底學什么語言呢?
說了這么多,那么到底學什么語言呢?
說實話當你入門之后,我覺得這個問題就不是問題了,因為你需要用到什么語言就去學什么,而且基本上都會很快學會。
但是入門的話, Python、C 都可以,如果是非科班的我覺得先學 Python 比較好,Python上手快、簡單一些,先用 Python 養成編程思維、喜歡上編程,再去學其它的。
當然科班的依然可以先學 Python,并且國外不少高校第一門語言現在比較喜歡教 Python、Schema 這類。
但是我個人更建議科班大一的同學可以先學 C,先把難啃的啃下來,之后學其它語言就很快了。
入門之后,我個人建議的配置是:
1-2 門編譯執行型 + 1-2 門解釋執行型 + 1 門函數式編程語言。
比如 C/C++ + Python + Haskell
或者 Java + Python、Shell + Haskell、Erlang 等
這樣可以讓我們學習掌握多種編程范式,尤其是函數式編程語言,和我們常規的編程思維截然不同。
好了,這期就到這里吧,下期我們再來從其它維度來看編程語言,以及各種編程語言的適合領域和就業前景~
本文由培訓無憂網北京達內教育課程顧問老師整理發布,更多C語言培訓課程信息可關注培訓無憂網C語言培訓頻道或添加老師微信:15033336050注:尊重原創文章,轉載請注明出處和鏈接 http://www.hebeijilong.cn/news-id-10120.html 違者必究!部分文章來源于網絡由培訓無憂網編輯部人員整理發布,內容真實性請自行核實或聯系我們,了解更多相關資訊請關注c語言頻道查看更多,了解相關專業課程信息您可在線咨詢也可免費申請試課。關注官方微信了解更多:150 3333 6050