1. 程式人生 > >rw_程式是怎樣跑起來的 1-6章

rw_程式是怎樣跑起來的 1-6章

2016.10.15 - 10.25
《程式是怎樣跑起來的》1-6章
- 矢澤久雄 / 著
- 李俊峰 / 譯
個人學習筆記。

10.15

1 對程式設計師來說CPU是什麼

0 問題 & 重點

1. 程式是什麼
[1] 儲存在記憶體中的高低電平序列。
[2] 指示計算機每一步動作的一組指令。

2. 程式是由什麼組成的
[1] 高低電平序列[有的序列對應資料;有的序列對應指令]。
[2] 指令和資料。

3. 什麼是機器語言
[1] 輸入CPU後能讓CPU產生相應高低電平輸出的高低電平序列所組成的集合。[高低電平序列被邏輯的10序列來抽象表示,10序列再被助記符來對應表示]
[2] CPU可以直接識別並使用的語言。

4. 正在執行的程式儲存在什麼位置
[1] 記憶體或cahe。
[2] 記憶體。

5. 什麼是記憶體地址
[1] 通過它輸入給地址譯碼器後可以訪問到一塊記憶體的邏輯編號。
[2] 用來表示指令和資料儲存在記憶體中位置的數值。

6. 計算機的構成元件中,負責程式的解釋和執行的是哪個
[1] 控制器。
[2] CPU。
需要按照問題所在層次回答問題

重點。程式設計師需要了解CPU是如何執行的,特別是要弄清楚負責儲存指令和資料的暫存器的機制。

1.1 CPU的內部結構解析

這裡寫圖片描述
暫存器是程式設計師需要了解的。剩餘部分不需要太過於關注。機器語言級別的程式是通過操作暫存器來描述功能的

1.2 CPU是暫存器的集合體

這裡寫圖片描述

程式計數器。程式計數器暫存器的值是記憶體地址,CPU會將程式計數器內的值(記憶體地址)中的內容取出來放到相應暫存器中(指令、資料、地址)。彙編指令中有很多指令都能夠更改程式計數器的值(從C語言層面來講,是分支和迴圈;從組合語言層面講,是轉移指令),程式計數器的值決定程式執行流程。

標誌暫存器。一些彙編指令執行後還會更改標誌暫存器某些位的值。也有一些依賴於標誌暫存器某些位作為條件的彙編指令。(這些指令運算後的某個輸出與該暫存器的某個位相連線)

10.16

1.5 函式呼叫機制

[1] 先插入點其它的話題 —— 關於程式被編譯連結成的區域。

/* main.c
 * 呼叫stack.c中的函式,
 * 檢視程式的指令區、資料區、棧區以及函式被呼叫時的棧幀
 * 2016.10.16
 */

/* global variable*/
double fv = 0.1f;

/* declare function defined in stack.c */
void push(double f);
double pop(void);

int main(void)
{
    push(fv);
    fv  = pop();
    return 0;
}

/* stack.c
 * 定義一個數組以棧的機制使用它
 * routine form 《TCPL》Section 4.3, modified a little by me
 * 2016.10.16
 */

#define MAXVAL  100         /* maximum depth of val stack */

static int sp = 0;          /* next free stack position */
static double val[MAXVAL];  /* value stack */

/* push: push f onto value stack */
void push(double f)
{
    if (sp < MAXVAL)
        val[sp++]   = f;
    else
        return;
}

/* pop: pop and return top value from stack */
double pop(void)
{
    if (sp > 0)
        return val[--sp];
    else
        return 0.0;
}

這裡寫圖片描述
擷取segment中關於程式碼段和資料段的資訊:
這裡寫圖片描述

然後在segment所在檔案中搜索main、push、pop三個函式(如/main):
這裡寫圖片描述
.text段的(虛擬)地址範圍為0x08048300 ~ 0x080484fc。再檢視這三個函式的(虛擬)地址,pop為0x08048418,push為0x080483e0,main為0x080483b4。它們的內容都在.text段中。

.data段的(虛擬)地址範圍為0x0804a008 ~ 0x0804a018,再檢視全域性變數fv的虛擬地址:
這裡寫圖片描述

.bss段的(虛擬)地址範圍為0x0804a020 ~ 0x0804a380,兩個靜態全域性變數的(虛擬)地址為:
這裡寫圖片描述

[2] 函式呼叫機制
這裡寫圖片描述
[整張圖不清晰,將各部分分解如下]

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

10.17

1.6 CPU處理指令的型別

這裡寫圖片描述

2 資料是用二進位制數表示的

