15PB實地培訓學習筆記系列 DAY 1

Day 1

前言

學校的學習安排都是在上午進行講課,下午和晚自習都是學生自己進行復習和研究。所以以後寫博客可能大概的時間基本上就是晚上了吧。晚上剛好也有大量的時間可以來總結和歸納今天遇到的一些坑和講課內容。

今天的主要學習內容是“幫我複習知識”,大概講的就是計算機的一些基礎,一些計算機理論。前面雖然講過之前我有從事編程的行業好幾年,但是還有是很多的基礎我發現我記得也不清楚。所以還有有必要在以後的學習中好好學習,畢竟給我們上課的大佬老師們經驗肯定會比我更豐富,要是老師說的我都會了, 那豈不是我就可以去當老師了??? 哈哈哈哈, 開玩笑。

本着負責任的想法,還是有必要將今天上課講的一些東西在這裏再重新複述一遍,好記性不如爛筆頭,從腦子裏面再過一次會對這些基礎的東西理解會更加深刻。

概括

那麼,這裏來負責從頭開始整理老師講的內容。今天講解的主要內容其實不牽涉到編程語言的學習,主要是對計算機結構的一個學習,從最初始的計算器,到後來的可以自動處理邏輯的計算機。再到爲什麼要使用二進制,爲什麼不用十進制等問題。以及各個進制之間的轉換。聽起來很簡單哈,但對於我們班上大多數轉行來學習安全的同學這簡直就是噩夢。而且對於我來說雖然很多的東西聽起來就是在複習,但是實際上我發現還是有很多的點並沒有完全吃透。

很感謝發現了電的某位偉大科學家(記不住這位科學家的名字),讓我們現在能夠享受現在的電腦,電視,手機等等電子產品。當然在第一臺電腦ENIAC之前就只有計算器,雖然計算器看起來簡單,但是計算器的電路發明也不可謂不偉大。見識了兩種模型:

  • 第一種模型是使用兩根輸入電線和一根輸出的電線,兩根輸入的電線通過改變電壓的方式來改變輸入的值,最終在輸出電線上看最終的輸出電壓來確定運行的結果。不過這樣一來使用的電壓需要定義非常多不同的電壓來表示不同的數字,而且一旦數字太大,那麼對應的電壓也會越來越大,這樣就會特別的危險。(電擊警告)
  • 第二種模型實際上是第一種模型的優化版本,它有非常多根電線作爲輸入端和一根電線作爲輸出端;多根輸入端每一根的都代表了數字的不同位數,然後給每一根輸入定義有限的幾個電壓就能描述非常龐大的數字。據說這種方案几乎被採用作爲計算機的核心模型。不過該模型在不同的環境中可能會存在電壓不一致的情況,因此此方案最終被棄用。
  • 第三種模型其實就是現在的開關電路模型。因爲第二模型可能在不同的環境中出現不一致的情況,所以最終就使用這種穩定的開關模型,即電路連接爲1,斷開爲0來進行表示。(至少不存在開關斷不開的問題吧)

當前以上的模型只是實現了計算器的功能, 還沒有實現現代計算機具有邏輯處理的功能。因此在後面有大佬就着手解決了這個問題,設計出了邏輯電路,即AND,OR, !。這個AND,OR,和非就是我常用的C語言裏面的邏輯||,&&和!,只是沒想到原來在CPU內部其實是通過這個邏輯電路來實現的。以此得出CPU內部存在邏輯電路,和運算電路。不過他們官方名字叫做運算器和控制器。

此時,此處開始放上馮諾依曼的計算機體系,運算器,控制器,內存,輸入設備,輸出設備。因此CPU是由運算器和控制器組成。內存即爲RAM(隨機讀寫存儲器),RAM是易失性寄存器,裏面的數據在電源斷開之後數據就會丟失;鍵盤、鼠標、麥克風,攝像頭等屬於輸入設備;打印機,投影儀以及顯示器等爲輸出設備。

二進制

