最早的程式是需要直接操作硬體的,也就是說編寫的程式除了需要的邏輯**之外,還要把控制硬體**也寫進去,後面隨著人們初步把這些公共**抽離,就形成了作業系統
程式執行環境,包含硬體和作業系統. 作業系統就是操作硬體的程式,也是乙個平台,讓其他程式可以執行在作業系統之上,而不再需要直接操作硬體.現代作業系統為了安全,很多已經禁止直接的硬體操作行為
現代計算機組成:
cpu,記憶體,外部io裝置如滑鼠,鍵盤,螢幕,印表機,磁碟等等作業系統出現之後,也結束了程式設計師需要適配不同硬體平台的問題,都由作業系統去適配,**api則是統一一套,節約了很多精力. 這也是很多軟體設計的思想,沒有什麼問題是新增一層分層無法解決的,除了層級過多這個問題本身
軟體多平台相容性,也有使用中間**和平台的如瀏覽器, jvm設計思路就是如此.
bios(basic io system),用來做硬體自檢和引導程式啟動功能的; bootstrap本意就是鞋子後面的布帶,乙個小提手
計算機無法直接執行源**,不管是c,shell,js, python等等,最終都需要變成可執行二進位制**
編譯步驟分為: 預處理,編譯,彙編,鏈結4個大階段
編譯分為: 詞法分析,語法分析,語義分析和中間**生成, 中間**優化,目標**生成5個階段目標**生成因為不同的硬體平台,所以中間**環節是很重要的,意味著只需要在目標**生成這個環節做多平台相容處理,可以節省很多任務作.
這種解決問題思路可以用在軟體開發的各個環節,就是講工作拆解,這樣一旦有變化,不需要整體改動,只需要改動對應環節即可,大大增加**靈活性
注意一般是乙個**檔案生成乙個目標**檔案,如.obj .class, 但實際程式可能會有很多個,這時候就需要將這些目標**檔案鏈結在一起.這個一般是鏈結器來解決.
鏈結,可以分為靜態鏈結和動態鏈結, 顧名思義,靜態鏈結就是編譯時就鏈結進去,動態鏈結則是執行時或者執行前鏈結進去,類似懶載入方式. dll就是為了解決程式之間公共**冗餘而專門抽離出來,也可以節約記憶體消耗.
編譯時,虛擬記憶體位址以及執行時真實記憶體位址,這時候有乙個位址轉換,這也是為什麼會有基位址的原因.
記憶體中程式占用: 儲存變數,儲存函式, 棧, 堆
作業系統是執行在硬體層之上, 也是乙個平台; 應用程式則執行在作業系統之上
系統呼叫, 就是作業系統提供統一api介面, 程式直接呼叫, 作業系統保證行為和返回資料一致性,而程式設計師不用關心平台差異性.
程式可移植性,也是一樣. 只要是在對應作業系統上驗證可用,則可以執行在相同作業系統的不同機器上,而不用關心其硬體差異.
目前來說,一般都是相同作業系統具備移植性what you see is what you get,就是所見即所得, 這一點其實貫穿整個軟體開發設計中,就是盡量讓程式和結果之間關係簡單直白一些,文件,注釋,說明,引導,gui圖形化介面,提示等等都是為了達到這個目的但基於軟體平台的,則可以跨作業系統如瀏覽器, jvm, 容器等等
多工, 也就是時間片機制. 以前都是單核cpu,為了可以同時執行多個任務,這時候將cpu的執行時間切片,每個任務輪流得到這個執行時間,這樣表面看就是多個任務同時執行.
.asm就是彙編檔案字尾
c語言可以和彙編**混編,彙編**是由助記符來幫助記憶和使用的
彙編**和本地機器**是一一對應的
彙編和反彙編, 前者就是把**轉為組合語言**, 後者則相反. 彙編器就是執行前者的工具,也有的彙編器可以執行後者
段定義,segment和end標記, 是構成程式的命令和資料的幾何體加乙個名字得到的
_text過程procudure_data
_bss
從上可以看到, **段,資料段,未初始化全域性變數資料段是怎麼來的了
proc和endp包起來的,相當於函式的形式,就叫做過程組合語言形式:
操作碼和運算元暫存器movadd
push
popcall
ret
eax 累加暫存器ebx 基址暫存器
ecx 計數暫存器
edx 資料計數器
esi 源基址暫存器
edi 目標基址暫存器
ebp 擴充套件基址指標暫存器
esp 擴充套件棧指標暫存器
x86 的32位暫存器都帶了e,擴充套件的意思,因為16位名稱是不帶e的.這是為了區分
注意因為本身x86最開始是從8位,16位硬體開始擴充套件和設計的,這是為了相容處理
函式呼叫
call全域性變數和區域性變數ret注意在這個過程中,棧就是儲存區域性變數和資訊的地方,呼叫結束則會清空棧中資料
注意生命週期不同, 使用方式不同, 管理方式也不同流程控制變數如果暫存器空間足夠則放在暫存器,不夠則用棧存放;因為暫存器訪問速度快得多
gotowindows提供系統呼叫方式訪問硬體,直接操作硬體在目前2023年的作業系統中越來越少,主要是安全考量.call
retcmp
jl(jump on less than)
jlejge
jg
不過iot物聯網興起,一些專用作業系統在硬體呼叫上是越來越便捷
io裝置都是通過io控制器進行訪問和操作的, io裝置也是通過埠號進行區分的
外圍裝置和中斷請求, irq, interrupt request. 就是終端當前執行程式,轉到其他程式執行的必要機制
中斷機制, 可以讓程式快速響應各個任務,由於cpu執行速度較快,臨時中斷然後任務切換, 處理完成後再切換回去也很快,對外來說可能都是無感知的應對外圍裝置狀態變化外圍裝置的中斷請求會使用不同於io裝置的埠其他編號,稱之為中斷編號
輪詢,太消耗資源dma中斷,比較合適,相當於主動發起請求,cpu響應即可
就是外圍裝置資料直接載入到記憶體,不經過cpu轉換vram類似的, gpu目前也支援直接從固態硬碟載入資料到視訊記憶體中,不需要經過cpu
計算機發明出來就是幫助人類解決問題,而最終極的問題就是替代人類工作並思考–ai
計算機本身沒有思考能力,但可以通過訓練,讓計算機能夠在某些場景下像人類一樣進行問題處理.這就是機器學習和人工智慧.
注意這裡,只是表現得跟人類一樣,並不代表具備了真正的思考能力例如人分辨乙個動物是貓還是狗,其實就是提取了各種資訊, 而計算機也可以通過訓練,達到人類多少百分比的分辨能力,甚至可以超出人類的分辨能力
只不過,人類其實最厲害的就是學習和適應能力,製造工具能力. 而計算機目前要達到電影中的替代人類,還有很長的路要走,甚至永不可能達到.
《程式是怎樣跑起來的》筆記
章節摘要 備註總結 對程式設計師來說 cpu 是什麼 cpu 內部由暫存器,控制器,運算器和時鐘四個部分組成 有些 cpu時鐘部分在外部 程式啟動後,控制器從記憶體讀取指令和資料 程式儲存在記憶體中,cpu來執行 對程式設計師來說 cpu 是什麼 cpu是暫存器的集合體 程式是把cpu作為暫存器來描...
讀《程式是怎樣跑起來的》
我們開始學習程式設計最先接觸的是vb,因為vb比較容易看到成果,簡單的 就可以實現好玩的功能。我們有邏輯,並用這種高階語言表達出來時,計算機是怎樣處理的呢,計算機內部是如何儲存傳遞資料的,讀了 程式是怎樣跑起來的 感覺以前寫的 更生動了,可以在你眼前跑來跑去了。本文先來介紹cpu是什麼。cpu 處理...
《程式是怎樣跑起來的》讀書筆記
一本比較適合對計算機零認識的人看的科普書,因為很簡單,我們快速讀完,並完成了這篇測試筆記,該筆記提取了我們認為值得了解的要點。目錄第 6 章 親自嘗試壓縮資料 第 7 章 程式是在何種環境中執行的 第 8 章 從原始檔到可執行檔案 1 通過 dll 檔案實現函式共用 2 通過呼叫 stdcall 來...