1、什么是計算機語言
計算機就是一台用來計算機的機器,人讓計算機干什么計算機就干什么。我們需要通過計算機的語言來控制計算機,所謂計算機的語言就是編程語言。
計算機語言其實和人類的語言沒有本質的區別,不同點就是交流的主體不同。也就是說中文、英文是人和人之間的交流語言,而計算機語言(編程語言)是人和計算機交流的語言。
計算機語言發展經歷了三個階段:
(1)機器語言
- 最早的一種計算機語言。
- 機器語言通過二進制編碼來編寫程序,二進制編碼就是1和0,計算機也只認識1和0。
- 執行效率高,但編寫起來太麻煩。
(2)匯編語言
- 使用符號(如ABC和各種符號)來代替二進制編碼。
編寫程序時,不需要使用二進制,而是直接編寫符號。
編寫完成后,需要將符號轉換為機器碼,然后再由計算機執行。 - 符號轉換為機器碼的過程稱為匯編。
- 將機器碼轉換為符號的過程,稱為反匯編 。
- 匯編語言一般只適用於某些硬件,和硬件的關系太緊密,兼容性比較差 。
就好比不同硬件廠商識別符號的標准是不一樣的。 - 現在的一些硬件驅動還是會用到匯編語言進行編寫。
(3)高級語言
- 高級語言的語法基本和現在英語語法類似,並且和硬件的關系沒有那么緊密了。
也就是說通過高級語言開發程序可以在不同的硬件系統中運行。 - 高級語言都會有自己的編譯器,所編寫的代碼都會運行在自己的編譯器上。
不同系統上安裝想對應的編譯器,實現一份源碼一次編譯,到處運行。 - 高級語言學習起來也更加的容易,現在我們知道的語言基本都是高級語言。如
C
、C++
、C#
、Java
、Golang
、Python
等等。
2、高級語言中的編譯型語言和解釋型語言
計算機是不能理解高級語言的,更不能直接執行高級語言,它只能直接理解機器語言(二進制編碼)。所以使用任何高級語言編寫的程序,若想被計算機運行,都必須將其轉換成計算機語言,也就是機器碼,這個過程就叫編譯。比如,一行Python的命令print('hello')
,必需要轉換為類似1010101
這樣的機器碼 ,計算機才能夠識別你的命令。
根據從源碼轉換二進制編碼的時機不同,語言分成了兩大類:編譯型語言和解釋型語言。
(1)編譯型語言
對於編譯型語言,開發完成以后需要將所有的源代碼都轉換成可執行程序,比如 Windows 下的.exe
文件,可執行程序里面包含的就是機器碼。只要我們擁有可執行程序,就可以隨時運行,不用再重新編譯了,也就是“一次編譯,無限次運行”。
在運行的時候,我們只需要運行編譯生成的可執行程序,不再需要源代碼和編譯器了,所以說編譯型語言可以脫離開發環境運行。
編譯型語言一般是不能跨平台的,也就是不能在不同的操作系統之間隨意切換。
編譯型語言使用的轉換工具稱為編譯器。常見的編譯型語言有C
、C++
、Golang
等。
總結:
- 編譯一次后,脫離了編譯器也可以運行,並且運行效率高。
- 可移植性差,跨平台性比較差。
(2)解釋型語言
對於解釋型語言,每次執行程序都需要一邊轉換一邊執行,用到哪些源代碼就將哪些源代碼轉換成機器碼,用不到的不進行任何處理。每次執行程序時可能使用的功能不同,這個時候需要轉換的源代碼也不一樣。
因為每次執行程序都需要重新轉換源代碼,所以解釋型語言的執行效率天生就低於編譯型語言,甚至存在數量級的差距。計算機的一些底層功能,或者關鍵算法,一般都使用 C/C++
實現,只有在應用層面(比如網站開發、批處理、小工具等)才會使用解釋型語言。
在運行解釋型語言的時候,我們始終都需要源代碼和解釋器,所以說它無法脫離開發環境或者運行環境 。
解釋型語言使用的轉換工具稱為解釋器。常見的解釋型語言有Python
、JavaScript
、PHP
、Shell
等。
總結:
- 每次執行代碼都需要解釋一次,執行速度比較慢。
- 不能脫離解釋器獨立運行。
- 跨平台性比較好。
(3)編譯型語言和解釋型語言執行流程
如下圖所示:
3、知識擴展:
(1)擴展1
當我們說“下載一個程序(軟件)”時,不同類型的語言有不同的含義:
- 對於編譯型語言,我們下載到的是可執行文件,源代碼被作者保留,所以編譯型語言的程序一般是閉源的。
- 對於解釋型語言,我們下載到的是所有的源代碼,因為作者不給源代碼就沒法運行,所以解釋型語言的程序一般是開源的。
(2)擴展2
編譯器就是一個“翻譯工具”,類似於將中文翻譯成英文、將英文翻譯成俄文。但是,翻譯源代碼是一個復雜的過程,大致包括詞法分析、語法分析、語義分析、性能優化、生成可執行文件等五個步驟,期間涉及到復雜的算法和硬件架構。解釋器與此類似,有興趣的讀者請參考《編譯原理》一書,本文不再贅述。
(3)擴展3
Java
和 C#
是一種比較奇葩的存在,它們是半編譯半解釋型的語言,源代碼需要先轉換成一種中間形式的文件(字節碼文件),然后再將中間文件拿到虛擬機(JVM)中執行。Java
和C#
引領了這種風潮,它的初衷是在跨平台的同時兼顧執行效率。
4、關於 Python
Python 屬於典型的解釋型語言,所以運行 Python 程序只需要解釋器的支持,只要你在不同的平台安裝了不同的解釋器,你的代碼就可以隨處運行,不用擔心任何兼容性問題,真正的“一次編寫,到處運行”。
Python 幾乎支持所有常見的平台,比如 Linux、Windows、Mac OS 等,你所寫的 Python代碼無需修改,就能在這些平台上正確運行,Python 的可移植性是很強的。
最后,一句話介紹Python:Python是解釋型語言,是一個強類型的動態腳本語言。
- 強類型:不允許不同類型相加。例如:整形+字符串會報類型錯誤。
- 動態:不用對變量的數據類型進行聲明,且確定一個變量的類型是在第一次給它賦值的時候。
- 腳本語言:一般是解釋性語言,運行代碼只需要一個解釋器,不需要編譯。
Tips1
動態類型語言和靜態類型語言:
(1)什么是動態類型語言和靜態類型語言
動態類型語言:
動態類型語言是在程序運行時確定數據類型的語言。變量使用之前不需要進行類型聲明,會在你第一次賦值給變量時,在內部記錄數據類型,如Python。靜態類型語言:
靜態類型語言是在編譯時變量的數據類型即可確定的語言,多數靜態類型語言要求在使用變量之前必須聲明數據類型,如Java。(2)兩者優缺點
動態類型語言優缺點:
- 優點:代碼相對比較簡潔,無需編寫各種類型代碼,方便用戶閱讀;
- 缺點:調試不方便,代碼命名容易混;
靜態類型語言優缺點:
- 優點:在調試時比較方便,代碼規范。
- 缺點:代碼相對繁瑣,需要在定義變量的時候就判斷變量的類型。
Tips2
強類型定義語言和弱類型定義語言:
(1)什么是強類型語言和弱類型語言
強類型定義語言:
強制數據類型定義的語言。也就是說,一旦一個變量被指定了某個數據類型,如果不經過強制轉換,那么它就永遠是這個數據類型了。舉個例子:如果你定義了一個整型變量a,那么程序根本不可能將a當作字符串類型處理。強類型定義語言是類型安全的語言。弱類型定義語言:
數據類型可以被忽略的語言。它與強類型定義語言相反, 一個變量可以賦不同數據類型的值。強類型定義語言在速度上可能略遜色於弱類型定義語言,但是強類型定義語言帶來的嚴謹性能夠有效的避免許多錯誤。(2)兩者區別
- 強類型語言是一旦變量的類型被確定,就不能轉化的語言。
- 弱類型語言則反之,一個變量的類型是由其應用上下文確定的。
(3)優缺點
靜態語言的優勢:
- 由於類型的強制聲明,使得IDE有很強的代碼感知能力,故在實現復雜的業務邏輯、開發大型商業系統、以及那些生命周期很長的應用中,依托IDE對系統的開發很有保障;
- 由於靜態語言相對比較封閉,使得第三方開發包對代碼的侵害性可以降到最低;
動態語言的優勢:
- 思維不受束縛,可以任意發揮,把更多的精力放在產品本身上。
- 集中思考業務邏輯實現,思考過程即實現過程。