最近在讀《深入理解計算機系統》這本書,朋友推薦的,豆瓣評分九點幾分,相當不錯。看了一周,有些收穫,記錄下來以後回看。
一。計算機是如何執行我們的oc呢?或者說是如何執行高階程式語言呢?
我們都知道計算機執行是靠二進位制來計算,計算機的cpu是由很多的電晶體,二極體,微控制器組成的,當我們在**中寫下x=2,y=3,z=x+y,nslog(@「%@」,z);的時候,我們知道在記憶體中開闢了3個空間,乙個是x,他的值是2,同理y是3,還有乙個是z,是指標,沒有輸入值。但是下面我又列印了z的值,是需要先計算然後把這個值給z的。
這時候cpu就要計算了,cpu中有乙個叫加法器的東西,首先把x的值取出來是2,轉換成2進製是10,然後是y的二進位制值是11,計算出的結果是5,也就是101,這樣就計算出了這個值。
但是計算機是屬於電子器件,它怎麼來表示101也就是5這個值呢?電子件,當然是通過電壓來控制了,這裡要說一下為啥計算機來用二進位制計算,我們生活中用十進位制不是很方便麼?要知道計算機的cpu是由無數個電晶體組成的,如果使用十進位制來計算,就要有1-10個開關來控制1-10這10個數來進行加減法的運算,如果用二進位制呢。是不是就減少了很多個開關的組成,但是同樣組成的運算結果就會多很多倍。計算2+3的時候,表示2的這個開關給1v電壓,表示3的這個開關給1v電壓其他的給0v就行了。如果計算的是2+3+9+100+22,cpu的加法器就會採用一種級聯的機制,先計算2+3的結果,然後傳到下乙個加法器跟9計算,再往下乙個加法器傳這樣,逐級相加就得出了結果。
那麼在電路中邏輯是如何實現的呢?比如我們寫一段**printf("***x");我們把它分解一下,由兩部分組成,乙個是單詞printf。乙個是列印的內容***x。***x這個字母是可以通過unicode編碼找到對應的二進位制的值的,同理漢字也是一樣,再說這個printf。高階語言編譯執行能被電路識別執行的步驟是在倒數第二步轉換成組合語言的,c語言是比組合語言高一級的封裝,比如我計算加法的時候,計算中的「+」就是彙編中的add,計算機電路識別到了add後直接呼叫加法器,而c語言把add封裝成了乙個「+」所以我們可以直接寫2+3.同理,printf也是對組合語言中的列印print的一層封裝,在電路執行的時候識別了彙編的print,也就執行了列印,即把儲存的***x的記憶體全給列印。
再比如我執行了乙個for迴圈的邏輯,for迴圈轉換成彙編,彙編理解我的意思後在記憶體中會迴圈呼叫for迴圈當前的tag值所指向的記憶體的值來執行迴圈內的邏輯。
以上就是我所理解的計算機是如何執行高階程式語言的、一些淺見,如有不對請大神指正。
linux 深入理解計算機系統 一
電子計算機三大核心部件 含義 1.作為計算機系統的運算和控制核心,是資訊處理 程式執行的最終執行單元。2.計算機系統中所有軟體層的操作,最終都將通過指令集對映為cpu的操作 功能 1.解釋計算機指令 2.處理計算機軟體中的資料 結構 1.運算器 計算機中進行各種算術和邏輯運算操作的部件,其中算術邏輯...
深入理解計算機系統(一 計算機系統漫遊)
處理單元 cpu 簡稱處理器,是解釋 或執行 儲存在主存中指令的引擎。處理器的核心是乙個字長的儲存裝置 或暫存器 成為程式計數器 pc 在任何時刻,pc都指向主存中的某條機器語言指令 即含有該條指令的位址 從系統通電開始,直到系統斷電,處理器一直在不斷的執行程式計數器指向的指令,再更新程式計數器,使...
計算機系統那些事 深入理解計算機系統(一)
一枚程式設計小白從2018.9.1的學習歷程 世界上沒有什麼是努力辦不到的,如果有,那麼就更努力一些吧 1.在unix系統上,原始檔到目標檔案是如何轉化的呢?從源程式也就是hello.c經過預處理 cpp 也就是那些 引入的標頭檔案啦,把它直接插到程式中,結果呢,得到hello.i這個時候程式就變得...