程式設計基礎

weixin_34413065發表於2017-09-26

1.為什麼要學習程式設計基礎

因為你首先是一個合格的程式設計師,然後才是一個合格的前端工程師

前提:一個程式設計師必須知道

  1. 硬體和軟體:計算機執行原理,參考書籍《編碼》(理解難度面向0基礎同學更友好),以及大學計算機相關課程,例如《計算機組成原理》,《計算機網路》等(最好有老師帶,自學有一定難度!)。
  2. 最大的軟體:作業系統
  3. 自己寫軟甲:資料結構和演算法
  4. 多人寫軟體:軟體工程

2. 前端工程師必知(自上而下)

  • 伺服器 :不論HTML/CSS,還是JS,資料來源都在伺服器中。
  • 瀏覽器 :HTML/CSS/JS 這三種前端主要語言都是執行在瀏覽器之上。
  • 作業系統:瀏覽器,不僅僅是瀏覽器,所有的軟體都是執行在作業系統之上。
  • 硬體:作業系統作為最大的軟體,執行在硬體之上。

3.常識:計算機如何儲存0和1?

3.1 為什麼計算機只能儲存0和1?

這其中涉及到很多硬體知識,簡單的來說,因為電腦是積體電路,記憶體微觀上是無數小開關,或者是小電池,而“0”和“1”正好分別代表“開”和“關”(或者是“通電”和“不通電”),就好像家裡的電燈開關只有開和關一樣。所以,電腦的本質決定了它必須是二進位制,只能儲存0和1.

3.2 計算機是如何儲存0和1?

計算機儲存過程,其實就是給小電池不斷充電的過程,因為小電池自身存在耗電(好比家裡的南孚電池放久了不用自己會消耗電量一樣)。

那麼,既然小電池自己會耗電,又要不斷充電,如何判斷它是的狀態是0和1呢?

規則是:當小電池電量大於50%,為1;電量小於50%,則為0。因為計算機的充電速率是納秒級(10^-9), 即一次充電過程為:重新整理 1次/10^-9s。

4.記憶體如何儲存數字?

上面我們說,計算機已經解決了如何儲存0和1的問題,那麼,我們如何儲存其他數字呢?

方法是將所有數字轉化為0和1的組合去進行儲存,這就是需要探究十進位制如何轉化為二進位制的問題。

  • 舉個例子:
1683063-38f93eaf89d198ab.png
圖片

4.1 儲存整數

如上:37 在十進位制上以10為底的方式得到結果過程:

37(10)
=3\*10^1+7\*10^0
=30+7

同理,37(10)也可寫作以2為底的方式得到:

37(10)
=1\*2^5   +  0\*2^4   +   0\*2^3  +   1\*2^2   +   0\*2^1   +   1\*2^0
=1   0  0  1  0  1

4.2 儲存小數

同理,對於小數也是一樣的道理,以1/10為底,過程為:

0.75(10)
=7\*1/10   +   5\*1/10^2
=0.7+0.05

那麼,以1/2為底,過程為:

0.75(10)
=1\*1/2   +   1\*1/2^2
=0.5+0.25

問題:如何儲存負數和小數點呢?

參考資料如下:

5.如何儲存字元?

方法:對所有字元進行編號,首先以十進位制的方式表示每個字元,最後都轉化為二進位制的方式進行儲存。參考:ASCII美國資訊交換標準程式碼

如圖:

1683063-a22bb847352361a9.png
圖片

如圖:如果你想儲存字母a,那麼就儲存97(10),對應進位制轉換為: a -> 97(10) -> 0110 0001(2) -> 61(16)

如果你想儲存數字1,對應進位制轉換為:1-> 49(10) -> 0011 0001 -> 31(16)

以上就是儲存鍵盤上簡單字母的方法。

6.如何儲存中文?

參考資料:GB 2312

