《编码的奥秘》---学习编程一年半的体会
本人在校大學生,從大一下學期開始自學編程(JAVA)。到現在2018年7月2號也過了一年半的時間了。期間做過很多應用程序(PS:大多數都是做著玩的),比如做一個GUI聊天室(JAVA)、Android應用、Unity3D游戲(C#)、SSH整合開發一個WEB系統(完整版)等…雖然我這些都做過,但是…其中原理我卻了解甚少,比如說JAVA的虛擬機的內存釋放(垃圾回收器)、socket的連接過程(TCP三次握手以及四次揮手)、HTTP協議,這些東西我都不是很了解。
看過一篇文章,具體內容忘記了。說的是遇到一個解決數據庫連接太慢的問題,有三種人去解決。我只記得2種人,因為太有比較意義了。第一種是通過網絡抓包工具分析得到瓶頸,然后把問題解決了。另一種人是對這種數據庫的經驗已經很豐富,然后改了配置文件把問題解決的。當然在這個問題中,后者可以迅速的把問題解決,但是如果換了一個數據庫,也許第二種人就不知道該怎么解決問題了。(PS:本人就屬于第二種人,應用知道很多,理論懂得甚少。)這其實是非常不利于自己以后的發展的,IT新技術出來的太快了。自己也學過很多什么聽上去吊吊的技術,也搭建起來了,手機上可以訪問,一切正常。但是在這個過程中遇到的BUG基本上都是通過百度查找“得來”的答案。所以自己想了挺多之后,也是拿起來底層理論開始進行系統性的學習。最后這本書的博客只作為隨筆,說給自己聽,若有“有緣人”看到且看且珍惜吧。
編碼的奧秘全書總結
這本書很通俗易懂,跟看故事書一樣。從手電筒到ASCII編碼,從十進制到二進制再十六進制,從組合電路到8080芯片,從開關到控制臺匯編程序。這一個歷經過程寫的算是淋漓盡致了。
加法器
- 加法器
- 半加器(結果是xor,進位是and)
- 全加器(考慮低位進位)
半加器邏輯圖如下:
全加器邏輯圖如下:
用加法器實現減法的方式是通過原碼、反碼、補碼實現。
步驟是:
(PS:以上步驟針對于被減數大于減數的情況下)
同步計數器
D型邊沿觸發器和時鐘實現同步計數器(CP)
D型邊沿觸發器特性表(PS:上升沿有效,也就是上升沿的時候輸出取反,現態為0,次態則為1)如下:
邏輯圖如下:
波形圖(PS:圖片順時針旋轉90°就會得到0000->0001-…->1111的序列)如下:
RAM存儲器
得到8位鎖存器后。這樣就得到擁有4根地址線的16x1的RAM存儲器了。
D型觸發器特性表:
D型觸發器和寫入信號實現8位鎖存器:
通過3-8譯碼器選擇寫入數據,通過8-1選擇器實現輸出數據,得到8x1存儲器:
再通過2-1譯碼器,得到16x1存儲器
通過前面的實現我們可以得到一個方程:RAM陣列的存儲容量=2的地址線的根數
通過這個我們就可以用16根地址線跟8個數據輸入得到一個64Kx8的RAM
至于為什么是易失的,是因為繼電器的電源來自于給這個RAM提供電源的設備(我們在這里稱這個設備為總電源吧)。讀到后面會知道,現在的計算機的RAM不用繼電器,而是采用別的技術來實現,不過還是易失的就對了。
自動操作
接下來是自動操作。實現原理很簡單,我們用一個振蕩器來驅動一個16位計數器,計數器輸入到64Kx8的RAM從而讀取到RAM中的數據,最后再通過加法器跟鎖存器實現讀取RAM自動進行加法運算的操作。
不廢話。上圖:
發現燈泡亮的意義不大,改進這樣就可以將鎖存器的值通過在W=1時存入RAM中
到目前為止,我們一直“強調”著電路的實現。現在我們把這些實現當做細節忽略。
這里,我們定義幾個指令:
通過這4個指令就可以這一項操作,并且停止。
現在,我們將抽象的實現這個電路:
這個時候,我們只要把我們需要的操作存放到代碼的RAM中即可實現自動操作。
我們理解完高字節與低字節以及加法減法的設計后,我們又抽象出一個電路:
第一個鎖存器保存指令代碼,第二個鎖存器保存地址的高字節,第三個鎖存器保存地址的低字節。第二和第三個鎖存器的輸出組成了數據RAM 陣列的16位地址。
這個時候我們發現,用2個RAM太浪費了。可不可以只使用一個RAM呢?
由于我們已經知道每條指令都占3個字節,所以是可以的,只要在原來電路的基礎上做一點改進:
這樣,我們就可以通過控制面板向RAM寫入程序。此時PC計數器開始從程序入口地址開始計數,通過代碼和地址鎖存器的共同作用執行所編寫的程序。
到此為止,我們已經做出一個通過 計數器(PC) 就可以讓所編寫的程序自動執行。不過我們發現:我們該如何規定程序入口呢?再是當我們計算機開機的時候PC是從什么位置開始呢?所以,我們引入一個 jump指令,而PC從什么位置開始我們先不做回答(因為與本課程無關,答案是從BIOS的ROM開始執行)。
因為我們增加了一個jump指令,所以需要改進的是PC計數器的一個取值。如下:
通過這種設計,我們就可以更改PC的值。讓程序自動執行。(PC是一個振蕩器,這與RAM的W輸入不同)
到這里,我們的一個小型CPU已經被設計出來,而且這個CPU還與內存有著非常緊密的聯系。
從算盤到芯片
一個發展過程,不做闡述。
兩種典型的微處理器
8080和6800PC機。位數不同,一個8位,一個16位。我們知道8位可以通過轉換實現16位、32位、64位以及更高的的位數的處理。通過高低位字節實現。
8080是第三代微型處理器。8位。
6800是第三代微型處理器。16位。
由于每個不同的處理器都有對應不同的指令集,所以不做闡述。我們需要學習的是8086PC的指令集,一般匯編語言的教程都是用8086微型處理器,也是16位。
ASCII碼和字符映射
ASCII 碼是 7位 編碼。
Unicode 采用 16位 編碼,每一個字符需要 2個 字節。
這里是有歷史原因的。因為大多數國家用 7位 編碼都不足以存儲信息。所以每個國家都有自己的編碼集。
這樣會導致一個問題:在一個txt文本中既寫中文又寫阿拉伯文,而txt的編碼集設置為 GB2312 中國編碼集。保存后,讀取時會發現阿拉伯文變成亂碼。
于是Unicode出來了,將所有國家語言統一起來。此后又在Unicode的基礎上為了提高效率而提出 UTF-8 的標準。
總線連接
總線是提供給計算機中每塊電路板的數字信號的集合,這些信號可以分為 4類:
- 地址信號。這些信號由微處理器提供,常用來尋址RAM單元,也可用來尋址連接到計算機上的其他部件。
- 數據輸出信號。也由微處理器提供,用來寫入數據到RAM或其他設備。要仔細推敲輸入(input)和輸出(output)的含義。數據輸出信號是從微處理器輸出,變成RAM和其他設備的數據輸入信號。
- 數據輸入信號。是由計算機的其余部分提供,由微處理器讀入的信號。數據輸入信號通常來自于RAM的輸出,也即表示微處理器讀入存儲器內容。但是其他部件也提供數據輸入信號給處理器。
- 控制信號。由各種各樣的信號組成,通常與計算機的特定處理器的控制信號一致。控制信號可來自于微處理器或從其他部件傳送到微處理器。例如,微處理器可用一個控制信號來指示它要寫一些數據到某一存儲器地址。
這里的總線,并不是指地址總線、數據總線、控制總線,從數據輸入輸出的作用就可以看出。因為數據輸入可以來自于其他設備(如鍵盤,而不是單一從的RAM獲取輸入),會響應中斷信號。
從操作系統開始到圖形革命的內容自行理解吧~
總結
以上是生活随笔為你收集整理的《编码的奥秘》---学习编程一年半的体会的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RIP学习---网络工程
- 下一篇: 基础知识---汇编学习笔记