0 問題 & 重點

1. 32位是幾個位元組
4。

2. 二進位制數01011100轉換成十進位制數是多少
92。

3. 二進位制數00001111左移兩位後,會變成原數的幾倍
4。

4. 補碼形式表示的8位二進位制數11111111,用十進位制數表示的話是多少
無符號數255;有符號數-1。

5.補碼形式表示的8位二進位制數10101010,用16位二進位制數表示的話是多少
66.[理解錯了]
1111111110101010

6. 反轉部分圖形模式時,使用的是什麼邏輯運算
[2] XOR。

重點。為什麼計算機處理的資訊要用二進位制數來表示呢?

2.1 用二進位制數表示計算機資訊的原因

這裡寫圖片描述

2.2 什麼是二進位制數

這裡寫圖片描述

2.4 便於計算機處理的“補數”

10.18
這裡寫圖片描述

2.5 邏輯右移和算術右移的區別

這裡寫圖片描述

2.6 掌握邏輯運算的竅門

邏輯運算是指對二進位制數各數字位的0和1分別進行處理的運算。

3 計算機進行小數運算時出錯的原因

0 問題 & 重點

1. 二進位制數0.1,用十進位制數表示的話是多少
0.5。

2. 用小數點後有3位的二進位制數,能表示十進位制數0.625嗎
可以。

3. 將小數分為符號、尾數、基數、指數4部分進行表現的形式稱為什麼
[1] 科學計數法。
[2] 浮點數。

4. 二進位制的基數是多少
2.

5. 通過把0作為數值範圍的中間值,從而在不使用符號位的情況下來表示負數的表示方法稱為什麼
[2] EXCESS系統表現。

6. 10101100.01010011這個二進位制數,用十六進位制數表示的話是多少
0xac.53。

重點。計算機進行小數處理的機制。

3.1 將0.1累加到100次也得不到10

這裡寫圖片描述

3.4 什麼是浮點數

浮點數是指用符號、尾數、基數(二進位制為2)和指數這四部分來表示的小數。[像0.12345x1030.12345x101這樣使用與實際小數點位置不同的書寫方法來表示小數的形式稱為浮點數。與浮點數相對的是定點數,使用定點數表示小數時,小數點的實際位置固定不變。如0.12345x1030.12345x101用定點數來表示的話即為123.45和0.012345]

這裡寫圖片描述

10.19

3.7 如何避免計算機計算出錯

無視錯誤。根據程式目的的不同,有時一些微小的偏差並不會造成什麼問題。例如,假設使用計算機設計工業製品。將100個長0.1mm的零件連線起來後,其長度並非一定要是10mm,10.000002mm也沒有任何問題。
將小數換成整數來計算,然後再倍數回小數。

4 熟練使用有稜有角的記憶體

0 問題 & 重點

1. 有十個地址訊號引腳的記憶體IC(積體電路)可以指定的地址範圍是多少
0 ~ 2101

2. 高階程式語言中的資料型別表示的是什麼
[1] 佔用記憶體的大小。
[2] 佔用記憶體的大小和儲存在該記憶體區域的資料型別。

3. 在32位記憶體地址的環境中,指標變數的長度是多少位
32位。

4. 與實體記憶體有著相同構造的陣列的資料型別長度是多少
[1] 沒看懂。
[2] 1位元組。

5. 用LIFO方式進行資料讀寫的資料結構稱為什麼
棧。

6. 根據資料的大小連結串列分叉成兩個方向的資料結構稱為什麼
[1] 二叉樹。
[2] 二叉查詢樹。

重點。只要在程式上花一些心思,就可以將記憶體變成各種各樣的資料結構來使用。

4.1 記憶體的物理機制和記憶體的邏輯模型

10.20
這裡寫圖片描述

4.3 簡單的指標

10.22
指標的理解:變數 +型別。

4.4 陣列是高效使用記憶體的基礎

這裡寫圖片描述

5 記憶體和磁碟的親密關係

0 問題 & 重點

10.24
1. 儲存程式方式指的是什麼
[1] 問題何意。
[2] 在儲存裝置中儲存程式,並逐一執行的方式。

2. 通過使用記憶體來提高磁碟訪問速度的機制稱為什麼
磁碟快取機制。

3. 把磁碟的一部分作為假想記憶體來使用的機制稱為什麼
虛擬記憶體。

4. Windows中,在程式執行時,儲存著可以動態載入呼叫的函式和資料的檔案稱為什麼
動態連結檔案。

5. 在EXE程式檔案中,靜態載入函式的方式稱為什麼
靜態連結。

