溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

說說程序員、編譯器、CPU之間的三角戀

發(fā)布時間:2020-07-06 12:13:47 來源:網(wǎng)絡(luò) 閱讀:3352 作者:毛散人 欄目:開發(fā)技術(shù)


編程工作的演進(jìn)史

1、CPU需要的只是1和0組成的二進(jìn)制數(shù)據(jù)

(1)不管編程怎么變,最終編程得到的可執(zhí)行二進(jìn)制程序都是給CPU運(yùn)行的。CPU需要的只是按照CPU設(shè)計(jì)時的規(guī)律(機(jī)器指令)排布的一串二進(jìn)制1和0組成的數(shù)字(機(jī)器碼),CPU根本不關(guān)心這些二進(jìn)制是怎么來的。

(2)這些二進(jìn)制可能是一個很厲害的程序員直接用1和0拼出來的;也可以是用匯編語言編寫最終編譯得到的;也可以是用C語言編寫最終編譯得到的;也可以是用java C# php bash等語言編寫然后解釋得到的;

(3)編程工作的演進(jìn)其實(shí)一直是在處理上一個層次段落:就是使用何種語言編寫程序(用某種語言進(jìn)行編程),然后如何把這種程序源代碼轉(zhuǎn)成二進(jìn)制(編譯器的發(fā)明)。

(4)CPU接收到一串1010序列后如何工作達(dá)到目的,這就是設(shè)計(jì)制造CPU的公司要考慮的事情了,與軟件工程師完全無關(guān)。


2、早期的紙卡打孔編程者

(1)最早期的時候,CPU也很簡單,指令集很少,二進(jìn)制位數(shù)也不多。那時候編譯器也沒被發(fā)明,編程語言也沒被發(fā)明,那時候就是用二進(jìn)制直接編程的。

(2)總結(jié):最早的編程沒有語言也沒有編譯器,程序員直接使用二進(jìn)制和機(jī)器(CPU)對話。

(3)這種方式的壞處就是不容易擴(kuò)展,隨著CPU的進(jìn)一步復(fù)雜化,指令的變多,指令位數(shù)的變多,編程難度呈幾何倍數(shù)增長。人的大腦慢慢就跟不上這個節(jié)奏。


3、編程工作的第一次革命:由二進(jìn)制機(jī)器碼到匯編語言

(1)第一次革命就是:發(fā)明了匯編語言。匯編語言的本質(zhì)就是用一個符號來代替一串二進(jìn)制。

MOV 10101010101010

SUB 01010101010101

(2)有了匯編語言之后,程序員就不用再去記憶二進(jìn)制序列了。編程時只需要用匯編指令來編程即可,匯編指令就是一個符號(符號就是由文字構(gòu)成的,如MOV)。因?yàn)槿祟惔竽X天生對文字符號更加友好,因此用符號編程更簡單。

(3)用匯編語言編寫的源程序不能直接給CPU運(yùn)行,必須通過一個翻譯過程,把源代碼翻譯成二進(jìn)制序列才能給CPU。這個翻譯的過程就叫匯編,執(zhí)行翻譯動作的就是匯編器。


4、編程工作的第二次革命:由匯編語言到C語言

(1)匯編語言也有一些不盡如人意的地方,譬如:沒有可移植性。在這個CPU上寫的匯編程序無法直接在另一個CPU上運(yùn)行。因此匯編語言是和CPU一一對應(yīng)的。

(2)為了可移植性于是乎發(fā)明了高級語言。第一個高級語言就是C語言。C語言進(jìn)一步靠近人的思維,為人的思維發(fā)明了很多CPU沒有的東西,譬如數(shù)組。最終的目的就是降低編程難度,讓高級語言更接近人的思維,然后通過編譯器、匯編器等的翻譯將這些源代碼變成二進(jìn)制然后給CPU運(yùn)行。


5、革命無窮盡、層次變更多

(1)在C語言之上還有更高級語言,譬如:C++、Java、C#、bash等。越往上越靠近人的思維,越往上語言本身提供的封裝越多,越往上編程難度越低、語言的掌握越容易。


1、CPU只認(rèn)識二進(jìn)制機(jī)器指令

(1)CPU是最終干活的,而CPU只認(rèn)識只接受二進(jìn)制。

2、人類喜歡符號而不是二進(jìn)制

(1)人類的大腦本身不喜歡二進(jìn)制而喜歡符號、文字。

(2)人類和機(jī)器之間天生有代溝,于是乎編程不容易。


3、連接人(程序員)與機(jī)器(CPU)的橋梁:編譯器

(1)編譯器降低了編程難度。編譯器的代表就是編程語言,每一種編程語言都有對應(yīng)的編譯器,這個編譯器的作用就是把這種語言的源文件編譯成可執(zhí)行程序。

(2)關(guān)鍵是:有了編譯器(高級語言)之后,我們程序員就不再盯著CPU(二進(jìn)制),而是改為盯著編譯器(編程語言、編程語言的語法),所以我們學(xué)習(xí)編程的關(guān)鍵變成了學(xué)習(xí)編譯器的習(xí)性,也就是編程語言的語法。


4、發(fā)明一門語言關(guān)鍵就在于發(fā)明它的編譯器

(1)編譯語言的關(guān)鍵就是編譯器。yacc和lex工具就是用來發(fā)明編程語言的。


5、高級語言與低級語言的差別

(1)越高級的語言越靠近人類思維;越低級的語言越靠近機(jī)器的需要。

(2)人與機(jī)器總勞動量(總復(fù)雜度)守恒。人要是復(fù)雜一點(diǎn)機(jī)器就可以簡單一點(diǎn);人簡單一點(diǎn)機(jī)器就需要復(fù)雜一點(diǎn)。這個規(guī)律描述的就是:編程語言越簡單,人使用起來越簡單,編譯器設(shè)計(jì)起來就更復(fù)雜;編程語言越復(fù)雜、程序員使用起來越麻煩,則編譯器設(shè)計(jì)越簡單,CPU執(zhí)行效率越高。



像編譯器一樣思考吧

語法是什么?語法就是編譯器的習(xí)性

(1)編譯器反應(yīng)在編程中就是語法。

譬如1:

for (i=0; i<10; i++);

{

xxx;

}


譬如2:

int i; !!i;

解析:!在C語言中是邏輯取反的意思,邏輯取反意思就是0取反就是1,不是0的數(shù)取反就是0

問題:讓你用C語言編程實(shí)現(xiàn):如果一個數(shù)i是0則返回0,如果不是0則返回1

一般實(shí)現(xiàn): if (i == 0){return 0;} else{return 1;}

或者可以用三母運(yùn)算符: (i==0)?(0):(1);

極客式寫法: !!i;


習(xí)得一門語言就像認(rèn)識一個朋友

(1)從新開始認(rèn)識一個人到成為好朋友,這里面要經(jīng)歷:時間、共事。

(2)學(xué)習(xí)一門編程語言也需要:時間、實(shí)踐(共事)

學(xué)習(xí)編程語言要懂得換位思考

(1)預(yù)處理中處理程序注釋、空行。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI