當代電腦程式語言簡單梳理(附電腦硬體底層工作流程)
- 2020 年 10 月 15 日
- 筆記
(序言)
前兩年就在想叩開電腦編程世界的大門,但是因為語言選擇上的繁雜,最終停下了。去年看過一段時間的電腦程式運行原理和程式語言的原理,後來因為電腦語言的繁雜沒有繼續更深入的了解。當時只是把電腦語言做了分類,今天(2020.10.13)在安裝visual studio時候看到那麼些套件,又勾起了學習心。再次了解電腦語言,也算有所收穫,所以記錄下來,做個簡單的梳理。一開始並沒有準備寫硬體底層運行流程,但是寫到機器語言時候不得不提到控制硬體,提到控制硬體就又不得不提到硬體工作流程。後覺得這個應該單獨放在開頭,不想了解底層的可以直接跳過該篇幅。
題外話:編程的目的是讓編寫的程式順利執行以達到電腦替代人完成機械重複的計算,為人節省出時間以陪伴家人朋友愛人,感受生活的美好。如果為編程而佔用了和家人朋友愛人的生活時光,這樣就捨本逐末了。
(硬體底層)
介紹程式語言前,先跟隨部落客來了解一下電腦硬體底層的工作流程:
作業系統啟動時,北橋晶片將記憶體、顯示卡硬體參數傳遞給CPU,南橋晶片將其他硬體參數傳遞給北橋晶片再由北橋晶片傳遞給CPU。作業系統運行時,大家在操作電腦的每個動作(如點擊滑鼠、鍵盤等)都將以機器語言指令的形式經由南橋晶片傳遞給北橋晶片再由北橋晶片傳遞給CPU,CPU接收到該條機器語言指令後由內部的邏輯處理與暫存器指令集對照並按指令集處理該指令,而後由CPU內部的控制處理器將被處理後的機器語言指令傳遞給北橋晶片,再由北橋晶片傳遞給顯示卡晶片,顯示卡晶片控制顯示器顯示最終結果。
這裡部落客再簡單介紹一下CPU晶片的底層(即「半導體」):CPU晶片是矽片及矽片上刻蝕形成的眾多電晶體的合稱。電晶體就是半導體,半導體就等同於阻器+變壓器+開關,所以你看,晶片並不神秘,只是把數量眾多的電阻器、變壓器、開關放在了一個小板子(矽片)上。半導體是電子科技的基石,沒有半導體就沒有電子科技、電子設備,今年的華為晶片事件就是因為沒有掌握這種半導體製造技術(怎麼把那麼多電阻器、變壓器、開關放到那麼小的板子上)造成的。
(程式語言)
現在我們開始介紹程式語言,首先,要區分一點,程式的編程過程和程式的執行過程是兩個不同的概念!程式編程過程是在程式設計師電腦上,而程式執行過程是在程式使用者電腦上。這也是為什麼很多小白對介紹編程基礎的文章感到費解的地方。
電腦語言,按照可識別性分為三類:
機器語言(就是那種01011101010010…的超長表示方式)、彙編語言(那種sub ax,ax…的繁複的表示方式)、高級語言(那種printf (“123”)的簡短的表示方式)
隨電腦一同產生的就是機器語言(或者說是電路通斷訊號更貼切),但編程過程過於繁重,遂產生了彙編語言(以英文符號表示各種電路通斷集的語言),而隨著編寫程式越來越大,彙編語言還是顯得過於晦澀繁複,於是就產生了高級語言(以英文語句表示彙編指令的語言),這樣編程過程變得輕鬆容易多了。
早期高級語言中的三大主流語言(都是面向過程的):
C語言、Pascal語言、Basic語言
C語言做系統開發,Pascal做編程教學,Basic做應用開發
當代高級語言(都支援面向對象):
C++、Java、C#、VB.NET、Python、JavaScript、PHP….
早期電腦性能低下導致運行速度慢,因面向過程的方式執行起來效率高於面向對象的方式,所以早期的高級語言都是面向過程的,而當代電腦性能已經很好了,效率不高性能來補,面向對象的語言,程式碼修改起來方便、程式碼可復用率高的優點凸顯,因此就自然而然被主流高級語言所採用了。
當代電腦高級語言按照編程過程和程式執行過程可分為:
1.編譯型語言:在編程過程中,由第三方程式將高級語言程式碼轉換成當前系統可識別的彙編語言指令,再轉換成機器語言指令保存進文件;在程式執行的過程中,作業系統讀取該文件中的機器語言指令使相應的硬體動作。
2.解釋型語言:在編程過程中,將高級語言程式碼原樣保存進文件;在程式執行的過程中,由第三方程式讀取該文件中的高級語言程式碼並轉換成當前系統可識別的彙編語言指令,再轉換成機器語言指令,作業系統讀取該機器語言指令使相應的硬體動作。
3.解釋編譯型語言:在編程過程中,將高級語言程式碼轉換成第三方程式才能識別的類(似)機器語言指令並保存進文件;在程式執行過程中,由第三方程式讀取該文件中的類(似)機器語言指令,並轉換成機器語言指令,作業系統讀取該機器語言指令使相應的硬體動作。
很明顯,在編程過程中解釋型語言效率最高、解釋編譯型語言效率居中、編譯型語言效率最低;在程式執行過程中編譯型語言效率最高、解釋編譯型語言效率居中、解釋型語言效率最低。
終究編寫程式就是用來執行用的,所以大家更關注程式執行過程中的效率。毫無疑問編譯型語言效率最高,加上無需安裝第三方程式就能直接執行,使之成了高級程式語言的首選語言類型。但編譯型語言有一個缺點,那就是只能在支援該語言轉換的作業系統上運行,比如你在Windows系統上用C++語言編寫轉換得到的exe程式,在Mac系統上就無法執行,因為Windows系統可識別的彙編語言指令和Mac系統可識別的彙編語言指令不同,導致在Windows上轉換成的機器指令無法被Mac系統識別,也就無法使相應的硬體動作了。而解釋型語言和解釋編譯型語言卻可以在不同的作業系統中執行,原因就是需要在當前作業系統中安裝第三方程式後才可以執行它們,就是這個第三方程式在你編寫的程式執行過程中把程式碼直接轉換成當前系統可識別的機器語言指令了。解釋編譯型語言在程式執行過程中的效率又比解釋型語言高,所以如果需要一段程式碼在所有的作業系統上都能執行,解釋編譯型語言則是首選。而解釋型語言的最大優點就是編程過程中效率高,隨時修改隨時能執行。部落客本人喜歡的批處理就是解釋型語言,用於對文件文件夾的操作,隨時改動隨時用,省去了編譯的步驟,挺方便。
最後總結一下:編寫的程式只在一種作業系統中執行,首選編譯型語言;編寫的程式要在多種作業系統中執行,首選解釋編譯型語言;編寫的程式需要隨時修改隨時執行,首選解釋型語言。