1683063-2a0ce2cc61b805b2.png
部分圖片

  • 在國內使用字元為漢字,我們便在ASCII碼的基礎上進行擴充。GB 2312收錄了6163個漢字,同時收錄了包括拉丁字母,希臘字母,日文平假名及片假名字母、俄語西裡爾字母在內的682個字元。

  • 缺點:因為GB2312主要為常用字,不能滿足人們的需求。後來,為了儲存生僻字、繁體字、日語、朝鮮語等,微軟推出了GBK字符集

7.如何儲存所有字元?

  • 為了將所有字元都能夠在電腦上顯示,然而不同的字符集考慮到相容性問題,Unicode聯盟做了這樣一件事,他們將全世界的文字都編在一張表中。截止到2016年6月,累計128231個字元。(參考資料:Unicode

  • 缺點:因為 128231>216,所以Unicode必須用232來儲存。但是,也帶來一些問題:

原來使用ASCII字元編碼進行儲存時,只需要1個位元組即8位儲存就足夠,但是使用Unicode卻需要4個位元組即32位來儲存;

原來儲存一箇中文字元需要2個位元組即16位,使用Unicode後需要4個位元組32位儲存。這樣大大的浪費了儲存空間。


1683063-e06f1bd63eaa5b99.png
圖片

7.2 UTF-8的出現(UTF-8

因為採用Unicode儲存字元的方式大大的浪費了儲存空間,為了節省字元儲存消耗,使用UTF-8的方式進行優化,注意,這裡是對Unicode儲存方式進行優化,而沒有改變原有的字元編碼。

規定:對於字母例如字母 “a”,依然採用原來的一個位元組儲存,而不是4個位元組進行儲存,這樣就節省了3個位元組的空間;

而對於漢字,例如漢字 “你” ,依然使用原來的2個位元組進行儲存,但是,在上面的一大堆 0 和 1 中,計算機是無法識別哪一段表示字母,哪一段表示漢字,所以,又拿出一個位元組進行區分;

例如 圖中漢字 “你”:原本2個位元組儲存為:01001111 01100000 ,而轉換為3個字元儲存,表示為:11100100 10111101 10100000,第一個位元組的字首 1110表示這個字元長度為3,後面第2和第3個字元的字首都為10 是為了和前面所標誌的一致,而實際上這個字元的組成,是從第一個位元組的後4位、第二個位元組的後6位,第三個位元組的後6位所組成。

所以,計算機在讀取的過程中,當它讀到 0110 0001 時,它發現開頭沒有1,那麼就知道這是一個單位元組;當它讀到 11100100 10111101 10100000,發現前面有3個1,那麼它就知道這是由3個位元組組成,然後它就自動去讀取第一個位元組的後4位、第二個位元組的後6位,第三個位元組的後6位,拼湊成2個完整的位元組,表示漢字“你”

  • 切記: UTF-8 只是一種編碼方式,而不是字符集!

8.為什麼很多中文軟體喜歡使用GBK而不是UTF-8?

1683063-586433da4cb48778.png
Unicode和GBk發展史

之前我們說,Unicode字符集使用UTF-8的編碼方式更節省空間,而大家卻為什麼不用呢?考慮到兩方面因素:

1.發展史:當時在國內發明GB 2312的早幾年,微軟的GBK還沒有出現,大家習慣了使用 GB 2312 和 GB13000 ,而新出來的Unicode雖然全球統一,但是還不完善,沒有采用UTF-8的編碼方式。

之後GBK的出現,對原來的GB 2312更加優化,深受大家的喜愛。而到後來2000年出現的 GB 18030-2000 ,它統一和相容了GBK,但是90年到2000年初,代大家還是習慣性的使用GBK字符集。

2.國情:在當時的背景下,資訊相對比較閉塞,並不是什麼東西像如今Google一下就可找到,所以在國內90年代大部分軟體使用的字符集依然是GBK。

9.對前端的影響

1683063-0eeaf610250d6b1f.png

相關文章