今天又是喝咖啡學習系列,不過不是學程式,而是學電腦科學。筆記內容包括上、中、下三門課。
這門課看了下內文其實就是計算機概論,有點令人懷念的一門課…想當初算二進制算到超挫折的 XDDD 不過怎感覺這篇不是在寫讀書筆記,而是重寫了一次課程?很多東西它沒提到,是我自己忽然想到其他關鍵字就一併寫進去了 XDDD
codefree time(圖片來源:這段歷史算是電腦史中的遠古史吧,想當初我好像是從馬克一號學起的?不是鋼鐵人那個馬克一號,是哈佛大學的 ASCC MARK I,等等看課程有沒有提到吧。
鋼鐵人 Mark I(圖片來源:電腦史大致可以劃分成真空管、電晶體、積體電路、超大型積體電路四個時期。但查理.巴貝奇(Charles Babbage) 所設計的分析機並不屬於這幾個時期,硬要歸類的話它是第零代的機械時期吧?所以我才會戲稱它是遠古史 🤭
嚴格說來,巴貝奇並不是發明第一台電腦的人;但他所設計的分析機,卻是後世電子通用電腦的先驅,也因此他才會被尊稱為電腦之父。但與其說是電腦之父,倒不如說是通用電腦之父可能會比較精準,畢竟歷史上可以當電腦它爹有好幾位呢,再不然電腦之祖父(?)可能也會更貼切 XDDD
「電腦之父」巴貝奇(圖片來源:既然提到電腦它有好幾個爹了,我就整理一下它的親爹名單:
查理.巴貝奇(Charles Babbage):通用電腦之父
就是前面提到的那位,這邊不提了。
艾倫.圖靈(Alan Mathison Turing):電腦科學之父
這位大家應該也很熟,尤其是資工系的同學應該都對他又愛又恨?像是圖靈機、圖靈測試,還有圖靈獎都跟他頗有淵源。
約翰·阿坦那索夫(John Vincent Atanasoff):電子電腦之父
這位大神是第一位用真空管做出電子電腦,也第一台電子電腦的發明者,這部電腦在日後被稱為阿塔納索夫-貝瑞電腦(Atanasoff–Berry Computer,ABC 電腦)。其它特點還有只能解線性方程式、使用二進制…等。
約翰·馮紐曼(John von Neumann):現代電腦之父
這位大家有很不陌生吧?傳說中的馮紐曼模型,這是現代所使用的電腦的基礎!理論上等等課程中應該會出現…如果沒出現…那就…沒出現吧 XDDD 不過應該很難跳過才對。
它這邊真的打算從機械時期說起…而且還是由齒輪帶動的機械開說起…剛好補一下我的遠古史 XDDD
滾輪式加法器,又稱帕斯卡計算器。由法國數學家布萊茲·帕斯卡(Blaise Pascal) 於 1642 年發明,用於協助父親算帳,但我看過另一個版本是為方便自己算帳而發明的。果然懶,才是推動世界發展的真正動力 XDDD
帕斯卡計算器的設計利用齒輪及槓桿原理,在其包含了一組相連的齒輪,只要在上面撥動數字,齒輪之間互相轉動後便會算出累加後的值,再顯示於小窗口上。
課程)
帕斯卡計算器(圖片來源:是說,數學家跟帕斯卡這個組合讓我感覺很熟悉,查了下著名的帕斯卡三角形果然跟他有關。另一個跟他有關的則是壓力單位帕斯卡 (Pascal, Pa) ,這個單位也是為了紀念他所命名的。
在 1673 年時,德國人萊布尼茲(Gottfried van Leibniz)在研讀了帕斯卡的論文後,決心將加法器升級成有乘除的功能步進計算器。
步進計算器中有一連串的齒輪,每個齒輪有十個齒,表 0 到 9,每當一個齒輪轉過 9,它會轉回零,並同時讓旁邊的齒輪前進 1 個齒;做減法時,則是反向運轉;至於乘除,則是運用了累進的加減的概念!
不過這兩個版本的計算器都有相同的問題:造價太高、需求太少。
課程)
步進計算器(圖片來源:是說這位萊布尼茲也是個狠人,除了有句:「讓優秀的人浪費時間算數簡直侮辱尊嚴」名言外。他最廣為人所知並讓莘莘學子都對他咬牙切齒的功績就是—微積分!他是微積分的創始人之一,現今所使用的微積分符號也都是他的版本。
前面兩項發明嚴格說來是方便的計算工具,但仍不算電腦/計算機(computer)。由電腦構成的三要素(硬體、資料與軟體)來看,它既不能儲存資訊,也無法儲存指令並重複執行。
第一台引入這兩個要素的機器,是在 1801 年由法國人約瑟夫.傑夸德(Joseph Jacquard)為了織布而製造的自動織布機。它可用打孔卡片來記錄織布的圖樣,讓機器根據打孔卡孔的有無來控制經線與緯線的。
課程)
自動化織布機(圖片來源:這台自動織布機為電腦的發展引進兩個重要的觀念:
所以嚴格說來,約瑟夫不僅是自動織布機的發明者,也是程式設計的發明者。
看到這標題,我第一個反應是…電腦終於要有電了嗎 XDDD
而巴貝奇的設計要來到 1823 年,他首先設計了用來解多項式差分機,由英國政府補助出資研發。雖然差分機被證實理論上可行,但最終因財政、製作延宕、故障頻率與私人因素…等,導致巴貝奇失去了政府的金援。
說到製作延宕,就必須提到巴貝奇的三心二意,不僅經常朝令夕改,還常常開新的支線任務,才會導致差分機的製作一延再延。而在他的支線任務中,最有名的就是分析機。在這部機器包括輸入裝置、處理機和計算器、指揮工作和計算順序的控制單元、儲存裝置、輸出裝置等五大部門,這正是後來設計電腦的構想。
課程)
差分機與分析機(圖片來源:說到分析機,就必須提提愛達·奧古斯塔(Ada Augusta),她為分析機寫了假想的程式(虛擬碼?),因此被認為是世界第一位程式設計師。挖屋~祖師爺欸!
愛達勒芙蕾絲 197 週年誕辰(圖片來源:真正進入商用的時期,則是赫勒里斯(Herman Hollerith)的打孔卡片處理器,他採用 Jacquard 的打孔卡片原理,使穿過孔的細棒構成一個電路來計算,這項發明也使得計算器的機械時代移轉到電器化時代。
早期的打孔卡片處理器是為人口普查而設計,因此僅具備加法器的功能;後來經過改良整合萊布尼茲的步進滾筒,使知能完成四則運算。
課程)
打孔卡片處理器(圖片來源:他有成立成立一家名為「製表機器公司」(Tabulating Machine Company)的公司,並於 1911 年與另外三家合併為「計算—製表—記錄公司」(Computing-Tabulating-Recording Company,C-T-R)。這家公司也是大有來頭,它在 1924 年更名為國際商業機器公司,英文名稱 International Business Machines Corporation,也就是我們現在熟知的 IBM。
電腦的發展始於 1944 年,從繼電器做簡單四則運算,一路演進至今。依其組成的元件可以將電腦的演進過程分成:真空管、電晶體、積體電路、超大型積體電路四個時期。
喔,1944 年就是哈佛大學的 ASCC MARK-I 被製作出來的時間點,它是台電氣機械式的電腦,使用了 3,000 個以上的繼電器(Relay)和多量的齒輪,被認為是第一部通用型電腦,也是第一部被實作出來的全自動電腦,無須人為介入。相比同時期的電腦可靠不少,因此被認為是現代電腦時代的開端。
維基百科)
真實存在的馬克一號 XDDD(圖片來源:普遍認為最早的通用電子電腦,是在二戰期間賓州大學的莫奇來(Dr.John W.Mauchly)博士和他的學生埃克特(J.Presper Echert)因應美軍要求,設計用來計算砲彈彈道的 ENIAC。
ENIAC 是第一部以真空管取代繼電器的通用電子電腦,設計上總共使用了 18800 個真空管,總長 50 英呎,寬 30 英呎,總佔地 1500 平方英呎、大約 42 坪,且重達 30 噸。換算下來這台電腦大約是一間半的教室大、六隻大象重,現在應該很難想像有這們龐大且笨重的電腦。
它的計算速度在當時算快,每秒鐘可以做 300 多次乘法運算或 4500 次的加法運算。但由於它的所有的程式都是由機械碼撰寫、是以硬體上的變化做為依據,因此在運算過程中會產生大量的熱量、不易冷卻,同時消耗大量電力。除此之外,真空管的損耗率也極高,每 15 分鐘就可能燒掉一支,且操作人員須再花 15 分鐘以上找出壞掉的管子進行更換,使用上極為不便。
是說,現在家用電腦,每秒鐘都能達到 10 的 8 次方以上整數加減乘除的速度…
課程)
ENIAC(圖片來源:另一個小趣聞是,ENIAC 是在 1946 年 2 月 14 日發表的耶!不虧是工程師,情人節還是跟電腦作伴,還顛覆世界了呢!是說,它是為二戰設計,但 1946 年二戰應該結束了吧?
在 1973 年以前,ENIAC 普遍被認為是第一台現代意義上的電子電腦。但是在 1973 年時,美國聯邦地方法院註銷了 ENIAC 的專利,認定 ENIAC 發明是從 ABC 電腦那裡繼承了電子電腦的主要構件思想。因此,ABC 電腦被認定為世界上第一台電子電腦,而這台 ABC 電腦,就是我們之前提過阿坦那索夫在 1937 年所發明的。
不過嚴格說來,ABC 並不是台圖靈完備的電腦,也沒能實現儲存程式結構,更不具備通用性,就這幾點看來 ENIAC 完勝只能解線性方程式的 ABC。
然而,這 ABC 電腦中的 3 個關鍵仍是現代電腦組成的一部分:
前面雖然把兩者相比較,但有趣的是,ENIAC 其實跟 ABC 電腦很不一樣。例如:在 ENIAC 中,還是使用十進制來計算,而非二進制,這是兩個剛好互補嗎?我的缺點是你的優點,你的缺點是我的優點 XDDD
ENIAC 的另一個致命缺點,就是它是使用機械碼,換句話說它必須依靠重新接線、切換開關的方式來切換不同程式。即便它計算迅速,但每每更換程式,就得花半天的時間,嚴重拖累整體效能。
因此,數學家馮紐曼(Dr. John Von Neumann) 提出程式必須儲存在記憶體的重要概念。程式可用打孔卡片編寫,再輸入到記憶單元中儲存起來,如此便可輕易更換不同程式,又不會影響運作速度;但若要將程式儲進記憶體中,這表示程式必須與資料一樣都是二進制的儲存方式。
記憶體中的程式與資料(圖片來源:喔對,把程式獨立出來的概念並不是由馮紐曼提出,而是圖靈提的圖靈機(Turing Machine);馮紐曼提出的是程式儲存在記憶體的概念。
記憶體中的程式與資料(圖片來源:故此,在 ENIAC 之後完成的電腦,如:離散變量自動電子電腦(英語:Electronic Discrete Variable Automatic Computer,EDVAC)、電子延遲存儲自動計算器(英文:Electronic Delay Storage Auto-matic Calculator、EDSAC),這些電腦在開發時都採用馮紐曼模型(Von Neumann model) 來建構,因此它們的硬體可分成四個子系統:記憶體、算術邏輯單元、控制單元及輸入/輸出。
馮紐曼模型(圖片來源:1948 年美國貝爾實驗室的科學家約翰.巴丁(John Bardeen)、華特.布拉頓(Walter Houser Brattain)和威廉.肖克利(William Shockley)共同發展出電晶體,這項發明給一般的電子應用帶來極大的變革。
此時期的電腦其電路板都裝有磁芯記憶體和獨立的電晶體,電晶體的大小只有真空管的二十分之一,使電腦的體積更小、重量更輕;且耗電量、散熱量減少、故障率也直線下降。
這個時代除了電晶體的應用外,高階程式語言也發展出來了。感謝這發明,讓我不用真的得跟機器打交道,我硬體學的超差的 XDDD
課程)
電晶體(圖片來源:在 1958 年傑克.基爾比(Jack Kilby)和羅伯特.諾頓.諾伊斯(Robert Norton Noyce)都發明了以矽為材料的積體電路(IC, Integrated Circuit)。
隨著半導體積體電路的出現,各家廠商陸續投入研發,直到 1964 年,IBM 公司正式推出成功以積體電路研製的 IBM SYSTEM-360 型電腦,從而宣告第三代電腦時代的來臨。在一片比 1/8 英吋還小的晶片上,包含了幾百個電子元件,使電腦體積更加的輕巧,而且計算速度又快了幾百倍。
除此之外,相較前兩個時代,其耗損率又進一步的下降,大約使用 3300 萬個小時後,才可能發生故障,進一步壓低了成本。
課程)
積體電路(圖片來源:是說,這篇筆記到此提到的人物都是一時人傑,像傑克.基爾比這位是 2000 年諾貝爾物理學獎得主,另一個小趣聞是他在 1998 年首次訪臺時獲得交大的榮譽博士學位;另一位羅伯特.諾伊斯則是英特爾的共同創始人之一。
1975 年,超大型積體電路(VLSI,Very Large Scale Integrated Circuit) 被完成,這是以積體電路改良而成。密度更高的超大型積體電路,能在一片晶片中可以裝進數萬個電子元件,體積比第一代電腦小了百倍,計算速度卻快了千倍。
以超大型積體電路所製造的電腦,就是現在的個人電腦(PC,Personal Computer)。而延續超大型積體電路而發展的微處理機,更可實際應用於日常的每一種機器上,如:微波爐、冷氣機、音響、電視、洗衣機等等。
課程給了張演進史,方便一覽電腦的演化:
課程)
電腦的演進史(圖片來源:一般在找資料時前文所提到的四個時代是公認,之後的第五代與第六代電腦似乎就有些待定了。
第五代電腦被提到機率對半,我想這是因為它跟前面幾代的變革方向不太一樣,第五代電腦在 1982 年被日本科學家定義屬於人工智慧(AI,Artificial Intelligenec)的時代,感覺是偏向軟體上的突破,或是應用上的改變。當然硬體也是有所突破,但卻不像是之前的是全新的一種技術,而是偏向製程的革新,所以以這個的角度不將它歸入似乎也合理?
至於第六代電腦我在多數的電腦演進史都沒看到,但有在部分詞條是寫生物電腦(Biological Computer / Biocomputer),我還以為會是量子電腦(Quantum computer)哩。不過看了看資料,不管生物電腦還量子電腦都是發展中的的技術,究竟哪個會先進入商用成為一個新的時代,這還有待觀察。
據說,因為人類有十根手指頭,所以人類記數時是採用十進制;而電子的訊號只有開跟關兩種狀態,因此在記數時是採用基底為二的數字系統。
題外話,我之前想過人有十根手指,但我所能表達的數其實有 11 個吧?也就是 0、1、2、3、4、5、6、7、8、9、10,那為什麼用不是 11 進制?我同學說是不是 0 太年輕了(0 的概念是較後來才出現的),所以在算的時候忘了算它?笑死我了,妳當作是點名的時候太矮沒算到嗎? 🤣
不過說真的,搞不好真的跟 0 的概念出現較晚的原因有關。 🤔
剛剛提到電子的訊號只有開(1)跟關(0) 兩種狀態,而在單條電路上的開關狀態被稱為 1 個 bit,這也是電腦可以儲存的最小單位,若是表達複雜的訊息,則會需要更多的電路、表示更多位元,這也就是二進制雛形。
二進制是一種滿 2 進位,基底為二的數字系統,所以只有 0 和 1 兩個數字。跟我們常用以十為基底的數字系統,每進一位就是多乘 10 一樣,在二進制系統中,每進一位時就是多乘 2。
所以下圖中 1001
與 1100100
的計算則是:
課程)
十進制與二進制(圖片來源:八進制和二進制雷同,數字符號為 0、1、2、3、4、5、6、7,是逢 8 進位的。
所以下圖中 144
的計算則是:
課程)
十進制與八進制(圖片來源:可別搞混二進位制與八進位制的規則喔!請問用八進位制表示 100 怎麼表示呢?
不用算,第一個選項如果是八進制,光 就超過 100 更別提 。
舉一反三,十六進制就是逢 16 進位的系統。但一般數字只有 0 ~ 9,因此 10 ~ 15 會使用 A ~ F。
我們知道二進制是電腦用的數字系統,所有的輸入都會被轉換成一連串二進制的指令;但必須說,二進制並不是一個有效率的數字系統。以 1024 來說,我們用十進制來表示時只需要 4 位元,但用二進制時卻需要 11 位元(),這打到後面少了幾個 0 可能都沒發現吧 XDDD
所以,當我們要輸入相關設定時,習慣上會將 4 個位元轉化成十六進位制,像我們習慣的色碼 #FFFFFF
,就是常見的十六進位應用!
課程)
進制對照表(圖片來源:接下來介紹介紹一些常見的進位制轉換規則。
將一個數分成整數與小數兩部分來討論:
整數
在轉換整數的時候是用除法,將整數/欲轉換進位數,一直除到商數為 0 為止,最終再將餘數逆向取出。用短除法的話,就是由下往上。
計算示意如下:
轉換十進位整數計算示意(圖片來源:實際計算就是做短除法啦,不過計概課本這邊的把計算過程打橫了,所以可能看起來會有點不太習慣。一開始黑底的數字是十進制的 ,除以 得到商 和餘數 ,一路向左計算,最終得轉換結果 。
顯示如何把 35 轉成二進位(圖片來源:小數
至於小數部分是使用乘法,將小數*欲轉換進位數,乘積的整數位保留,小數位繼續運算直到為 0 或是位數足夠時候,最終再將整數依序取出。
計算示意如下:
轉換十進位小數計算示意(圖片來源:因為這例子沒有整數部分,所以不考慮它了,直接看小數部分。黑底的數字 ,乘以 得乘積 ,故保留 、 繼續向下計算,一路向右運算,直到為 0 或終止運算,最終得轉換結果 。
顯示如何把 0.625 轉成二進位(圖片來源:把轉換來源的每個位元乘上它的以基底所得出的位值,最終將每個位元的計算結果相加,即可的得到十進位的結果。
其他基底轉換成十進位(圖片來源:所以下圖八進制的 轉回十進制的計算則是:
課程)
八進制 1144 轉十進制(圖片來源:十六進制的 的轉換計算則是:
課程)
十六進制 1144 轉十進制(圖片來源:16 為 2 的四次方,所以在進行二與十六進制互轉時是以 4 個位元為一組。以小數點為基準,分向左右兩邊,以 4 個為一組進行分群,若整數不足 4 位則前面補 0,若小數不足 4 個位數則後面補 0。
二進制與十六進制轉換(圖片來源:以 轉換為例,首先把二進位數以 4 個位為一組作整理:、 、 、 、 ,左右兩邊不足 4 位數的補零變成:、 、 、 、 ,然後將各組轉成十進制分別是 、 、 、 、 ,再換回十六進制就是最終答案了 。
課程)
二進制 111010011.101 轉十六進制(圖片來源:至於十六轉二進制,核心概念也是 4 個位元為一組。當一個十六進制數轉成二進制表示,若不足 4 位數則要在該組前面補 0。舉例來說, 要成二進制, → 、 → 、 → ,最終結果為 。
布林代數是處理數位邏輯的代數運算式,用來表示是或不是,在實際電腦中會以 1 和 0 來表示。
這邊舉個例子,網頁要檢查你現在是不是點擊叉叉關掉了頁面,此時會有兩種可能:
不過實際運行時,整個系統是多工處理,可能會同時檢查好幾件事,並根據這些事件來做出反應,這時就會用到邏輯閘/邏輯運算了。
一樣是按叉叉的例子,網頁想要知道你是不是同時點擊了叉叉和重新整理這兩顆鍵,因為它想要崩潰給你看 XDDD。這時它需要做幾件事:
用來釐清所有條件之間的關係,檢查兩個事件是不是都成立,就是邏輯閘的工作了。這些布林代數或者說是 0 和 1 ,在經過不同的閘時會產生出不同的結果。
最常用的邏輯閘可歸納為 8 項,最基本的 4 個分別為 NOT、 OR、 AND、 XOR,另外的 NOR、 NAND、 XNOR 則是前述的反向結果,最後 Buffer 緩衝器在這邊先別管它,因為它是起到緩衝或強波的作用,並不會對布林值的輸出有任何的變化。
松山工農)
8 個基本邏輯閘符號(圖片來源:如果我要「電腦隨時檢查你是不是同時按了叉叉和 F5 這兩顆鍵」,需要使用到下列何者?
其實兩個應該都要用到才對,但它是單選題 =____=
NOT Gate,中文叫做反相閘,又稱為反相器(Inverter)。不過在記邏輯閘名稱的時後,我沒用過中文啦,一來是當初考試都是英文、二來寫程式的時候也都是英文或符號居多,至於最後一個原因等等你們看到其他閘的中譯就知道了…那絕對會亂掉的!
NOT 是 7 個邏輯閘中,唯一一個一元運算子,它的工作就是負責唱反調,你說 True 它就回 False,反之你說 False 它就回 True。就好像你說你有妹妹的時候,內建 NOT Gate 的鄉民會回答:「其實你沒有妹妹!」就是這個意思。
最後附上一張精美的真值表(truth table)。喔,真值表就是定義了各種可能輸入與其輸出值的表格:
課程)
NOT Gate 真值表(圖片來源:從這邊開都是二元或是多元運算子。OR Gate 被直接翻譯成或閘,它的特性就是只有所有人都否決的時候,事件才會被否決;一旦有一人同意,事件則會成立。
舉個例子,依民法規定,如果妳想結婚,要嘛妳成年了或是妳的法定代理人同意,只要其中一個條件成立妳就可以去戶政事務登記了;不然妳未成年、代理人又不同意的話,那就只能從長計議…嗯…這個例子要成立的前提是妳有結婚對象了 XDDD
成年 | 法定代理人同意 | 結婚 |
---|---|---|
X | X | X |
O | X | O |
X | O | O |
O | O | O |
我們把例子換回符號,我們已經知道,否決表示不成立,記為 0、False;反之同意則為 1、True,因此其真值表如下:
課程)
OR Gate 真值表(圖片來源:NOR Gate,看文字就知道它是把 OR 跟 NOT 組在一起。因此其結果就是或閘被套了反相,只要所有條件都不成立時,事件才會成立。簡單易點的記法,我會先做 OR 再對 OR 結果做 NOT,這樣你只要熟悉前面兩個邏輯閘
舉個例子,如果你未成年、或是喝了酒,只要符合其中一項,按規定不能開車上路;如果你不是未成年、也沒有喝酒,那麼你就可以安心上路啦(嗯…安心上路…好像哪裡怪怪 XDDD
未成年 | 喝了酒 | 開車上路 |
---|---|---|
X | X | O |
O | X | X |
X | O | X |
O | O | X |
真值表長這樣:
課程)
NOR Gate 真值表(圖片來源:如果說 OR Gate 是只有所有條件都不成立時事件才不成立,哪麼 AND Gate 則是相反,只有當所有條件都成立時事件才會成立。
例如,只有當你成年且在該地住滿六個月才有投票權,如果你未成年或是住不滿六個月,那麼你就沒有這次的投票權。
成年 | 住滿六個月 | 投票權 |
---|---|---|
X | X | X |
O | X | X |
X | O | X |
O | O | O |
換回符號長這樣:
課程)
AND Gate 真值表(圖片來源:一樣 NAND Gate 就是 AND Gate 的相反。
舉例,在跟騷法規定中,只有當存在騷擾行為且是持續進行的情況下,行為人不符合無罪認定;若僅符合其中一項條件時,會被認定是無罪的。
通訊騷擾 | 針對特定人反覆或持續 | 無罪 |
---|---|---|
X | X | O |
O | X | O |
X | O | O |
O | O | X |
真值表:
課程)
NAND Gate 真值表(圖片來源:兩個輸入值相同,則輸出 0;若相異則輸出 1。
舉個真實例子,某次紅燈右轉被員警逮個正著時,這時員警問我想要未依交通號誌行駛的罰單、還是紅燈右轉的罰單,很明顯我只能選擇其一,即便我都不想要,而他也不能都開 XDDD
未依交通號誌行駛 | 紅燈右轉 | 取締成功 |
---|---|---|
X | X | X |
O | X | O |
X | O | O |
O | O | X |
我記得那次好像要了未依交通號誌行駛的罰單。因為兩張罰單的罰緩一樣,但號誌那張記一點,而紅燈右轉記三點,一次就用掉了一半的扣打,笨蛋才選這個。
課程)
XOR Gate 真值表(圖片來源:XOR Gate 的相反,當兩個輸入值相同,則輸出 1;若相異則輸出 0。
糟糕,這我真的想不到可以用的例子,有沒有誰要提供一個跟日常法律相關的例子 XDDD
課程)
XNOR Gate 真值表(圖片來源:奇怪,現在看來很簡單阿!我當初真值表怎麼背得半死的?
感到疑惑的女性(圖片來源:前面的章節提過,電腦中是以 0 和 1 兩個數字來儲存及表示訊息。而這個章節則介紹了編碼的概念,如何將文字與符號對應到 0 和 1 的組合上
使用位元樣式表示符號(圖片來源:ASCII code 跟 Unicode 大概是世界上最廣為人知的編碼之二。
它的全名是 American Standard Code for Information Interchange,中文翻譯為美國資訊交換標準程式碼。這套編碼用了 7 個位元來表示每一個字元,共可以表示出 個字元,數量雖不多但足以滿足英語系國家。在如今 ASCII 已被納入 Unicode 中。
ASCII 雖可滿足英語系國家的ㄒ但對於其他西歐語系,他們並非使用純英文表示的字元。因此後期發展出的 EASCII(Extended ASCII),就將 ASCII 閒置的首碼拿來使用,將其由 7 位元擴充為 8 位元,共計 256 個字元,擴充了許多符號、希臘或拉丁符號使用。
但這也導致新的問題,因為不同的國家有不同的字母,即便同樣採用 8 位元的編碼方式,但在 128-255 這段所代表的字母卻不盡相同,這也就形成了我們打開文件時所看的亂碼。
當然,對於我們亞洲語系而言,看到亂碼成因會更加的複雜。因為 EASCII 雖解決了部分西歐語言的顯示問題,但對其他使用符號更多的語言仍無能為力。因此他們被迫採用了更多的位元組(byte)來表示一個字元,比如說繁體中文常用的 Big5 ,2 個位元組表示一個字元,所以理論上最多可以表示 個符號。
題外話,當你在 Windows 當中使用記事本存檔時,看一下它所支援的編碼。那些 UT 開頭的跟等等的 Unicode 有關,課程還沒提到先略過不提,有趣的是第一個 ANSI 編碼。
它其實並不是某一種特定的編碼格式,在不同語系的系統中,ANSI 表示不同的編碼。在我的系統中 ANSI 其實是 Big5、在簡中系統裡則是 GB2312、韓文是 EUC-KR、日文是 JIS,而英文中的才是 ASCII。因為早期的預設編碼都是 ANSI,所以當你打開從不同的系統中取得的文檔時,才會出現亂碼的情況。
記事本存檔時所支援的編碼
Unicode,稱為萬國碼或是國際碼,它使用了 32 位元,因此可表達 種符號,編碼中不同的區段分配給不同語系符號來使用,最終為全世界所有的文字與符號都提供了一個唯一的數字代碼。
但嚴格說來,Unicode 是一個字元集,它將所有的文字與符號使用一個二進制數字進行編號,卻沒有規定這個二進制數字應該如何儲存。如果使用時,不進行任何轉換直接儲存勢必照成空間上極大的浪費。
舉例來說,在前文我們已得知,英文字母只需使用一個位元組表示即可,但若 Unicode 與 Big5 一樣統一規定,每個字元必須統一使用 2 個位元組來表示,這將導致每個英文字母的第首前位元組皆為 0,這些無意義的資料會造成儲存空間的浪費。更別說 Unicode 是有 32 位元、8 個位元組的,這會導致儲存多少無效資料?就算儲存空間按摩爾定律指數增長也不夠這麼花吧!
因此後來衍生出了多種 Unicode 轉換儲存方式,其中最廣為人知的是 Unicode Transformation Format (UTF)!
UTF-8 是目前使用最廣的一種 Unicode 的轉換儲存方式。其他實現方式還包括 UTF-16 LE、 UTF-16 BE 和 UTF-32…等。
UTF-8 最著名的特點就是可變長度的編碼,它採用 1 到 4 個不等的位元組來表達一個字元,這個變化與 Unicode 編號的有關,編號小的使用的位元組就少,編號大的使用的位元組就多。其中英文字母使用 1 個位元組表示,中文則用 3 個位元組來表示,因此與 ASCII 相容,但與 Big5 不相容。
下面是 UTF-8 編碼的範圍和對應的格式:
編碼範圍 | 編碼格式 |
---|---|
0x00-0x7F(0-127) | 0XXXXXXX |
0x80-0x7FF(128-2047) | 110XXXXX 10XXXXXX |
0x800-0xFFFF(2048-65535) | 1110XXXX 10XXXXXX 10XXXXXX |
0x10000-0x10FFFF(65536以上) 1 | 1110XXX 10XXXXXX 10XXXXXX 10XXXXXX |
我發現我剛剛在做前面章節筆記的時候,其實就用到這邊的內容了。這邊應該有都不太陌生,日常生活還滿常用到的,檔案大小幾 M 之類的。
bit(位元)
電腦中最小的儲存單位,以 0、1 來表示。同時它也是傳輸資料的基本單位,同一時間能傳達的位元數越多,代表資料傳輸的速度越快。
byte(位元組)
8bits = 1byte,也就是有 256 種狀態。電腦中通常以一個位元組來表示一個英文字母及數字,也就是剛剛提到 ASCII,至於中文字則看是走什麼編碼方式了,可能會用 2~3 個位元組來表示。
word(字組)
這單位日常表示中常用,但可能沒有被注意。字組指的 CPU 一次所能處理的位元數,因此會隨著系統而有所差異,日常說的 64 位元的作業系統,指的就是 CPU 一次所能處理 64 位元數,也就是說這台電腦的 1 word = 64 bits。
一般說來,字組長度較長的電腦,處理速度較快、主記憶體的容量較大、數值精度較高。
課程最後附了張電腦儲存單位表:
課程)
電腦儲存單位表(圖片來源:不過說實話,上面那張表只適用計算檔案儲存單位。你在買硬體時,其實走的是 SI 制或者說十進制(decimal)位元組,用的是 1000 下去換算,習慣上單位會標示成 KB、MB、GB、TB;而 Windows 系統在報告容量時,走個是二進制,顯示的數字單位實際上是 KiB、MiB、GiB、TiB。
維基百科)
電腦儲存單位表 1000 vs 1024(圖片來源:所以你以為你買 1T 的硬碟是買 1024 GiB,但其實只有 1000 GB。這也是你在某些網誌或討論區會看到諸如下列討論的原因:
是說,我在看資料的時候發現 Mac OS X 的檔案管理器是走十進制,而 Windows 是走二進制。我跟 Mac 不熟,所以這件事我還是第一次知道欸!所以我拿顆相同的硬碟,在 Mac 跟 Windows 上看到的數字是不一樣的?
還真的是哩,我看到賣硬碟的公司還在網誌提醒了這件事,還畫了對照表。難怪我會在 PTT(還是 Dcard?)看到有人驚恐的再問她在 Mac 的繪圖資料為什麼拿到影印店時檔案變小了 XDDD
硬碟大小在 Windows 與 Mac 的換算量(圖片來源:至於 Linux 那邊我沒怎麼注意它檔案系統用的十進制還是二進制,不過看上表應該是十進制的。因為通常我比較介意的伺服器上的空間,但沒伺服器 UI 阿 XDDD 所以一般我會用 df
搭配 -h
顯示 KiB、MiB、GiB、TiB,如果要看十進制的話就用 -H
:
df 搭配 -h 與 -H 所顯示的容量差異
Q:你曾在光華商場聽商人講得天花亂墜,卻因為不認識電腦而不知道如何抉擇嗎?
A:…我就算認識電腦,還能直接開規格,但我還是不知道如何抉擇阿…這其實跟認不認識電腦無關…應該只是選擇困難症吧。
這節是講解電腦構成。就外形而言,可以分為輸入(Input)、 主機運算(Process) 及 輸出(Output) 3大部分。
電腦外形構成(圖片來源:而就功能及理論上來說,電腦的硬體架構可分成五大單元:輸入單元(Input Unit)、 輸出單元(Output Unit)、 算術邏輯單元(Arithmetic & Logic Unit)、 控制單元(Control Unit) 和 記憶單元(Memory Unit);其中算數邏輯單元(Arithmetic & Logic Unit)及控制單元(Control Unit)可合併稱為中央處理單元(Central Processing Unit, CPU)。
基本上這就是前面帶過的馮紐曼模型,這個 70 年前就提出的架構仍是現代通用電腦的模型。
馮紐曼模型(圖片來源:馮紐曼模型的偉大之處,就是他通過抽象化的方式抓住了電腦的本質,你再怎麼變,也跳不出我定義的模型,任何事物都是從理論到實踐,理論要做的事情就是抽象抽象再抽象,抓住事物的本質。
負責將資料或程式讀入,並轉換為二進位傳送到記憶單元中。其作用相當於人的感官,負責接收訊息。常見的輸入單元有滑鼠、鍵盤、麥克風、光碟機、掃描器、繪圖板…等。
負責將處理過的結果,從記憶體取出,並轉換成可閱讀的文字、數字、圖形、音訊、影像…等。其作用相當於人的反應器官,將結果表現出來。常見的輸出單元有螢幕、印表機、喇叭…等。
負責儲存輸入單元送來的待處理程式或資料,等候處理或運算;同時處理完的的資料,也會放進記憶單元中,等待輸出或進一步的處理。
記憶單元又可分為兩類
主記憶體(main memory)
又稱內部記憶體,用來儲存處理中的程式和資料。可以分成兩大類 RAM 與 ROM:
隨機存取記憶體(Random Access Memory, RAM)
是構成電腦中大部分的主記憶體,也是平時所輸入的程式和資料所儲存的位置。具有揮發性,一旦關閉電源關閉,則資訊就會被清除,因此只能充當暫時性的資料存放媒介。
平常我們說得的加記憶體就是加這個,它的大小會直接影響系統的整體效能,至少會讓你能開更多的軟體或檔案 XDDD。
如果再繼續向下細分,依 RAM 的技術可在分成 SRAM 和 DRAM 兩大類。
唯讀記憶體(Read Only Memory, ROM)
看名字就知道,只能讀不能寫,一般出廠時就會將資料燒入。具備非揮發性,資料不會隨電源關閉而消失,因此被用來存放永久性的程式或資料,如 BIOS。
它跟 RAM 不同,與系統運行速度毫無瓜葛。它所直接影響的是能事先寫入更多的軟體或是更強大的系統,想像一下手機中的作業系統跟卸也卸不掉的隨機出廠的 App,就是寫在這裡。
是說,雖然 ROM 是為唯讀的,但你應該聽過刷機吧?它就是藉由重燒 ROM 來修改 ROM 中的資料,不過這需要借助特定的方法。糟糕,好久沒重燒 ROM 了,有點忘了該怎麼做了…想當初開發時一天得刷個 4、5 次機…。
輔助記憶體(secondary memory)
又稱外部記憶體,用來儲存暫時不用的大量程式和資料,以彌補主記憶體空間不足,當要使用才會從輔助記憶體讀入主記憶體中處理。如:硬碟、光碟等。
負責控制、協調電腦各單元的運作。會從主記憶體中擷取並解碼指令,並傳送控制訊號到其他單元,藉以指揮及監督每一個單元,並進行資料的傳遞。就像人體中的大腦,負責發出指令。
總覺得,課程的分節有點奇怪,它竟然把控制單元跟記憶單元放一節,而不是跟算術邏輯單元歸在一起?會這麼說是因為,控制單元及算術邏輯單元兩者都是 中央處理單元(central processing unit;CPU) 組成的一部分。
CPU 的組成架構(圖片來源:CPU 應該是還滿常聽到的一個詞?它是電腦的大腦,是個極為複雜的晶片電路,主要用來執行儲存在記憶體的程式指令,控制著數位資料的處理及運算。前者很明顯是上一節所提過的控制單元的職責,而後者則是這節的算術邏輯單元的工作。
算術邏輯單元,顧名思義就是負責算術與邏輯運算。控制單元會將程式或資料由記憶單元送來,它會負責執行四則運算、比較運算與邏輯運算,再將結果送回記憶單元儲存。
此外,在 CPU 內部還有一個極小的快速獨立儲存裝置,稱為暫存器(register),是用來暫時存放運算過程中的資料或程式,依照保存資料的不同可以再分成不同的暫存器,如保留算術邏輯單元中間計算結果的資料暫存器、存放從記憶體中所擷取的多個指令的指令暫存器、以及記載程式中變數的程式計數器…等。
CPU 的組成架構(圖片來源:整個系統會在控制單元的操作下進行分工合作,它會控制各單元執行各別不同的任務,但又協調它們進行交換。
運作概述如下,在控制單元的操控下輸入單元會將資料或程式載入到記憶單元,並將程式指令進行解碼,如果指令需要運算,就會送到算術邏輯單元計算,再將結果存回記憶單元;當要輸出結果時,控制單元會將結果由記憶單元,傳送到輸出單元輸出。
硬體架構與資料流(圖片來源:這節在介紹跟 CPU 只有一個字母之差的 GPU。
圖形處理器(Graphic Process Unit,GPU)又稱為顯示晶片、視覺處理器,是常聽到的顯示卡中的核心零件。(顯示卡是 GPU + 記憶體 + 電路板 + 散熱器等的統稱)。
它是一種專門在電腦、遊戲機和一些行動裝置(如平板電腦、智慧型手機等)上執行繪圖運算工作的微處理器。除了單獨存在外,也可以內嵌嵌入主機板或 CPU 上,也就是我們所說的內顯。
除了遊戲影像和視覺效果的支援外,GPU 亦作用為平行處理器,加速資料的計算,這也是現今機器學習再次崛起的主因之一。
課程)
CPU 和 GPU 繪圖有什麼差異(圖片來源:是說,有人沒看過這兩圖的故事嗎?忘記是哪一年的 NVIDIA 請流言終結者來做的實驗,速度差距果然顯著,有興趣的可以去看看 NVIDIA 的活動影片。
CPU 與 GPU 的繪圖能力與速度上的差別: CPU(圖片來源: CPU 與 GPU 的繪圖能力與速度上的差別: GPU(圖片來源:這邊開始進入第二堂課,課程內容稍微雜了一點包含程式語言、作業系統、軟體工程跟人工智慧…等。我在上課的時候還稍微疑惑了下,當初上計概的時候有提到這些嗎?好像沒印象耶~!?結果翻開課本,我囧了還真有,而且還滿了筆記 XDDD
掃描目錄
電腦是由硬體和軟體所構成的系統,而軟體又可分成作業系統和應用程式兩大類。
作業系統(operating system,簡稱 OS)是介於電腦硬體與應用程式之間的程式,除提供了使用者存取硬體的介面外,也負責管理記憶體、系統資源供需的次序、輸入與輸出裝置、網路與檔案系統,簡而言之就是套管理硬軟體資源的系統軟體。
電腦系統(圖片來源:作業系統與硬體的關係緊密結合,針對不同機器會有不同的作業系統,比如行動裝置、嵌入式(如微波爐、GPS 等處理單一功能為主的裝置)與伺服器…等。他們會針對不同的應用需求與硬體管理,而衍生出不同的作業系統,如:Android 與 IOS、Windows CE 與 Palm OS、Linux 和 Windows 與 Mac…等。
個人電腦中的三大作業系統:
Microsoft Windows
微軟公司開發的個人電腦作業系統,前身就是 MS-DOS,整體市佔率高達九成。
macOS
以精簡的設計美學著稱,蘋果公司旗下的作業系統都以產品本身的名稱加上 OS 為命名風格。
Linux
三套中唯一一套開放原始碼系統,也是開源專案的最佳典範。目前多數廣泛使用的自由軟體都有與 Windows 平台版本和相應的 Linux 版本,例如:LibreOffice;部分流行的專有軟體也有相應的 Linux 版本,如:Google Chrome;也有些應用程式沒有 Linux 的版本,但通常可以找到類似功能的應用軟體。…對我來說唯一不能取代的大概就是遊戲了吧?
有人戲稱 Windows 是一般人使用;macOS 是有錢人(蘋果系列的產品都是高單價),或設計人使用;Linux 則是工程師專用。
是說,手機上的作業系統還有人不知道?
Android
非正式中文名稱為安卓,但我其實不太喜歡這個名字 XDDD。它是由 Google 公司收購同名公司後開發而成,被視為是 Google 跨足行動領域並邁向成功的一步。
作業系統本身是以 Linux 為核心的開放原始碼系統,因此任何人都可以使用或者開發其相關的應用程式,市佔率高達八成。是說,雖然 Android 是開源的,但它其實不是免費的 XDDD。有興趣的可以去找找他們的授權費的相關資料,前幾年因為歐盟的反托拉斯法鬧得沸沸揚揚的。
iOS
蘋果手機 iPhone 專屬的作業系統,承襲蘋果電腦的設計風格,與 Android 系統為手機市場兩大巨頭。
除了兩大龍頭外,也還有些小的作業系統,不過似乎都 GG 了,這邊就課程照貼囉~!
Windows Mobile / Windows Phone
微軟針對行動通訊產品開發的作業系統,市佔率低。後者為前者的繼承者,曾與 Nokia 戰略結盟,合作推出 Lumia 系列手機想抵抗安卓與 iOS,但依舊以失敗告終。
BlackBerry OS / BlackBerry 10
黑莓公司開發的封閉原始碼系統,專屬自家品牌黑莓手機,以高安全性著稱而一度吸引許多商務人士使用,但最終仍然不敵慘淡的市佔率與銷售成績,黑莓作業系統也將 2019 年底結束服務,轉向 Android。
Symbian / Meego
Nokia 公司旗下的作業系統,由於改革緩慢,在智慧型手機市場始終無法有所突破,最終放棄了這兩個作業系統,轉向 Windows Phone。
在找資料的時候看到幾張有趣演進。從圖中可以看到 2009 時,手機作業系統市場相當分散,黑莓機跟 Nokia 依舊是主流,Android 還被壓得出不了頭;但大約到 2013 之後,這些作業系統就幾乎被雙頭壟斷,兩者佔了快 80%。
手機作業系統市場份額變化(圖片來源:從 2017 年至今,市場的變化不大,仍舊是被 Android 跟 iOS 幾乎吃掉 99.8% 的份額,可以說市面上只剩兩種作業系統。是說…Android 原來贏這麼多?我還以為只有小贏而已。
手機作業系統市場份額變化(圖片來源:軟體即服務(SaaS,Software as a Service),廣義上來說,軟體服務是提供商會給一套軟體,讓你直接應用不需要再自己開發。課程這邊給的例子是作業系統的交付,個人覺得覺得這比較難以理解,主要是涉及作業系統本身的角色與特性,所以這邊就不用它當例子了。
因隨著網路的發展,現今最常見的交付方式是讓使用者透過網際網路和瀏覽器等媒介,以隨用隨付或訂閱制為基礎的方式取得所需軟體服務,最常見的如:電子郵件、日曆、Adobe 系列…等。
透過此方式,使用者無須購買、安裝、更新或維護任何硬體、中介軟體,即可以使用該軟體,且資料放在雲端,基本上只要裝置可以連網,幾乎可以從世界各地存取應用程式,是目前日常生活中最常接觸到的服務。
之前寫過一篇 〈雲端計算 IaaS、PaaS、SaaS 與 FaaS〉,有興趣的可以點擊過去看看。
課程)
傳統軟體服務與現代軟體服務比較(圖片來源:這章節其實就是在說 SaaS 的好處:
技術
無須配置軟體專業技術人員去維護,又能得到最新的技術。
資金
除了節省人力成本外,也無須再購買與維護機器。但會以改付「月費」來購買使用使用權,好處大概就是不用一次拿出大筆金額購買,緩解資金壓力。
儲存
資料儲存在雲端上,資料也不會遺失。因為這是把資料放到別人那裡去,所以這算好處還壞處就看資料敏感性?
降低風險
SaaS 通常會提供試用服務,可以降低不適用的風險。
簡單來說,就是不用更新或維護任何軟硬體、可隨時存取且有備援。
另外,全球近幾年來最有價值五間的公司,分別是:Apple、Amazon、Alphabet(Google)、Microsoft 及 Facebook,五間公司。
課程)
傳統軟體服務與現代軟體服務比較(圖片來源:電子設備可以分成硬體、軟體和韌體三個部分:
電腦架構(圖片來源:硬體 Hardware
簡單來說,你看得見摸得著的電子產品與零組件就叫硬體,例如電主機板、晶片…等。
軟體 Software
與硬體不同,軟體是用程式語言撰寫執行在硬體上的應用,看不見摸不著,例如:APP、網頁、Office、作業系統…等。
韌體 Firmware
介於軟體與硬體之間,特別指用來驅動硬體進行作業的軟體,主要是透過程式語言來操控硬體,像是控制主機板、晶片的驅動程式,或是電腦的BIOS。
那麼,這「三體」工程師有什麼差別呢?
課程)
三體工程師差別(圖片來源:硬體工程師
「懂電路!」相關科系以電子工程與電機工程為主,三者之中與「程式設計」的相關性最小,主要負責「開發硬體設備」,因此有人戲稱是「製造業」。
軟體工程師
「會寫程式!」目前需求最多最廣的職位,入行門檻相對低,也是非本科轉職的主要選擇,主要負責「寫程式讓硬體執行各種工作」,工作範圍在三者之中與提供消費者服務的關係最直接,因此有人戲稱算是「服務業」。
韌體工程師
「懂電路又會寫程式!」主要的工作就是「寫程式讓硬體『可以』執行各種工作」。由於韌體介於硬體與軟體之間,因此要成為一位韌體工程師需要兼具兩者的特質,除了熟悉硬體元件,也要熟練高、低階程式語言。
本文作者: 辛西亞.Cynthia
本文連結: 辛西亞的技能樹 / hackmd 版本
版權聲明: 部落格中所有文章,均採用 姓名標示-非商業性-相同方式分享 4.0 國際 (CC BY-NC-SA 4.0) 許可協議。轉載請標明作者、連結與出處!