6. 在Windows計算機中,一般磁碟的1個扇區是多少位元組
512位元組。

重點。記憶體和磁碟的親密關係。

5.1 不讀入記憶體就無法執行

儲存程式方式機制是指程式儲存在儲存裝置中,通過有序地讀出來實現執行。
因為負責解析和執行程式-的CPU是通過程式計數器來指定記憶體地址,然後才能讀取程式。所以在磁碟中儲存的原始程式是無法直接執行的,必須載入到記憶體中才能執行。[即使CPU可以用程式計數器指定磁碟地址並可直接讀取磁碟中儲存的程式,由於磁碟讀取速度較慢,程式的執行速度還是會降低。]

5.2 磁碟快取加快了磁碟訪問速度

磁碟快取指的是把磁碟中讀出的資料儲存到記憶體空間中的方式。這樣一來,當接下來需要讀取同一資料時,就不用通過實際的磁碟,而是從磁碟快取中把內容讀出。使用磁碟快取可以大大改善磁碟資料的訪問速度。

[隨著硬碟訪問速度的大幅度改善,磁碟快取的效果也沒有之前那麼明顯了。這種快取的機制在其他情況下也會遇到。如在Web瀏覽器中,Web瀏覽器是通過網路來獲取遠端Web伺服器的資料並將其顯示出來的。在顯示較大圖片等檔案時,會花費不少時間。於是,Web瀏覽器就可以把獲取的資料暫時儲存在磁碟中,然後在需要時再顯示磁碟中的資料]

5.3 虛擬記憶體把磁碟作為部分記憶體來使用

虛擬記憶體是指把磁碟的一部分作為假想的記憶體來使用。[這與磁碟快取是假想的磁碟(實際上是記憶體)相對,虛擬記憶體是假想的記憶體(實際上是磁碟)]

分頁式虛擬記憶體。不考慮程式構造,把執行的程式按照一定大小的頁進行分割,並以頁為單位在記憶體和磁碟間進行置換。[一般情況下,Windows計算機的頁大小是4KB。也就是說,把大程式用4KB的頁來進行劃分,並以頁為單位放入磁碟(虛擬記憶體)或記憶體中。為了實現虛擬記憶體功能,Windows在磁碟上提供了虛擬記憶體用的檔案(page file,頁檔案)。該檔案由Windows自動做成和管理。檔案的大小也就是虛擬記憶體的大小,通常是實際記憶體的相同程度至兩倍程度]
這裡寫圖片描述

分段式虛擬記憶體。把要執行的程式分割成以處理集合及資料集合等為單位的段落,然後再以分割後的段落為單位在記憶體和磁碟之間進行資料置換。

5.4 節約記憶體的程式設計方法

虛擬記憶體無法徹底解決記憶體不足問題。[page in、page out攜帶的低速訪問等]

棧清理處理指把不再需要的資料 從接收和傳遞 函式的引數時使用的記憶體上的棧區域中清理出去(即清理形參所佔用的空間)。該命令不是程式記述的,而是在程式編譯時由編譯器自動附加到程式中的。編譯器預設將該處理附加在函式呼叫方。
這裡寫圖片描述

5.5 磁碟的物理結構

這裡寫圖片描述

扇區是(BIOS)對磁碟進行物理讀寫的最小單位。是Windows在邏輯方面(軟體方面)對磁碟進行讀寫的單位,它是扇區的整數倍。windows中的檔案以簇為單位進行儲存。扇區和簇的大小,是由處理速度和儲存容量的平衡來決定的

如果跳出BIOS或Windows,只要掌握磁碟讀寫原理,隨汝怎麼樣規劃磁碟讀寫方式。

6 親自嘗試壓縮資料

0 問題 & 重點

10.25
1. 檔案儲存的基本單位是什麼
1位元組。

2. DOC、LZH和TXT這些副檔名中,哪一個是壓縮檔案的副檔名
LZH。

3. 檔案內容用“資料的值 x 迴圈次數”來表示的壓縮方法是RLE演算法還是哈夫曼演算法
RLE。

4. 在Windows計算機經常使用SHIFT JIS字元編碼中,1個半形英數是用幾個位元組的資料來表示的
1位元組。

5. BMP(BITMAP)格式的影象檔案,是壓縮過的嗎
沒有。

6. 可逆壓縮和非可逆壓縮的不同點是什麼
可逆壓縮可解壓;非可逆壓縮不可解壓(不可還原)或還原後會丟失一部分資訊。

重點。為什麼檔案可以壓縮。

