在計算機角度,每一種cpu型別都有自己可以識別的一套指令集,計算機不管你這個程式是用什麼語言來編寫的,其最終只認其cpu能夠識別的二進位制指令集。
在早期計算機剛發展的時代,人們都是直接輸入01010101這樣的沒有語義的二進位制指令來讓計算機工作的,可讀性幾乎沒有,沒人願意直接編寫那些沒有可讀性、繁瑣、費時,易出差錯的二進位制01**,所以後來才出現了程式語言。
程式語言的誕生,使得人們編寫的**有了可讀性,有了語義,與直接用01相比,更有利於記憶。
而前面說了,計算機最終只識別二進位制的指令,那麼,我們用程式語言編寫出來的**就必須要轉換成供機器識別的指令。
就像這樣:
code: 1+2 function 翻譯方法(引數:code)
"1"=>"001";
"2"=>"002"; "+"=>"000";
return 能讓機器識別的二進位制**;
call 翻譯方法("1+2") => "001 000 002"
所以從一門程式語言所編寫的**檔案轉換成能讓本機識別的指令,這中間是需要乙個翻譯的過程。
而我們現在計算機上是運載著作業系統的,光翻譯成機器指令也不行,還得讓**檔案轉化成可供作業系統執行的程式才行。
那麼這些步驟,就是程式語言所對應的編譯環節的工程了。這個翻譯過程是需要工具來完成,我們把它叫做編譯器。
不同廠商的cpu有著不同的指令集,為了克服面向cpu的指令集的難讀、難編、難記和易出錯的缺點,後來就出現了面向特定cpu的特定組合語言, 比如我打上這樣的x86彙編指令 mov ax,bx ,然後用上用機器碼做的彙編器,它將會被翻譯成 1000100111011000 這樣的二進位制01格式的機器指令.
不同cpu架構上的組合語言指令不同,而為了統一一套寫法,同時又不失彙編的表達能力,c語言就誕生了。
用c語言寫的**檔案,會被c編譯器先轉換成對應平台的彙編指令,再轉成機器碼,最後將這些過程中產生的中間模組鏈結成乙個可以被作業系統執行的程式。
那麼組合語言和c語言比較,我們就不需要去閱讀特定cpu的彙編碼,我只需要寫通用的c原始碼就可以實現程式的編寫,我們用將更偏機器實現的組合語言稱為低階語言,與彙編相比,c語言就稱之為高階語言。
在看看我們c#,我們在編碼的時候都不需要過於偏向特定平台的實現,翻譯過程也基本遵循這個過程。它的編譯模型和c語言類似,都是屬於這種間接轉換的中間步驟,故而能夠跨平台。
所以就類似於c/c#等這樣的高階語言來說是不區分平台的,而在於其背後支援的這個 翻譯原理 是否能支援其它平台。
什麼是HOC 高階程式設計
hoc 很多人看到高階元件 hoc 這個概念就被嚇到了,認為這東西很難,其實這東西概念真的很簡單,我們先來看乙個例子。function add a,b 現在如果我想給這個 add 函式新增乙個輸出結果的功能,那麼你可能會考慮我直接使用 console.log 不就實現了麼。說的沒錯,但是如果我們想做...
什麼是程式語言
什麼是程式語言?學習程式語言之前,首先要搞清楚 程式語言 這個概念。很小的時候,父母就教我們開口說話,也教我們如何理解別人講話的意思。經過長時間的薰陶和自我學習,我們竟然在不知不覺中學會了說話,同時也能聽懂其他小朋友說話的意思了,我們開始向父母要零花錢買零食和玩具 被欺負了向父母傾訴 我們說的是漢語...
C語言高階,什麼是指標?
簡單的來說,指標就是記憶體單元的位址。它可能是變數的位址也可能是陣列的位址,亦或者是函式的入口位址。而儲存位址的變數就是指標變數,通常稱為指標。再簡單的來說也比較迷吧,舉個例子,去酒店住房間,酒店裡的每個房間會有乙個房間編號是不是,每個房間又有乙個房間名 在這裡插入描述 而你去住酒店的時候,前台會給...