計算機只是邏輯電路
除了電路還是電路
計算機就是一堆邏輯電路
他並不知道你到底想要干什么,他也不會理解什么是文件,什么是進程
通電的瞬間,就好像你打開開關,燈泡發光一樣
所有的一切都是通過通電來啟動的 start the world
計算機某些部件,具體到比如某個門電路,有電流通過
這個電流就是0或者1 進而會觸發一系列內置的電路導致更大的模塊進行電路的通斷
他不知道你到底要干什么
只要電源不斷開,那么就會有心跳,有心跳就會持續的讀取指令
指令也不過就是一塊固定格式的電路連接(或者是讀取ROM)
將一堆輸入線路的電壓轉換成另一種形式的輸出
輸出有可能連接着其他的電路模塊的輸入
所以他會永遠的運行下去
只是恰好有了二進制數學,二進制數學又與邏輯建立起來數理邏輯
數理邏輯又跟邏輯電路是相通的
那么我們就可以理解為這堆邏輯電路可以代表着我們想要實現的二進制計算
其實電路仍舊是電路
試想一個問題
軟件到底是如何控制硬件的?
你可能會想到,軟件是用高級語言編寫的,高級語言被翻譯成匯編語言,匯編語言會翻譯成機器可以是別的機器語言
這樣計算機就可以執行了
但是到底是如何控制的?
之所以說軟件控制硬件
是不是因為計算機程序作為計算機硬件的輸入,然后計算機硬件看似可以理解為經過計算之后,可以得到輸出?
看似是這樣子的
但是到底是怎么控制的呢?
如果這么想我感覺想不通,軟件怎么能控制硬件呢?
如果換一種思維方式或許更好理解
其實跟上一個圖是一樣的,但是思維方式不一樣
此處把計算機硬件作為中心,不是說你把程序輸入,而是計算機硬件 讀取了計算機程序 然后經過處理,產生了輸出
看似一樣的不都是計算機程序作為輸入 經過計算機硬件產生輸出嗎
其實差別非常大
上面的圖,你可能會理解為軟件控制硬件,但是軟件如何控制硬件?根本就沒有辦法控制
下面的圖是硬件控制硬件,通過你告訴的方式(計算機程序) 我經過一系列的電路的通斷,我產生了指定的結果,因為我本身就是一直在操作電路,硬件自然會產生變化
想一下計算機的啟動過程,通電之后,是不是有了心跳之后,就不斷地在執行運算,讀取指令譯碼執行等等
最初啟動的還不是硬件么
所以,個人理解
對於計算機來說,不存在軟件控制硬件
而是硬件 讀取了你給出來的指令 控制硬件
軟件不過是存儲起來的指令,整個計算機只是邏輯電路和等待執行的指令
電路上電之后,跟隨頻率不斷地執行指令,軟件就好像是一個無限的紙帶,紙帶上布滿了指令
計算機就這么一條條的不嫌累的執行着,軟件只不過是人機交互的方式而已,計算機永遠是那個計算機,你操作不了她
計算機重要的思維方式
這幾個思維方式看似簡單,但是卻融入到無數的編寫規范設計思維里面了
抽象 封裝 接口 規范 解耦
抽象將復雜物體的一個或者幾個特性去掉,抽取他們共性的部分,這就是抽象
比如操作系統管理硬件資源,IO設備抽象為文件
比如下圖,他們都是形狀
抽象的形式是統一
抽象的目的是簡化
既然是去掉個性,保留抽取共性,所有的共性組合在一起也就是統一了形式
這種統一后的形式就是一種由各個共性的點組成的一類意識形態上的新事物
這個新事物就共性來說,與原有的事物放到一起進行抽象得到的抽象結果還是這個抽象后的事物本身,對吧
說起來繞口,其實就好像再說杯子和玻璃杯 瓷杯都是杯子一樣,雖然這么說有點別扭
所以抽象的形式是統一,得到一種意識形態上的新事物
這些共性的點,對於抽象后的新事物是他的特性
但是這些特性不是具體的
在計算機的世界里面,抽象過后,還必要要實現,計算機不懂得自然語言也沒有任何思想
負責抽象的人必須要提供具體的實現
比如操作系統把IO設備抽象為文件,那他就把共性的讀寫訪問方法提供出來,假設是 read 和 write
不管到底是磁盤還是磁帶,read就是讀取內容,write就是寫出內容,到底是怎么實現的,調用者不需要關注
所以抽象最終的目的就是簡化
簡化后你不用再關注IO設備具體是什么,哪個廠家生產的,使用了什么技術(去掉的特性)
也可以說是屏蔽了底層的實現細節
屏蔽的近義詞可以說是封裝,把底層的實現細節封裝起來,提供統一的訪問形式
封裝后提供統一訪問形式,也就是提供統一的接口 就像上面提到的read write方法
接口可以理解為對接的端口 就好像電腦上預留給投影儀使用的十五針VGA插口一樣
既然形式上完成了統一
訪問形式上也完成了統一
那么這就相當於一種規范化的形式
所以規范和接口 又有近似的意思
都可以理解為一種約定好的協議,約定好的形式,一種規矩,規矩就可以做到完全的解耦
接口提供訪問的具體形式,但是不提供細節
規范指導實現的最終目的與要求,但是不提供細節
有了封裝,規范,接口的概念,也就很大程度的完成了解耦
完成了解耦很多時候就可以把問題分層的處理對待
TCP/IP的分層概念就是如此,每一層封裝上一層的信息
層與層之間按照約定的規范協議進行對接,各司其職,各層做各層的事情
這樣既可以不再一條道走到黑,就好像你回家可能走幾分鍾坐公交然后坐地鐵一樣
這些概念
抽象/封裝/接口/規范/協議/屏蔽/分層
貫穿了計算機整個的發展
抽象->統一形式->提供統一接口,進而隱藏底細節實現,從而簡化了訪問
抽象->統一形式->提供統一規范,進而可以解耦獨立發展,而且還能夠無縫對接
這兩種模式最為常見
其實提供統一接口一般是指個體
如果是一個生態鏈(技術鏈)上所有的個體,都設定好了指定形式的接口
這就是規范了,有了規范,就很容易出現技術體系
編程語言的發展是不斷地屏蔽底層,不斷地進行封裝
面向對象的程序設計語言中大多數時候你都在做抽象,事物抽象成類
面向接口的編程就是調用者與實現者進行解耦,通過接口進行對接
虛擬機規范只提供要求設計思路,但是不提供具體的實現要求,廠家可以自行定制
虛擬機規范提供了字節碼規范,和虛擬機規范,相當於規定了輸入和輸出
只要按照規范的字節碼都可以運行在虛擬機上正確運行,同樣的字節碼也必然有一致性的結果
servlet規范讓servlet和servlet容器各自獨立發展,縱然它們相互依存