二進制跟隨開關電路而產生,很顯然開關電路中,電路的狀態只有開與關的,即開爲1,關爲0,那麼要表示更大的數字也只能都是用0和1來進行表示,因此2進制就產生了。和自然計數阿拉伯數字10進制(0~9)一樣,逢10進1,二進制就是逢2進1,但是如果使用二進制來表示自然界的數字的話,這些數字會特別難記而且冗餘,因此就需要將2進制轉換成10進制。

2進制轉10進制,例如: 1110 0011 = 1 x 2^0 + 1 x 2 ^1 + 0 x 2 ^ 2 + 0 x 2 ^ 3    +   0 x 2^4 + 1 x 2 ^ 5 + 1 x 2 ^ 6 + 1 x 2 ^ 7 == ?

10進制轉2進制則使用10進制數整數部分以整除方式除以2得到每次計算的餘數,最終當商爲0時,則將得到的餘數從下往上進行組合就得到2進制的對應值。

八進制和十六進制

八進制和十六進制數是2的整次冪,因此八進制和十六進制可以採用“劃位一一對應”的方式來進行轉化,這裏就不列出具體的步驟了。

 

原碼、反碼和補碼

關於原碼、反碼和補碼的作用,在上課之前我一直有非常大的疑惑。爲什麼會有反碼和補碼???以及原碼到底是啥?不過今天才真正瞭解到他們真正的作用。原來在CPU的計算單元裏面並沒有存在減法運算單元,只有加法、乘法等處理單元(到底有沒有除法運算單元不知道)。

因此只能用加法的方式來處理減法運算,那麼減去一個數,其實就相當於加上它的負數。因此需要首先算出被減數的補碼,此處如果被減數爲正數,則他的補碼爲原碼本身;此時減數爲負數,那麼就先算出減數的反碼, 然後再加1算出,算出減法的補碼,然後使用被減數的補碼加上減數的補碼就能計算得到一個數,當然這個數自然也還是補碼,首先將這個補碼減1得到反碼, 然後再取反得到原碼。由此減法單元完成。

編程語言

編程語言的話更形象的理解爲可以讓計算機理解的代碼;這些代碼只讓計算機進行識別和執行的。不同的CPU類型相當於地球上不同的人,不同國家的人說的話不一樣,因此都有不同的語言,當我們需要和語言不同的人進行溝通的時候, 需要先去學習對應這個國家的語言,只有學習了他們的語言才能和他們正常的溝通。但是基於機器的機器語言複雜度比較高,不容易記憶更不容易被識別。因此機器指令便有了方便理解的助記符---彙編語言;彙編語言就是和機器語言之間的直譯結果。每一條機器指令在某種類型的CPU上是一一對應的。但是在後續的發展中,採用彙編語言來進行編寫還是仍然具有很高的難度。指令太多,不容易調試,因此便有了更高級的語言(比如C語言、C++語言等等),高級語言的本質就是人類語言和機器語言的一個緩衝語言。人類用人類能理解的話編寫機器能翻譯識別的話。當然在這中間有一個翻譯器(編譯器)來負責將和人類接近的話翻譯成機器能識別的話。這邊是高級語言。

高級語言分爲編譯型的語言和解釋性的語言。當然編譯型的語言就是C、C++一類的語言,爲什麼說是編譯型的呢。因爲C、C++編譯器在編譯的時候指定了本次程序要運行的平臺,以及本次程序要求的CPU的指令集,他和特定的某種機器是息息相關的,因此也稱之爲編譯型的語言。解釋型的語言常見的就是Java,JavaScript,Python,Go, Lua,C#等等需要在目標機器上運行的時候才進行解釋和運行的語言。因爲解釋型的語言具備跨平臺等優點;因爲目標電腦上已經有一個針對這個電腦結構和系統的解釋器,然後這個解釋器針對已經翻譯好的語言進行解釋執行;因此解釋型的語言的執行速度一般較慢,主要還是因爲要解釋某一條指令需要花上額外的更多的指令和時間來完成。

 

結語

好了,今天的第一課的內容差不多就是這樣。其實貌似還有更多的細節並沒有寫上,如果有讀者看到我寫的地方有誤,還請幫忙指正,感激不盡。

 

持續更新中...................

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章