6.1 檔案以位元組為單位儲存

程式檔案中儲存資料的單位是位元組。文字、顏色等都有對應的編碼。[單位也是基於位元組的]

6.2 RLE演算法的機制

AAAAAABBCDDEEEEEF採用RLE(Run Length Encoding)方式壓縮為A6B2C1D2E5F1。因為影象重複的相同位元組比較多,所以RLE常用於壓縮影象。但不太適合文字檔案的壓縮。但如果再在RLE演算法的基礎上下點功夫,如不以1個字元為單位,而以字串為單位來查詢重複次數,這樣壓縮的檔案也能小一些。

6.4 通過莫爾斯編碼來看哈夫曼演算法的基礎

哈夫曼演算法拋棄了半形英文數字的1個字元是1個位元組的資料[雖然儲存資料是以1位元組為單位],即多次出現的字元用小於8位的位元組數來表示[短編碼],不常出現的字元則可以用超過8位的位元組數來表示[長編碼]。[採用不同位長的初衷是每個數字對應一個編碼]

莫爾斯編碼是根據日常文字中各字元出現頻率來決定表示各字元的編碼的資料長度的。哈夫曼為壓縮物件檔案構造最佳的編碼體系[即在文中出現頻率最高者採用短編碼],並以該編碼體系為基礎來進行壓縮。用哈夫曼演算法壓縮過的檔案中,儲存著哈夫曼編碼資訊和壓縮過的資料。
這裡寫圖片描述

[2016.11.01 - 10:21]

相關推薦

rw_程式是怎樣起來1-6

2016.10.15 - 10.25 《程式是怎樣跑起來的》1-6章 - 矢澤久雄 / 著 - 李俊峰 / 譯 個人學習筆記。 10.15 1 對程式設計師來說CPU是什麼 0 問題 & 重點 1. 程式是什麼? [1] 儲

讀書筆記-程式是如何起來的(第二)

1.由於cpu中的引腳只有兩種狀態,0v或者5v,所以就只有0或1兩種符號來表示計算機的狀態 2.一個位元組=8位二進位制數(位元組是資訊計量的基本單位,位是最小單位) 3.二進位制轉十進位制的換算:各個數位的數值乘以位權再相加

讀書筆記-程式是如何起來的(第一)

1.機器語言:計算機cpu可以直接識別並且執行的語言 2.程式是一組指令和資料的集合 3.記憶體是儲存命令和資料的場所,通過地址來標記 4.cpu負責的就是解釋和執行最終轉換為機器語言的程式內容 5.cpu內部由暫存器,控制器,運算器

