-
1 # 魔鐵的世界
-
2 # 愛思考的奧特曼
其實,CPU也不知道我們敲得程式碼是什麼意思。想要讓一段程式碼程式設計可執行的程式,需要進行一系列的操作。
關於CPU識別程式的問題,細講起來是比較麻煩的一件事情,我們來分步驟逐一解釋。
1.CPU的基本工作原理——數位電路在具體將這個問題之前,我們先來了解一下半導體的特性。
顧名思義,半導體就是一種介於導體和絕緣體中間的物質,它具有以下特性。
比如上圖,如果電流是從A端流向C端,則電路通暢;反過來的話就不行了。大家可以把它理解一種單方向控制電流的裝置。
電流只有兩種情況:開路和閉路,將開路規定為0,閉路規定為1,這也就是我們所熟知的二進位制。
根據這種特性,設計者們開發出了“與”,“或”,“非”,“異或”四種情況:
與門:只有同時具備條件A和條件B時,才能得出結果1,當其中任意一個條件為0時,結果為0。1+1=1; 1+0=0; 0+1=0; 0+0=0
或門:只有條件A或條件B都為0時,才能得出結果0;當其中任意條件為1時,結果為1;1+1=1; 1+0=1; 0+1=1; 0+0=0
非門:就是相反的意思,條件A的反為B,條件B的反為A;輸入x 輸出y
0 1
1 0
異或門:當兩個條件取值相異(0和1)時,結果為1;反之為01⊕1=0;
1⊕0=1;
0⊕0=0;
根據這幾種閘電路,還衍生出了一些電路,比如與非門,或非門等等。但基本的電路狀還是不會變的。這些閘電路構成了CPU的基本工作原理——數位電路。
無論是資料的計算,還是指令的排程,CPU都是要透過運算來實現的。閘電路的目的就是為了透過控制電流的狀態,來實現計算的原理。當然了CPU上的電路是非常複雜的,如何將由閘電路構造成的加法器,乘法器之類整合到一塊指甲蓋大小的電路板上絕非易事,這也是為什麼晶片技術被稱為最難突破的尖端技術的主要原因之一。
在簡單瞭解CPU的工作原理後,就是關於高階語言和機器語言的轉換問題了
機械語言和高階語言早期的計算機程式設計是一件非常痛苦的事情,只要涉及到需要位移量的運算時,例如乘法運算,就要做大量的插線工作。也許一個幾分鐘就能算完的程式,插拔線路就得花上半個小時,還不能插錯,否則就白忙活了。所以當時做這些工作的都是一些靚麗的摩登女郎,穿著漂亮的制服以緩解工作人員的壓力……
隨著計算量不斷地增大,這種插拔的方式已經滿足不了實際需求。,人們開始考慮:能不能設計一種語言來更高效的設計程式呢?由此,高階語言誕生了。
高階語言:一種接近於人類自然語言的表達方式,透過一些較為直觀的單詞,符號來表示低階語言。從而使程式設計變得明瞭易學,可讀性強。
同時,高階語言分為面向過程和麵向物件兩類。前者在同一個功能每實現一次,都得重新編寫一次程式碼,所以程式碼的重複利用率比較差;後者面向由於引入了類的概念,只要只要編寫一次程式碼,後面便可以透過呼叫類的方式多次使用,大大提升了效率。所以java能成為最受歡迎的程式語言不是沒有道理的。
機器語言:計算機最原始的語言,全部由0和1構成的數字串構成,也是cpu唯一可以識別的語言。
另外,還有一種組合語言,很多人存在一個誤區,覺得組合語言就是機器語言,其實不然,CPU還是不知道組合語言是個什麼東西。組合語言本質上還是一種計算機低階語言,透過組合語言我們可以瞭解CPU 到底幹了些什麼,以及程式碼的執行步驟。
如何將高階語言轉換成計算機可以識別的機器語言呢?這時候就需要編譯器的發揮作用了:
簡而言之,編譯器就像是一箇中轉平臺,就是將程式設計師使用的高階語言翻譯為計算機可以識別執行的機器語言。其主要工作流程可以具象為:原始碼 (source code) → 預處理器 (preprocessor) → 編譯器 (compiler) → 目的碼 (object code) → 連結器(Linker) → 可執行程式 (executables),也就是我們最終使用的字尾名為.exe這樣的程式。
最後說個題外話,編譯器對於程式的所起的影響可謂舉足輕重,甚至可能影響到CPU的執行效率。所以現在廠家除了絞盡腦汁的提升CPU效能外,也將目光投向了編譯器,編譯器極有可能在未來成為新的熱門導向。
-
3 # 匯聚魔杖
如果你是一個程式設計師,你寫過很多程式碼,那麼現在要你寫一段程式,計算50.00*0.1的值。
你也許會這樣寫:
程式碼你很快寫完了,如果沒有和其他人交流,可能只是你自己看了,而抱歉的是CPU也不認識你寫的是啥。
CPU並不認識你寫的程式CPU不知道也不管你是用什麼語言寫的程式碼,那是給人閱讀的,不是給CPU閱讀的,CPU只懂得編譯過的二進位制指令,也就是一大串的0和1,還必須按照商家設計好的指令體系編制的指令序列才行。至於你寫的那些牛B的程式碼,CPU並不買賬,它好不好用在於編譯器或直譯器把這些人類程式碼翻譯為機器碼有多高明。
那CPU是怎麼去執行我們的程式呢?這就是編譯器存在的原因了,編譯器將我們寫的程式編譯成可供CPU執行的二進位制程式碼,並且分配指令和記憶體的地址等這類複雜的工作。
程式大體的執行流程一個程式的執行流程總體上可以分為3個步驟:磁碟->RAM(記憶體)->CPU
即程式從磁碟複製到記憶體中,CPU從記憶體中取指令,然後解碼,之後執行,最後將執行結果寫回記憶體。
CPU又是如何執行指令的呢?硬體產商約定好了一套指令體系,不管什麼程式語言都透過某種方式把程式碼編譯為CPU能懂的二進位制指令指揮CPU工作。
比如:有一串指令過來了,如果是以1開頭,則表示做什麼,比如做加法,那麼後面接著會發過來兩個數,CPU做加法後把結果存入既定的暫存器,程式會有後續的指令去這個暫存器提取結果,放入指定的記憶體中。CPU就是按照這樣的約定解析傳入的一連串的二進位制資料,並一一的去執行。這就好比航海的船透過約定的燈語(燈的有規律亮、滅)來相互通訊的道理是一樣的。
總結所以說,CPU不是認識程式碼,而是記住程式碼,資料匯流排送過來一個指令,是什麼要如何去執行,已經固化在了CPU裡了。如何執行和固化?是透過複雜的組合,以門、非門、與非門這三種複雜的組合,實現了複雜的邏輯關係。
-
4 # 味冷
什麼是程式碼?代者,替換也。
假如你設計一個數字電路,包括一個加法器和一個乘法器。
你希望根據需要,有時對輸入資料做加法,有時對輸入做乘法,該怎樣做呢?
顯而易見的方法是手工控制加法器和乘法器的使能端,每次只讓一個電路工作。那麼當兩個使能端為01,就是加法器工作,是10,就是乘法器工作。
然後為了讓電路根據要求的順序做加法和乘法,你把一系列01、10儲存起來,當你要做加法,加法,乘法,加法時,儲存的就是01011001。你增加了一個時序電路,每次讀出兩個位,把高低電平加在兩個使能端上,替代你的手工接線。01和10這兩個數碼能控制電路的行為,起名叫機器碼。
然而這樣二進位制的東西並不好記憶。於是你給01起了個名字,叫add,10起名叫mul。你的這組運算就記為add,add,mul,add。
add,mul這種助記符,就叫程式碼,具體說是彙編程式碼;你會找一個悲催的助手,幫你把程式碼替換成01,10這種機械碼。
由程式碼翻譯成機器碼的過程,後來也由機器來做,這種機器(軟體)就叫編譯器。
因此所謂cpu認識程式碼,是一種擬人化的修辭,偏文藝了。cpu只是一種根據高低電平輸入,產生特定的高低電平輸出的機器。程式碼不過是助記符。
後來你覺得add,add,add,add,add這類寫法太煩,於是發明了五連加,7連乘之類的寫法——高階語言程式碼誕生了。
-
5 # alex136442470
Cpu說,我只會 洗衣服,做飯,掃地 三件事,你只要告訴我要做哪件事,別的我一個字都不聽。這三件事就是CPU的指令集。
所以,CPU根本不認識程式碼,只是程式碼按照CPU給定的指令集去呼叫而已
-
6 # 電子及工控技術
由於CPU是一個極為龐大的積體電路,為了說明問題我們用其中一個極為簡單的數字處理電路為例來說明CPU是如何“認識”我們人類編寫的程式碼的。我們知道CPU中包含著數量眾多的絕緣柵電晶體(MOSFET),在這些眾多的絕緣柵電晶體(MOSFET)中分為兩類,一類是P溝道的絕緣柵電晶體、另一類是N溝道的絕緣柵電晶體。
對於P溝道的絕緣柵電晶體來說,當給它的輸入端加一個“1”時(高電平)時該管子就會處於“關閉”狀態,當給它的輸入端加一個“0”時(低電平)時該管子就會處於“開啟”狀態。
對於N溝道的絕緣柵電晶體來說,當給它的輸入端加一個“0”時(低電平)時該管子就會處於“關閉”狀態,當給它的輸入端加一個“1”時(高電平)時該管子就會處於“開啟”狀態。因此根據這些MOS管的特點在任何一種輸入條件下PMOS和NMOS都不會處於開啟的狀態。因此在CPU中就有用這些MOS管組成的與非閘電路和或非閘電路。因此就可以執行邏輯運算,所以說邏輯運算也是CPU的功能之一。
那麼下一個問題是我們使用計算機語言編寫的程式,比如常用的C語言或者組合語言等等都有邏輯表示式或者邏輯指令,編寫好一個邏輯運算的程式後要透過剛才講的編譯器對源程式進行編譯生成CPU能夠識別的“語言”(二進位制程式碼)。又由於這個機器語言(二進位制程式碼)與我們編寫的邏輯運算程式是一一對應的,因此只要把這段程式碼“灌進”CPU的內部他就會按照我們人類的要求運作起來了,從而也就能夠“認識”我們人類所寫的程式碼了。
-
7 # Virfri
簡而言之,就是有個編譯器它知道目標cpu裡指令執行單元能夠去執行的各樣用途的指令,加減乘除餘比較移位…這些指令是一堆0110...,非人類,難搞!!!同時這個編譯器也懂得你當前程式碼的語言規則,於是在你編譯程式碼的時候幫你等價置換成了一堆那些難搞的二進位制程式碼!CPU執行這些二進位制程式碼的時候就相當於在復現你當時用程式語言表達的程式意圖。這就是:你的程式碼 <-> 編譯器 <-> cpu
-
8 # 大魚2020
所有的高階語言會被翻譯成二進位制程式碼,也叫機器碼,如果想了解請看處理器開發手冊,每一個程式碼都有特定的運算動作。
-
9 # 物理微電子前沿科普
我目前是微電子研究生在讀,偏工藝方向,個人瞭解的整個計算機的產業是:矽片--->元器件(MOSFET)--->設計的電路(陣列,陣列上每個點是元器件)--->整個硬體系統--->作業系統--->編譯器--->高階語言(C語言,python等)--->使用者。我們都知道程式碼是二進位制的,只能識別“0”和 “1”,這是由於最底層的元器件所決定的。所以關鍵是搞懂最底層的元器件是如何實現與二進位制”0“和”1“的相對應的。
晶片上的元器件(MOSFET)這個元器件是MOSFET,叫做金氧半導體場效應電晶體,MOSFET主要有source(S,源極),drain(D,漏極),gate(G,柵壓)組成,主要的工作原理是透過加柵壓電場來實現源極和漏極之間的導通,當源極和漏極導通的時候就對應於二進位制裡面的”1“,源極和漏極之間沒有導通的時候就對應於二進位制裡面的”0“,所以這個閾值(臨界)電壓很重要。達到閾值電壓就導通,達不到就是不導通。
電路設計上面只是討論了區別”1“和”0“,而能夠區別不同功能的,是在電路層面進行設計,這就要透過不同的邏輯”與“門,”或“門,”非“門來實現,是否對某一個器件進行通電流。通電就是對應於”1“,不通就是高阻態對應於”0“。
作業系統和編譯器層面作業系統和編譯器就是將高階語言轉換成一系列二進位制的數字,一串不同的二進位制數字,透過作業系統來控制硬體上的不同功能。
最後附上一張整個計算機體系的圖:
-
10 # 電子產品設計方案
CPU其實只認識“0”和“1”
我們經常會聽說到某某晶片由多少百億個電晶體組成這樣的科技新聞。沒錯,CPU就是超大規模的積體電路,由數量超級多的電晶體組成,而電晶體只有“開”和“關”兩種狀態,剛好可以用“0”和“1”來代表這兩種狀態,所以CPU是採用二進位制來進行運算的。
CPU是什麼?CPU是Central Processing Unit的縮寫,中文名全稱為中央處理器。CPU的組成包括了運算邏輯、暫存器和控制部件,它可以解釋指令和進行資料運算處理。因為CPU本身就是超大規模的數位電路,只認識“0”和“1”,所以所有的指令和資料都需要由“0”和“1”組成。
二進位制只有“0”和“1”怎麼運算?所有運算邏輯我們都可以理解為“與”,“或”,“非”,“異或”四種哦
與門:多個條件中,所有條件成立才算成立,
1 and 1 = 11 and 0 = 00 and 0 = 0或門:多個條件中,只要有一個條件成立,就算成立
1 or 0 =11 or 1 =10 or 0 =0非門:其實就是反相
not 1 =0not 0 =1異或門:可以理解為,兩個條件不一樣,才算成立
1 xor 1 =01 xor 0 =10 xor 0 =0當然還可以由這四種門延申出“與非門”,“或非門”,“與或非門”,“異或非門”等。
CPU為什麼可以執行我們的程式呢?上面說到CPU只認識“0”和“1”,那它為什麼可以執行我們的程式呢?CPU的確不可以直接執行我們編寫的程式。但如果直接只用“0”和“1”的組合來寫程式,那是相當的煩所,也難以找到錯誤,是非常不現實的。聰明的人類為了解決這個大麻煩,就發明了組合語言,用一些容易理解和記憶的字元來代替“0”和“1”組成的指令。
例如:
ADD:表示邏輯加減MOV:代表資料傳遞JMP:代表跳轉當然還是需要透過彙編器把這些用匯編語言編寫的程式翻譯為“0”和“1”組成的十六進位制機器碼。
隨著計算機技術的發展,寫的程式也越來越複雜了,發現用匯編語言編寫程式的效率也相當低,然後聰明的人類又發明了我們現在用的各種高階語言,比如C,C++,PHP,Python等等,當然這些由高階語言編寫的程式就需要透過編譯器"翻譯"為CPU能夠識別的十六進位制機器碼。
彙編器或者編譯器可以理解程式碼與CPU溝統的“橋樑”了,透過它進行“翻譯”,CPU就可以認識程式碼了。
-
11 # 每日精彩科技
首先,我覺得這是一個非常好的問題,也是很多小白使用者困惑之處,下面我將根據自己的經驗認真回答這個問題。
CPU的工作原理簡介:馮·諾依曼體系結構是現代計算機的基礎。
在該系統的結構中,程式和資料必須儲存在同一房間內,並且指令和資料必須透過與重複執行的匯流排相同的匯流排進行傳輸。根據馮·諾依曼(von Neumann)系統,CPU分為五個階段:選擇命令的階段,解碼指令的階段,指令的實施階段,訪問次數和結果記錄。
接收命令(IF,指令提取):
在解碼指令的階段(ID,指令解碼):
在提取指令之後,根據指令的格式,對未連線指令的分離和解釋,將識別區域劃分為不同類別的指令以及各種獲取運算元的方法,對指令進行解碼。
執行命令階段(EX,執行):
指定指令的功能。連線處理器的不同部分以執行必要的操作。
在訪問記憶體(MEM,記憶體)的時間段內,根據該時間段需要訪問主儲存器,讀取運算元,處理器接收主儲存器中操作的地址,並從主儲存器中讀取操作地址。該命令的一部分不需要訪問主儲存器,但是可以跳過該階段。
結果記錄在完成階段(WB,回寫):
結果記錄在最後階段,在該階段,有關命令執行階段工作結果的資料被“寫入”到某種形式的儲存中。通常將結果寫入處理器的內部暫存器,以便快速訪問後續指令;許多指令還更改程式狀態暫存器中標記的狀態,這些狀態指示不同的操作結果,並可用於影響程式動作。
執行命令後,在記錄有關結果的資料後,如果沒有意外事件發生(例如,結果溢位等),計算機將從程式計數器接收下一個命令地址,開始一個新的週期,在此週期中,將依次檢索下一個命令。
CPU是怎麼認識程式碼的?關鍵是要就訊號包達成一致。處理器僅在傳輸的二進位制程式碼上執行指令,並且商業企業已同意將編譯該指令系統,而不論其程式語言是什麼,以便處理器可以根據處理器理解的二進位制指令執行其功能。協議以及人與人之間都有自己的規則。例如,我們可以引用許多命令,如果它們以1開頭,則說明要執行的操作,例如,加,然後給出兩個數字,以便處理器將結果新增到特定的暫存器中,並且程式將具有順序指令以獲取結果在將要儲存在指定儲存器中的該暫存器上,處理器分析根據這種協議傳輸的許多二進位制資料,然後執行。處理器可以執行根據該指令系統無法直接完成的操作,程式設計師負責準備一個完整的解決方案,該解決方案將允許處理器執行此操作,這稱為程式設計,而整個命令序列稱為程式。下圖是CPU認識程式碼的邏輯圖:
處理器不知道您說哪種語言,該程式碼不是為計算機而是為編譯的二進位制命令而為,而是為執行根據公司開發的指令系統而開發的一系列指令而讀取的程式碼。程式語言沒有什麼高階的,它在編譯器或直譯器中可以很好地用於將這些人工程式碼轉換為機器程式碼,在這方面,保守法仍然起著多大的作用,您編寫的高階語言程式碼越少,可執行指令轉換成機器的越多。 C是您好世界的入門程式,不用考慮拼寫很短,也不是很成功,該程式使用5K編譯二進位制機器程式碼,併為原始碼提供printf0函式,您可以自行檢視,但實際上您不需要列印一行完整的printf0函式,實際上是效率低下的解釋程式。
-
12 # 明月照山崗
cpu不認識我們寫的程式碼,需要經過一個轉換。
cpu認識的程式碼是由0或1組成的,這叫機器語言;我們現在程式設計基本上用的都是高階語言。類似於只會日語的日本人和只會漢語的中國人是無法交流的,他們之間要交流,需要有一個第三方,也就是翻譯。同理CPU要認識程式碼也是一樣,也有一個翻譯,專業術語叫做編譯器,編譯器負責把高階語言翻譯成機器語言,也就是一大串的0、1。
那CPU是怎麼認識0和1的呢?CPU工作需要通電。衡量電有兩個參量:電壓和電流。基本採用電壓這個參量的變化來表示資料。比如說高電壓表示1,低電壓表示0,高低電壓是相對工作電壓來說的,假如說cpu工作電壓為5V,那麼高電壓表示接近5V的電壓,低電壓表示接近0V的電壓。
總之,cpu只認識機器語言,機器語言只有兩種狀態:1和0,對應到電裡面是高低電壓。
-
13 # 夭壽出來啦
看了很多回答,有些一開始就用閘電路,與或非,用0和1控制電路來回答,我認為軟體與硬體是兩個維度的概念,這些回答會使人更迷惑。
直接拋磚,從物理現象來說,電平控制電平(電壓的狀態)。電腦裡,CPU裡,記憶體裡並沒有花花綠綠的註釋或者程式碼,也沒有1和0,只有高電平與低電平。
我們鍵入程式碼時已經形成了各種高低電平,輸入每個字母每個符號都形成不同電平。1和0只是我們人類對電平高低的描述,便於理解和記憶與書寫。甚至聯想一下我們也可以用A和B,用高和低來表示。
一篇程式碼在電腦裡就是一片不計其數的電平(電平怎麼儲存?這可能和那片電路的無數電容元件有關係了),然後執行需要編譯成另一種電平,比如所謂的機器語言。
我們能看到的程式碼。花花綠綠的註釋關鍵字,101010,只是顯示器把我們敲鍵盤形成的電平轉化給我們看到的。
-
14 # scwsw
CPU是怎麼認識程式碼的?簡單的說是人為安排的,跟你聊數字邏輯運算你肯定越看越蒙。但這確實是人為安排的。我沒時間跟你從‘’1‘’0‘’說起,但要說一個東西“指令集”。這玩意幹啥用的?簡單的說就是對上密碼就可以發出指令的一張表。
深入一點研究就要從電報說起,我們都知道電報發出的訊號只有“嘀“”嗒”兩種訊號,但是卻可以透過這兩種訊號發出各種資訊和命令。實際上就是接受和發射方都有統一的密碼本,每一個文字對應一個數字,這樣就可以把接收到的數字變成文字,再把文字連起來就成了句子資訊或者命令。這樣有了嘀嗒的二進位制數字就可以運算出十進位制數字,用十進位制數字對照密碼本就可以在戰場上彙報戰況,所以CUP有了數字和指令大全,就可以知道前方的命令,往哪裡開炮,哪裡有敵人……。
同理,用程式碼本也可以變成‘’嘀嘀嗒嗒‘’的二進位制訊號,只所以CPU認識程式碼是因為CPU內部固化好了無數條指令集,這些就像一些發出命令的單詞,比如你敲下鍵盤,鍵盤內部的數位電路就會發出例如10101010101000011101……這樣的訊號,這麼長可能就只代表一個數字或加減號,而CPU接到這個訊號會按照指令表對號入坐,按照照指令做出相應的動作,處理器內部還有相應的快取和移位暫存器儲存步驟,而運算則是靠CPU裡另外整合的運算電路來完成,然後運算的結果可以是數字,也可以是另外的指令,再透過外設輸出結果,比如在印表機上輸出一個數字,或者在顯示器的某個部位顯示一個色塊。這就像前面說的戰場上的電報,給你了座標,然後像座標開炮!只是現在的CPU運算非常之快,瞬間就可以完成數字和程式碼之間的轉換,CPU可以控制每一發炮彈(畫素)在螢幕上的精確打擊點,所以運算出的東西會在螢幕上以特定的時間和位置發不同顏色的光,這些光組成的影象。只不過現在CPU裡可以執行指令和運算的電路太多,運算速度也太快,在一瞬間就運算出了結果,幾十億個電晶體還有很多的功能。
好懂嗎?
-
15 # 古中醫傷寒樸素派
CPU的工作原理就好像天貓物流的分揀系統,最初的電訊號只有兩個,但是多位數組合就有很多個,然後被分配到指定地址的分裝桶內,每投放一個包裹,就好比,輸入一組資料,然後電訊號被轉化成電磁訊號的揚聲器,以及分配訊號的顯示器……比如某電訊號設定為,深圳某區,北京某區,上海某區!網路地址,cpu識別機器電訊號,不認識設定的地址資訊,而被轉換成地址資訊的就叫翻譯器
-
16 # 陝西1945志願營
CPU最終是要把程式碼轉變成電路動作,因此高階語言程式碼需要透過編譯器轉換成二進位制機器程式碼,機器程式碼在CPU中透過譯碼電路轉換成具體的電路動作。CPU不會意識到程式碼究竟是什麼意思,只會忠實執行程式碼。
-
17 # 成都茂大叔
CPU不認識程式碼…你寫的程式碼要透過一個程式變成CPU能夠認識的指令,然後放在記憶體裡面,然後CPU再去讀取和執行這些指令…
-
18 # 太空情報員
咱們知道,二進位制的的0和1,如果不限位數的話,可以有無數種不同的組合;
CPU內部實際上是由各種電晶體,經過不同的設計排列組合成指令後的集合體;
咱們現在用的機器屬於馮諾依曼結構計算機,這個結構的計算機,特點就是把程式和要用的資訊預儲存到硬碟這種外儲存器裡,而硬盤裡儲存的東西,其實簡單來說就是以強弱磁的形式存放了操作CPU所執行的指令順序
注意,二進位制對於機器而言可不是數字,那是訊號子的排列組合,大家可以想象成發電報,電影裡電報員是怎麼收發電報的,CPU就是就類似於電報員,在電腦裡收發處理各個部件的資訊,只不過頻率比人快多了;
譬如先要操作加法啊,還是先操作減法啊等等,不同的指令根據排列組合的順序不同依次執行,就會得出不一樣的結果,但不論怎麼操作,命令均為處理器裡設計好的命令;
當然啦,後來的攻城獅們,覺得用二進位制操作計算機好麻煩哦,就打包歸類,把常用的二進位制整合了一下,形成了組合語言;
再後來,攻城獅們覺得彙編對於應用層的快速開發不夠友好啊,就再一次整理歸類,搞出了高階語言,比如c啊,java啊,c++啊什麼的;
還有啊,CPU里加載的可不是單純的資料,而是你想要呼叫的硬體指令+需要運算的資料;(或者說是演算法+資料結構也OK)
而CPU能夠看懂這些二進位制的指令和資料,其實完全由裡面的線路設計決定的,咱們在鍵盤滑鼠觸控式螢幕輸入任何的動作,都有相對應的二進位制固定命令,這些固定命令的組合是多種多樣的,就像不同的開關一樣啟用CPU裡面不同模組去進行工作,抑或改變這些模組的連通方式進行組合工作
-
19 # 旅行的意義7872
第一是電報程式碼你聽過吧,長短音的區別跟程式碼表對應找碼段代表的漢字。
第二電報音里長短音分別用1和0表示,並且不用一條線路發,而是同時用36條或者64條發。36個開關組成多少種組合?每種組合定義成一個字碼,是不是每個傳送都形成一個字碼?
第三每個CPU針腳接受到的0和1按照針腳順序是不是可以根據是否接到訊號理解為一個組合,把它識別成之前程式碼表裡的字碼?
然後連續的字碼組成一段,是不是組成單詞?
當然單詞是供我們人類識別的。實際上電腦這時候生成的叫機器語言。
電腦會把字碼串語言再進行編譯跟翻譯,形成高階語言、組合語言。
跟人類一樣,識字的過程是電腦基礎語言,在製造硬體的時候就已經制造進去了,而看書思考的過程就是我們各種各樣的應用軟體和系統結合的產生的效果。應用軟體就像拓展記憶一樣讓人透過文字產生大腦思想活動而不是僅僅停留在每個字碼識別上。
-
20 # 胡凱文
高階語言透過編譯器編譯成組合語言,組合語言再編譯成機器語言也就是0和1,電路開代號為1,關代號為0,機器語言控制著上億個開關閉合閉合又閉合,我個人就是這麼理解的!!
回覆列表
提前備註:回答比較硬核,我會盡量軟化,但想了解知識還是需要耐心。CPU內傳輸的訊號有兩種:高電壓和低電壓,分別代表數字訊號“1”和“0”,因此CPU唯一能理解(問題中的“認識”)的語言就是由“1”和“0”寫成的機器語言。
由於程式(程式碼)儲存在電腦硬碟中時,也是“1”和“0”的形式,是否就意味著,只要程式存到硬碟中,CPU就能認識呢?
答案是CPU仍然看不懂這些程式,因為以“1”和“0”形式儲存的程式和以“1”和“0”寫成的語言完全是兩回事,兩者的區別類似於漢語書和英語書都用紙和油墨印製,但依然是兩種不同的語言,不會英語的依然看不懂英語書。
要讓CPU能看懂程式碼,要做相當多的工作。
現在的程式都是由C++和Java等高階語言寫成,這些語言是為方便人類程式設計發明的,不是為方便電腦執行而設計。
說到這裡,需要進一步說說機器語言和高階語言的差別。機器語言的最大特點是面向計算機硬體程式設計,簡單說就是程式設計師需要通曉計算機硬體知識,寫的程式要真實表示資料是如何被計算機操縱的。對程式設計師來說這就比較頭大,畢竟上得了“廳堂”下得了“廚房”只有少數大神能做到,加上機器語言純用“0”和“1”序列組成,既對視力是一種摧殘,也是對程式設計趣味的扼殺。
於是,有一幫人開始琢磨了:能不能將計算機硬體從程式設計中分離出來,讓硬體知識小白也能程式設計?
最先開竅的是藍色巨人IBM,它在其System/360計算機中引入了ISA(Instruction Set Architecture)概念,將程式設計所需要了解的硬體資訊從硬體中抽象出來,這樣程式設計人員就可以面向ISA程式設計。由於ISA是用來描述程式設計時用到的抽象機器(不是具體的電腦CPU),包括了一套指令集和一些暫存器,因此,程式設計師只要知道ISA,不需要了解具體的硬體知識(每一兩年硬體都會換新),就可以編寫程式,在ISA相同的電腦上執行。
這樣一來,程式設計師不必瞭解過於專業的計算機硬體知識,不需要下得了廳堂,可以專心在“廚房”烹調程式大餐。
由此也可以看出,程式設計師很多都是不瞭解計算機硬體的,所以妹子們不要指望自己的程式設計師男朋友給你DIY電腦,或者電腦壞了,他能給你省下一筆修理費。他說不會修,那就是真的不會修。
極客漫畫《程式語言之戰》。
自從不用懂硬體也能程式設計的高階語言出現後,人類開始了程式設計上的放飛自我,經過數十年發展,高階程式語言已超過2500種。但矛盾出現了,CPU能理解的機器語言還是那個機器語言,幾十年來沒有變化,怎麼辦?
其實,早在高階語言出現之前的組合語言時代,聰明的計算機研發人員就開發出了專門的程式,用來將組合語言和高階語言翻譯成機器語言,其過程相當於將英語名著翻譯成漢語著作。這種翻譯程式相當於人類中的翻譯家。
編譯器有兩種方法用於翻譯:編譯和解釋,相應的名稱是編譯器和直譯器。兩者的區別是,編譯是在執行前把整個源程式(高階語言程式)翻譯成目標程式(機器語言程式),而解釋是一次只翻譯和執行源程式中的一行。
打個形象的比方,直譯器相當於釋出會的實時翻譯,演講的嘉賓說一句,實時翻譯馬上翻譯一句。編譯器則相當於著作翻譯家,整本翻譯完成後,再讓出版社印刷上市。
將高階語言翻譯成機器語言的過程。個人手繪比較粗糙,大家湊合看。
重點來了,從以上的內容可以看出,由於CPU不能直接理解用高階語言寫成的程式碼,必須由翻譯程式翻譯成機器語言,因此翻譯程式可以極大地影響甚至決定處理器效能的發揮。如果沒有一個好的翻譯程式,那麼CPU的效能再強大,也好比茶壺裝的餃子,倒不出來。正因為如此,谷歌在安卓4.4之後,拋棄了Dalvik虛擬機器,改為ART,實際是將翻譯程式從直譯器切換到編譯器,發揮了晶片的效能,提高了程式執行效率。
現在,手機大廠包括華為、OPPO和vivo都開始重視編譯器開發,說到底就是為了發揮晶片效能,讓它不再成為倒不出餃子的茶壺。
最後總結一下,用翻譯程式把程式設計師編寫的程式翻譯成二進位制程式碼的機器語言後,CPU就能認識了,而且翻譯程式的優劣可以影響乃至決定CPU效能發揮。