讀這三本書是因為自己對知識逐漸有了一個一點點的了解之后決定的。最先想學習pring的相關框架,在看了兩本相關的書籍之后發現自己並不能獨立的查看Spring框架的源碼,因為自己沒有弄清楚javase的基礎模塊,比如securityManager,Class,properties等,發現自己應在先了解jvm,但是在准備看jvm的時候又發現自己對基礎的計算機基礎也不太清楚,這就引出了矢澤久雄的三本書。
這確實是三本非常棒的書,《計算機是怎樣跑起來的》,《程序是怎樣跑起來的》以及《網絡是怎樣連接的》。三本書基本可以看作現代計算機的通識,對我的啟發非常重要。
下面根據這三本書描繪一下自己構建的框架:
部分高級語言的作用流程(例如C):
- 應用程序 -->解釋-->匯編 -->CPU
java語言作用流程:
- 應用程序 -->編譯 -->虛擬機 -->解釋+編譯 -->winAPI+匯編 -->CPU
服務器的作用流程(省略協議棧部分內容表示):
- socket --> accept --> 如果沒有可連接套接字,啟動監聽直到接收可連接套接字 -->收發數據 -->刪除套接字
其中不管我們使用的是那種高級語言,最終起作用的始終是作用到CPU上。其中CPU便是各語言的基礎,也是共同的部分。在此需要中間插一句,window,linux系統的公共API接口,在各種語言的開發上起到了非常重要的作用。
這里主要介紹一下java的作用流程。開發出來的源程序經過編譯生成.class文件,編譯是一門比較龐大的知識體系,其復雜程度以至於專門設立一門學科,大概也就窺見一般了,當然這是逐漸演化的結果,最初也是較為簡單。我們不對每一步做過多的探究,它主要的過程就像我們看英語一樣。主要了解其中幾大步驟 :
- 詞法分析 -->詞義分析 --> 語法分析 --> 語義分析 --> 優化語言 -->生成目標語言
經過編譯成的二進制文件作用在虛擬機上,這個虛擬機有一點需要提及一下。網上有一些容易引起誤導的說法。虛擬機就像字面的含義,虛擬的機器,它模仿計算機划分內存區域,生成虛擬機棧。很多說法就是在這個概念上容易誤導人。虛擬機也可以看作一個程序,經過解釋+編譯最終作用在CPU上。一個完整的工業虛擬機並不是用一種語言完成的,大部分C,C++也還有其他語言。它的具體的設計框架我下一階段需要學習的。這個虛擬機很多都是調用winAPI(window)。
CPU是由控制器和運算器構成,其中有大量的寄存器在協調運行,從單片機,plc開始CPU的流程就大體確定,這幾十年也還遵循着這個規律,但是功能可能會發生巨大變化,其中大體流程:
- 取寄存器 中存儲 地址 -->獲得 指令 + 數據 分別存放在寄存器中-->cpu的控制器讀取指令 -->運算器執行數據
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
從馮諾依曼計算機開始到現在已經發生了巨大的變化,但是其運行的核心並沒有變化,都是以控制器和運行器為核心,輔以內存和輸入輸出。現代window計算機應該也是在其基礎上開發出來圖形界面,將展示信息存入內存,通過GPU渲染。
系統最開始是由監聽的需求引出的,發展到今天已經是一個龐然大物。
之前我以為算法和數據結構是運算器和虛擬機的定義的,這是一個大坑,它們都是由語言寫的。甚至a++這種語句,也都也已說是一種算法,只不過這種算法實在是非常簡單的一種,像二叉樹,紅黑樹,Btree,B+tree等都是算法。數據結構也沒有那么高深,它的概念也是較為寬泛一點,就像我們java中定義的domain類也是一種數據結構,但是像stack,queue等常聽到的它們都是在數組的基礎上,通過邏輯演化而來的,更像是在數組之上的概念。
xml,html都是文本標記語言,它們的解析方式也都是需要事先定義好模板,按照模板來解析,xml的模板主要有兩種xsd,dtd。在spring框架中之所以能成bean對象就是事先定義好xsd的文件了。html有一個預編譯的名詞來形容,但是不管怎樣,都是有事先定義好的模板。它們的解析方式和普通的文件的解析方式很象,就那么幾種SAX,DOM,JAXP等,我看spring就是sax的方式。
計算機中雖然都是二進制數據,但運算並不是完全按照二進制做加減乘除操作的,最重要的原因是負的小數的除,導致並不能簡單的使用位左移和右移。java中double類型做分母並不會報錯,都可以正常運行的原因就是它采用的雙精度和補碼運算。