《C程式設計習慣》讀書筆記(1-6

最近在看兩本國人寫的書:C程式設計習慣、Linux C程式設計。越看越發現如獲至寶。有時真覺得,看國外的書,都能將晦澀概念深入淺出解釋通透,而國內的書,能切合國人的習慣來解釋和應用知識。以前只青睞國外的書,這兩本國內的電子書本來只想簡單瀏覽一遍鞏固基礎,現在越看越想做讀書筆記,因為實在是很多看似

組合語言——1-6

彙編指令和機器指令一一對應,有編譯器翻譯識別,計算機無法直接識別 一個儲存單元等於1位元組 1位元組等於8位 1KB=1024Byte(位元組) 1Byte=8bit(位) CPU中,指令和資料都是二進位制形式存在 磁碟的資料,CPU無法直接使用,只能讀到記憶體中,才能被CPU使用 CPU可

《TensorFlow:實戰Google深度學習框架(第二版)》筆記【1-6

第一章:深度學習簡介 在大部分情況下,在訓練資料達到一定數量之前,越多的訓練資料可以使邏輯迴歸演算法對未知郵件做出的判斷越精準。之所以說在大部分情況下,是因為邏輯迴歸演算法的效果除了依賴於訓練資料,也依賴於從資料中提取的特徵。假設從郵件中抽取的特徵只有郵件傳送

微信點餐系統感悟(上1-6

系統 去掉 Pageable 數據結構 ctc 實現類 異常 自定義 截圖 小結感悟 1.首先完成了一個階段,對所有的Api進行了分析與實現 2.項目開始時說的技術只實現了SpringBoot+jpa的數據庫實現和RESTful風格接口實現前後端的數據連通 3.項目實現的四

程序是如何起來的――第一

計算 對象 結果 和數 匯編語言 程序計數器 如何 功能 掌握 在第一章的時候,開始的時候有幾個問題,突然發現自己的基礎知識很薄弱,相信以後自己會更加註重基礎知識的積累吧。在第一章中重新認識了一些知識和概念,像這些,掌握程序運行機制的基礎和前提是了解程序的運營流程

Spring官方文件翻譯(1~6

Spring框架是一個輕量級的解決方案,可以一站式地構建企業級應用。Spring是模組化的,所以可以只使用其中需要的部分。可以在任何web框架上使用控制反轉(IoC),也可以只使用Hibernate整合程式碼或JDBC抽象層。它支援宣告式事務管理、通

JS權威指南需要注意的知識點(1-6)

客官快來看一看了,都給你濃縮好了,確定不進來摟一眼嘛,走過路過不要錯過喲 in運算子   in運算子希望它的左運算元是一個字串或可以轉化為字串,希望它的右運算元是一個物件,如果右側的物件擁有一個名為左運算元值的屬性名,則表示式返回true,否則為fasle  var obj = {X:1,Y:2}

macOS使用ABP.vNext Core開發CMS系統(一) 讓程式起來

macOS使用ABP.vNext Core開發CMS系統(一) 讓程式跑起來——2020年10月5日 國慶假期,陪老婆的同時也不能忘記給自己充充電,這不想搞個CMS系統,考慮自己的時間並不多,所以想找一套相對成熟的框架來快速開發,碼雲上找了幾個開源專案,感覺都是別人的東西,機緣巧合下,決定使用之前一直沒時間用

macOS使用ABP Core免費模板開發CMS系統(一) 讓程式起來

macOS使用ABP Core免費模板開發CMS系統(一) 讓程式跑起來——2020年10月5日 國慶假期,陪老婆的同時也不能忘記給自己充充電,這不想搞個CMS系統,考慮自己的時間並不多,所以想找一套相對成熟的框架來快速開發,碼雲上找了幾個開源專案,感覺都是別人的東西,機緣巧合下,決定使用之前一直沒時間用的A

程式是怎樣起來的-第10 通過組合語言瞭解程式的實際構成

第10章通過組合語言瞭解程式的實際構成 熱身問題 1.原生代碼指令中,表示其功能的英文縮寫稱為什麼? 助記符、組合語言是通過利用助記符來記述程式的。 2.組合語言的原始碼轉換成原生代碼的方式稱為什麼? 彙編、使用匯編器這個工具來進行彙編。 3.原生代碼轉換

61講簡單的循環結構

3-9 log 結構 -1 mar src () col pan main() { int sum,i; sum=0; i=1; while(i<=100) { sum=sum+i;

6 靜態路由和動態路由(1)_靜態路由

align 將在 跟蹤 添加 測試 字母 ppp協議 必須 缺少 1. 路由——網絡層實現的功能 1.1 路由功能 (1)網絡層的功能:給傳輸層協議提供簡單靈活的、無連接的、盡最大努力交付的數據包服務。 (2)路由器為每一個數據包單獨地選擇轉發路徑,網絡層並不提供服務質量的

程式設計師教程-6-資料庫基礎知識

  目錄結構:   6.1 基本概念     6.1.1 資料庫系統     6.1.2 資料庫管理技術的發展       1 人工管理階段       2 檔案系統階段       3 資料庫系統階段     6.1.3 大資料       1 大資料產生背景       2 大資料的特徵

#美團程式設計師吐槽:找個廁位從5樓1樓,天天如此,真受不了!

對於一些員工較多的公司,廁位可就是一個大問題,畢竟早上上班是個高峰期,大家肯定也有過因為沒有廁位而焦急等待著,憋得肯定特別難受。有美團的員工就在網上吐槽了自己的尷尬事情。 有想學習java的程式設計師,可來我們的java學習扣qun:72340,3928免費送java的視訊教程噢!小編是6年



《從0到1學習Flink》—— Mac 上搭建 Flink 1.6.0 環境並構建執行簡單程式入門

準備工作 1、安裝檢視 Java 的版本號,推薦使用 Java 8。 安裝 Flink 2、在 Mac OS X 上安裝 Flink 是非常方便的。推薦通過 homebrew 來安裝。 brew install apache-flink 複製程式碼 3、檢查安裝: flink --

130個微信小程式原始碼demo,拿來就可以起來的小程式

微信小程式未來也將會是個趨勢,在現在這個時代,安卓手機使用者寧願先從微信裡面去搜一下是否有這個軟體,這個軟體是否值得安裝也不願意開啟手機應用商店去下載應用。 其中有以下兩個主要原因: 第一,使用者的惰性警惕性越來越高,現在的手機APP動不動就要獲取使用者的全部許可權,本