1. 日常生活中使用自然語(yǔ)言
顧名思義,計(jì)算機(jī)語(yǔ)言類(lèi)似于漢語(yǔ)、英語(yǔ),是一種用來(lái)傳遞信息的工具。
例如日常生活中,使用漢語(yǔ)將自己想表達(dá)的思想傳遞給他人。
來(lái)百度APP暢享高清圖片
2. 能否用自然語(yǔ)言和計(jì)算機(jī)“說(shuō)話”?
我們知道計(jì)算機(jī)最初的用途就是用于計(jì)算數(shù)據(jù),我們以一個(gè)最簡(jiǎn)單的例子來(lái)看。
例如我想知道123+456等于多少?
我可以用漢語(yǔ)對(duì)計(jì)算機(jī)進(jìn)行提問(wèn)嗎?
你肯定會(huì)回答說(shuō),可以啊,現(xiàn)在的語(yǔ)音助手完全可以實(shí)現(xiàn)這種功能。例如,apple的siri,小米的小愛(ài)同學(xué),百度的小度,淘寶的天貓精靈。
看似簡(jiǎn)單的一問(wèn)一答,事實(shí)上,卻在計(jì)算機(jī)內(nèi)部,卻經(jīng)歷了一個(gè)非常復(fù)雜的步驟。下面是一個(gè)非常概括的流程圖,大概說(shuō)明這里面經(jīng)歷了哪些步驟。
這其中的一個(gè)非常重要的環(huán)節(jié)是:通過(guò)自然語(yǔ)言識(shí)別和理解算法,讓計(jì)算機(jī)知道了我們需要運(yùn)行加法程序。接著把123和456放到計(jì)算程序里面,讓它們相加。
得益于現(xiàn)代的人工智能學(xué)科的發(fā)展,讓計(jì)算機(jī)看起來(lái)似乎可以理解我們?nèi)粘I钪惺褂玫淖匀徽Z(yǔ)言了。然而實(shí)際上,計(jì)算機(jī)卻只是忠實(shí)地執(zhí)行了固定的程序。
3. 怎樣直接和計(jì)算機(jī)“說(shuō)話”?
我們暫時(shí)不探討怎樣讓計(jì)算機(jī)理解自然語(yǔ)言,我們把中間的步驟去掉,怎樣讓計(jì)算機(jī)能夠直接理解我們想表達(dá)的內(nèi)容呢?
很簡(jiǎn)單,答案就是:通過(guò)編程語(yǔ)言。
通過(guò)編程語(yǔ)言,我們可以鍵入對(duì)應(yīng)語(yǔ)法,讓機(jī)器通過(guò)代碼來(lái)理解我們的意圖。
4. 探究CPU內(nèi)部工作原理
要和計(jì)算機(jī)直接溝通,那么我們就必須知道計(jì)算機(jī)是如何思考的。讓我們進(jìn)入計(jì)算機(jī)的內(nèi)部,看一看被稱(chēng)為計(jì)算機(jī)的核心CPU(中央處理器,central processing unit),是如何工作的。
CPU由三部分構(gòu)成:
- 算術(shù)、邏輯單元:對(duì)數(shù)據(jù)執(zhí)行運(yùn)算(例如加法、減法)的電路。
- 控制單元:協(xié)調(diào)機(jī)器活動(dòng)的電路。
- 寄存器組 :數(shù)據(jù)臨時(shí)存儲(chǔ)。
然而,寄存器能夠存儲(chǔ)的信息量很少,僅僅是當(dāng)前工作所必要的。話說(shuō)魚(yú)的記憶只有7秒,CPU的記憶恐怕是更短。總不能,CPU做一步操作,就把上一步操作的結(jié)果給忘了吧。
因此,我們需要內(nèi)存來(lái)配合CPU進(jìn)行數(shù)據(jù)操作。
數(shù)據(jù)大部分幾乎都存儲(chǔ)在內(nèi)存上,僅有當(dāng)前正在處理的數(shù)據(jù),才放到CPU的寄存器組上,數(shù)據(jù)通過(guò)數(shù)據(jù)總線,在CPU和內(nèi)存上進(jìn)行傳輸。
接下來(lái),我們來(lái)看看,將兩個(gè)數(shù)據(jù)相加會(huì)經(jīng)歷哪些步驟。
- 從內(nèi)存中取出一個(gè)加數(shù)放到一個(gè)寄存器中。
- 從內(nèi)存取出另一個(gè)加數(shù),放到另一個(gè)寄存器中。
- 激活算術(shù)、邏輯單元中的加法電路,以前面兩步的寄存器作為輸入,用另一個(gè)寄存器存放結(jié)果。
- 將結(jié)果存放到內(nèi)存中。
5. 最接近計(jì)算機(jī)運(yùn)行本質(zhì)的語(yǔ)言——機(jī)器語(yǔ)言
在上一節(jié)中,我們知道了讓計(jì)算機(jī)運(yùn)行兩個(gè)數(shù)的加法需要進(jìn)行4個(gè)步驟。那我們把這4個(gè)步驟告訴計(jì)算機(jī),就可以實(shí)現(xiàn)加法操作了。但是,計(jì)算機(jī)內(nèi)部就是一大堆晶體管,每個(gè)晶體管有開(kāi)和關(guān)兩個(gè)狀態(tài)。一般我們用1來(lái)表示開(kāi),用0來(lái)表示關(guān)。也就是說(shuō),計(jì)算機(jī)能存儲(chǔ)的是只兩種狀態(tài)的數(shù)據(jù),而十進(jìn)制擁有0到9十種狀態(tài)。很顯然,十進(jìn)制數(shù)據(jù)的狀態(tài)太多,沒(méi)法在計(jì)算機(jī)內(nèi)表示。所以,首先我們把123和456轉(zhuǎn)換為二進(jìn)制吧。
123的二進(jìn)制為1111011 456的二進(jìn)制為111001000
現(xiàn)在123和456被只有兩種狀態(tài)的二進(jìn)制所表示了,滿(mǎn)足計(jì)算機(jī)內(nèi)部也只有兩種狀態(tài)的情景了。簡(jiǎn)化得來(lái)說(shuō),123在計(jì)算機(jī)內(nèi)部,被存儲(chǔ)為晶體管狀態(tài)---開(kāi)開(kāi)開(kāi)開(kāi)關(guān)開(kāi)開(kāi)。456被存儲(chǔ)為晶體管狀態(tài)---開(kāi)開(kāi)開(kāi)關(guān)關(guān)開(kāi)關(guān)關(guān)關(guān)關(guān)。
歸根結(jié)底,計(jì)算機(jī)能存儲(chǔ)和操作的是晶體管的狀態(tài)組合,而這種狀態(tài)組合中,每一個(gè)晶體管只有兩種狀態(tài),與二進(jìn)制數(shù)據(jù)一一對(duì)應(yīng)。而二進(jìn)制又可以被轉(zhuǎn)換為十進(jìn)制。因此,計(jì)算機(jī)間接地計(jì)算了十進(jìn)制數(shù)據(jù)。
數(shù)據(jù)在計(jì)算機(jī)中被存儲(chǔ)為了晶體管狀態(tài),要完成運(yùn)算,必須對(duì)數(shù)據(jù)進(jìn)行操作。 在前面的步驟中,我們做了兩類(lèi)操作。
一類(lèi)操作是移動(dòng)數(shù)據(jù)。例如,將加數(shù)放入寄存器1。 另一類(lèi)是激活加法電路。例如,將寄存器1,寄存器2的數(shù)據(jù)相加,并放入寄存器3。
很顯然,要執(zhí)行什么操作也必須以晶體管的開(kāi)關(guān)狀態(tài)來(lái)表示。我們很自然地會(huì)把它們也寫(xiě)成二進(jìn)制形式,稱(chēng)之為操作碼。
而操作數(shù)指明操作的更詳細(xì)信息,例如,需要操作的數(shù)據(jù)本身,或者哪個(gè)寄存器包含需要操作的數(shù)據(jù),哪個(gè)存儲(chǔ)單元用于接收該數(shù)據(jù)。
操作碼+操作數(shù)為一條指令。
操作碼與操作數(shù)在數(shù)據(jù)上沒(méi)有本質(zhì)上的區(qū)別,它們都是二進(jìn)制的數(shù)據(jù)。例如:CPU每次讀取16位二進(jìn)制,將前3個(gè)二進(jìn)制,當(dāng)作操作碼。其后都作為操作數(shù)。
這種以二進(jìn)制表示對(duì)應(yīng)的晶體管狀態(tài)的方式,我們將其稱(chēng)之為機(jī)器語(yǔ)言。
當(dāng)然,在紙上寫(xiě)好二進(jìn)制之后,我們必須讓其轉(zhuǎn)化為晶體管狀態(tài)。這里就設(shè)計(jì)到輸入輸出設(shè)備了,在早期人們會(huì)在紙帶上打孔,用是否打孔來(lái)代表一個(gè)晶體管狀態(tài)。之后,將打好孔的紙帶放到機(jī)器中讀取,將其轉(zhuǎn)換為晶體管狀態(tài)。如今,我們直接使用鍵盤(pán)在屏幕上輸入即可。
6. 用助記詞來(lái)優(yōu)化機(jī)器語(yǔ)言——匯編語(yǔ)言
單純用0和1來(lái)寫(xiě)程序非常的困難。一是操作碼難于記憶,二是二進(jìn)制的數(shù)據(jù)十分冗長(zhǎng)。 于是,人們把操作碼用一系列的英文單詞來(lái)表示,將二進(jìn)制寫(xiě)成十六進(jìn)制。這就產(chǎn)生了匯編語(yǔ)言。
例如,把移動(dòng)操作碼,用單詞mov來(lái)替代。把激活加法電路,用單詞add來(lái)替代。
這樣程序更易于人們理解。
這樣也必然衍生出一個(gè)問(wèn)題,計(jì)算機(jī)無(wú)法直接處理英語(yǔ)和十進(jìn)制。因此,需要一個(gè)匯編器來(lái)作為“翻譯”,將匯編語(yǔ)言“翻譯”成由二進(jìn)制表示的晶體管狀態(tài)。
7. 低級(jí)語(yǔ)言依賴(lài)CPU的具體實(shí)現(xiàn)
在編寫(xiě)機(jī)器語(yǔ)言或匯編語(yǔ)言時(shí)必須要注意:不同類(lèi)型的CPU內(nèi)部工作細(xì)節(jié)不盡相同。個(gè)人電腦采用的是Intel、AMD出品CPU。而移動(dòng)設(shè)備常常采用ARM系列的CPU。
在寫(xiě)機(jī)器語(yǔ)言時(shí),會(huì)遇到很多差異性的問(wèn)題。例如,寄存器的數(shù)量、作用不同,操作碼的二進(jìn)制表示不一致?;蛘?,在一種CPU上有某種類(lèi)型的操作碼,但是在另一種CPU上卻沒(méi)有這種類(lèi)型的操作碼。而對(duì)應(yīng)效果的操作,在后者上是由其他幾種操作碼+操作數(shù)組成的指令,分幾步完成。
再看看匯編語(yǔ)言的情況呢? 匯編語(yǔ)言是通過(guò)注記詞來(lái)替代二進(jìn)制表示的,如果用面向不同類(lèi)型CPU的匯編器來(lái)“翻譯”,確實(shí)可以解決一部分的操作碼二進(jìn)制不一樣的差異。例如,兩類(lèi)CPU上均有mov操作,但是二進(jìn)制表示不同,一個(gè)是0010,一個(gè)是1001。那么使用對(duì)應(yīng)的匯編器來(lái)“翻譯”,可以解決這個(gè)問(wèn)題。但是,這僅僅是一小部分差異。因此,匯編語(yǔ)言也必須嚴(yán)格按照目標(biāo)CPU來(lái)差異化編寫(xiě)程序,并且用對(duì)應(yīng)的匯編器來(lái)“翻譯”。
不管是機(jī)器語(yǔ)言還是匯編,在寫(xiě)程序前必須關(guān)注CPU的內(nèi)部細(xì)節(jié)。運(yùn)行在一種類(lèi)型CPU上的代碼,不能直接在另一種類(lèi)型的CPU上直接運(yùn)行。需要將其根據(jù)另一類(lèi)CPU的工作細(xì)節(jié)進(jìn)行修改,才能正常運(yùn)行。
8. 不依賴(lài)具體指令集的語(yǔ)言——高級(jí)語(yǔ)言
現(xiàn)在你可以用機(jī)器語(yǔ)言或匯編語(yǔ)言寫(xiě)計(jì)算機(jī)程序了。 如果你覺(jué)得為什么計(jì)算機(jī)語(yǔ)言如此復(fù)雜,那就對(duì)了。機(jī)器語(yǔ)言或匯編語(yǔ)言忠實(shí)地描述了計(jì)算機(jī)的詳細(xì)工作狀態(tài)。 因此,用機(jī)器語(yǔ)言或匯編寫(xiě)出來(lái)的計(jì)算機(jī)代碼,詳細(xì)操作了太多的細(xì)節(jié)了。 對(duì)人來(lái)說(shuō)是十分不友好的,難以編寫(xiě),調(diào)試。并且,也難以在多種類(lèi)型的CPU上移植。
那怎么辦呢?能不能有一個(gè)更好的辦法,這時(shí)候高級(jí)語(yǔ)言運(yùn)應(yīng)而生。在機(jī)器上建立一個(gè)抽象層,通過(guò)抽象層表達(dá)意圖。而避免直接描述具體的CPU工作細(xì)節(jié)。
我們用C語(yǔ)言來(lái)示例寫(xiě)上面討論的加法問(wèn)題。代碼如下:
int a, b, c;a = 123;b = 456;c = a + b;printf("%d\n", c);
在C語(yǔ)言中,我們聲明了3個(gè)變量。將a賦值為123,b賦值為456。將a、b相加,加法的結(jié)果賦值給c。 可以看到,在C語(yǔ)言中,我們不關(guān)心a,b,c存在內(nèi)存上的哪個(gè)地方。也不用加法操作碼add那些的。反而,C語(yǔ)言的表述方法和人類(lèi)的認(rèn)知十分接近。
和匯編一樣,計(jì)算機(jī)也無(wú)法直接理解高級(jí)語(yǔ)言,并且C語(yǔ)言不描述CPU具體工作細(xì)節(jié),而是描述了一個(gè)抽象過(guò)程。沒(méi)法像匯編那樣簡(jiǎn)單的把英文根據(jù)目標(biāo)CPU替換成二進(jìn)制狀態(tài)了。而是通過(guò)兩個(gè)更為復(fù)雜的過(guò)程,將高級(jí)語(yǔ)言轉(zhuǎn)換為機(jī)器語(yǔ)言,這兩個(gè)步驟分別為“編譯”和“鏈接”。
這樣一來(lái),高級(jí)語(yǔ)言與計(jì)算機(jī)的硬件結(jié)構(gòu)及指令系統(tǒng)無(wú)關(guān)。在個(gè)人電腦上編寫(xiě)好的程序,也可以拿到移動(dòng)設(shè)備上來(lái)使用。并且,它有更強(qiáng)的表達(dá)能力,可方便地表示數(shù)據(jù)的運(yùn)算和程序的控制結(jié)構(gòu),能更好的描述各種算法,
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶(hù)上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.