布爾邏輯和邏輯門(Boolean Logic&Logic Gates)
說明
這次疫情在家有很多的時間,無聊之余在家刷了很多學習的視頻,其中有一套就是關於計算機科學的視頻
視頻地址
個人感覺這是一套很好的學習視頻,強烈推薦,不管是計算機從業人員,還是對計算機感興趣的人,相信學習之后都會又很大的幫助。
我是一名從事軟件技術開發程序猿,隨着計算機語言不斷的成熟,各種框架不斷更新,我工作的時候大多數時間都是和相對高級編程語言和各種框架打交道,一般都是用輪子,基本不會去造輪子,很少去從更底層的角度去了解計算機CPU和內存的工作基本原理,以及編程語言的基本原理等等。之前大學也簡單的學習過一些計算機的科學知識,但是基本都忘記的一干二凈了,所以決定要嘗試着搞清楚這些問題,很多時候不用造輪子並不代表不需要知道輪子的原理,所以才有了接下來的幾篇文章。
好記性不如爛筆頭,這是我前面時間的學習筆記,整理的一些刷這套視頻的筆記,但不是每一個視頻都有筆記,我只整理的我個人覺得有必要整理的內容
一.前言
相信很多人都想過這樣一系列類似的疑問,CPU是如何工作的?內存是如何工作的?CPU和內存是如何交互的?簡單易懂的高級編程語言是如何轉換成計算機可以讀懂的“0”,“1”的?為什么計算機用二進制來記錄和運算數據,而不用人類更容易理解的十進制來處理計算呢?......
搞明白上面這一系列問題,並不是一件易事,我想我們應該從計算機的大腦——CPU開始,說到CPU,我們應該不難會聯想到組成計算機讀寫和運算的最小單元——晶體管,CPU和內存的基礎物理結構都離不開晶體管,所以接下來的文章我們我們從最小單元晶體管開始,逐個探索並解答上面的一系列問題。
二.簡單了解晶體管
1.解釋說明
我們下面只是簡單的了解一些晶體管,注意這里並不是從硬件的物理結構去深入分析,只要知道晶體管有如下兩個特性:
特性1:
晶體管可以控制電流的開關的閉合來代表不同的信號,電路閉合,電流通過,代表“真”(也可以說代表二進制的1,這只是一個說法,隨便怎么說都可以),反之電路斷開代表“假”(0)
特性2:
晶體管由於它的物理特性可以產生不同的電流狀態(不同於電阻和超導體,半導體半導電的特性,可以更明顯的控制電流的強弱),不同的電流狀態可以當做不同的信號被識別
2.計算機為什么采用二進制?
了解晶體管的兩個特性之后下面來解答開頭其中一個的問題:計算機為什么采用二進制而不是十進制
理由一:
由於晶體管可以控制電流的多種狀態,早期一些計算機並不都是采用的二進制的,也有采用三進制甚至是五進制的,但是問題是狀態越多,電流信號越難區分,電子設備還可能受電池電量或者附近其他電子設備(如微波爐)的電噪音影響,從而無法正常工作,而二進制采用較少信號種類區分(0和1兩種電信號),可以較好的避免這種問題,最大的提高容錯率
下面兩張圖為兩種信號的區別:
很明顯二進制電信號容錯率最高
但這只是計算機為什么用二進制的原因之一。
理由二:
另一個原因是,數學領域有一個數學分之的存在,專門處理“真”和“假”,叫“布爾代數”,它可以很好的運用到了計算機領域,喬治布爾(George Boole)就是布爾二字的由來,他是以為十九世紀自學成才的英國數學家,在“常數”(我們的十進制數)代數里,我們可以直接對數字進行加減乘除之類的操作,但在布爾代數中,變量值是true或false,可以進行邏輯操作,布爾代數中有三個基本的操作:NOT,AND和OR。最主要的是布爾代數已經可以解決目前已有的所有數學法則和運算
簡單了解了“晶體管”,也知道了計算機為什么采用二進制,下面繼續拋出一個新的問題,“晶體管”是如何變成“CPU”和“內存”的,想要了解“CPU”和“內存”的構成,我們首先要了解“晶體管”是如何實現上面的三個基本操作的:NOT,AND和OR
三.簡單學習常規的邏輯操作:NOT,AND和OR
1.NOT門操作
NOT操作把布爾值進行反轉,把true進行NOT就會變成false,反之亦然
我們來畫一個晶體管,晶體管有三根線:兩根電極線和一根控制線
如下圖左邊那根是控制線,右邊兩根是電極線:
控制線通過調節自身來控制電流開閉,它的作用就像龍頭開關,可以給控制線的電流通電,右邊的電流也就可以從一個電極流到另一個電極。
我們可以把控制電流線當成輸入(input),底部電極當做輸出(output),如果我們打開輸入,輸出也會隨之打開,因為電流可以流過,反之!
我們用布爾術語來解釋上面:輸入為true,則輸出true,反之。下面是對應的“真值表”(真值表就是通過控制電路開關會發生的輸入輸出情況對應表,這里我要提醒一下,后續內容的每一個邏輯門,一定都要看明白這張“真值表”了再去看后面的內容)
上面這個電路沒有太大的實際意義,因為它的輸出和輸入是一樣的,但是我們可以稍加修改,就可以實現NOT門,我們可以在上面電極加一個根線,把上面電極輸出移到上面,如下:
這里可能你有點難以理解,如果打開輸入,右上角的電極為什么電流不會直接流向輸
出而是從下面電極流走呢?為了簡單的理解,我們不必去深入晶體管的物理原因,還是用生活中最常見的水管來舉例,由於地勢和水壓的差距,如果街上的大水管放水,水壓原因家里的水龍頭就沒水了。
如下面兩張圖:
2.AND門操作
AND門有2個輸入,一個輸出,如果兩個輸入是true,輸出才是true。下面是對應的“真值表”
對應的晶體管連接如下圖:
只有A,B兩個控制輸入同時打開,才有電流
3.OR門操作
OR門一樣也有兩個輸入,一個輸出,只要有其中一個為輸入為true,也輸出true,下圖為“真值表”
對應的晶體管連接如下圖:
上面AND門可以理解為串聯,而是OR門可以理解為並聯
4.將邏輯門抽象成為符號
我們在理解完上面三種邏輯門之后,為了能好的理解后面的知識,可以將三種邏輯門分別抽象成為三個整體如下圖,這種化簡為整的抽象思想我們后面會經常用到。
為了便於區分,
我們把NOT門畫成一個三角形前面小圓點表示:
AND門用一個“橢圓插座”表示:
OR門用一個“太空飛船”表示:
我們可以用上面這三種“符號”來表示他們,后面用來構建更大的組件時,就不會因為結構看起來太復雜而影響理解。
5.異或門(XOR)
除了前面三個,還有一個相對特殊的布爾操作叫做“異或”(XOR),異或的特點是輸入相同,則輸出false,反之輸出true,下圖為“真值表”
用晶體管實現異或操作有點燒腦子,也不便於我們去理解,所以我們可以用前面的三種門的抽象符號來實現異或門,異或門也有兩個輸入,一個輸出,如圖:
四張圖更直觀的表達了異或的四種情況
我們當然為了后面的理解,也可以把這個異或門抽象為一個整體符號,我們用一個橫着的“笑臉”來表示,如圖:
四.總結
上面我們把所有的操作門基本原理系統性的過了一遍,並把他抽象成為了一個整體,其實我們也不用太擔心異或門具體用了幾個其他門,也不用太在意其他幾個門又是怎么用晶體管拼接的,或電子是怎么流過半導體的,只是為了簡單的過一遍混個眼熟就好了,其實就是工程師在設計處理器的時候,也很少在晶體管的層面上思考,而是用邏輯門或者更大的組件,如下圖所示為設計圖的一小塊部分:
專業的代碼程序員更不用說了,也不會考慮邏輯在屋里層面是如何實現的。
我們只要簡單的把這些門的整體符號存入我們大腦的工具箱,以便於后面所講的知識會用到這些抽象的符號。