# 電腦運作原理 ## 認識電腦 ### 電腦發明起源:夏卡爾織布機 ![](https://i.imgur.com/bKGYhrW.png) 西元1801年法國人約瑟夫‧傑夸德(Joseph Jacquard)發明使用打孔卡片(Punched carboard card)控制的自動化織布機,對未來電腦的發展引進兩個重要的觀念: 1. 資訊以打孔卡片的方式描述,這個動作稱為`編碼(Coded) 2. 資訊可以儲存在卡片上,當這些卡片成串的組合在一起,就可以做為一連串的指令,稱為`程式(Program)`。 ### 電腦發明演進 > 演進重點: > * 處理速度變快 > * 體積縮小 > * 程式開發語言:從機器語言越來越接近人類自然語言 1. 真空管時期(1946 ~ 1954) ![Photo courtesy of Penn Library](https://i.imgur.com/xHVn6zv.png =400x300) 1946年美國賓州大學發明第一台真正的電腦:Electronic Numerical Integrator And Calculator (`ENIAC`) 程式是以打孔卡片方式儲存,電腦會讀取卡片來執行運作。 2. 電晶體時期(1954 ~ 1964) ![photo via Ragesoss@wikimedia, CC License](https://i.imgur.com/DNZgzXW.png =400x250) 1950年代早期計算機的基本電路元件都採用真空管。這種元件有許多缺點,例如,大量發熱可靠性不高、佔用空間、以及速率不夠快等等;採用了電晶體改進了這些缺點 高階語言`FORTRAN`及`COBOL`是程式開發語言主流。 3. 積體電路時期(1964 ~ 1969) ![](https://i.imgur.com/r8EwRmp.jpg =450x400) 1964年後積體電路(IC.Integrated Circuit)的發明,使得電腦的速度又快了幾百倍。而且一個積體電路就可以容納數十個電子元件,一個電子元件的功能相當於一個電晶體或真空管,這樣一來除了使電腦的體積更小之外,功能也更強大。 開始使用作業系統,發展出`BASIC`、`RPG` 等高階語言來設計程式,讓電腦運作處理作業。 4. 超大型積體電路時期(1970~) ![](https://i.imgur.com/ZNcynMo.jpg =450x400) 1970年以後,在一片積體電路晶片(Chip)上已能容納數千個甚至數萬個電子元件,體積不是很大,但容量卻是大了數百倍,它被稱為超大型積體電路(very-large-scale integration ,簡稱VLSI)。 主要使用`C語言`、`PASCAL`高階程式語言來開發讓硬體運作的程式,對於應用服務程式,有更多種類程式語言慢慢流行。 ### 電腦的定義 電腦基礎架構 = `馮紐曼架構`(Von Neuman architecture) + `指令集架構`(ISA) #### 馮紐曼架構(Von Neumann) `馮紐曼架構(Von Neumann architecture)`,也稱馮·紐曼模型(Von Neumann model),是一種電腦設計概念架構。 ![](https://i.imgur.com/Yvlj1Vr.png =200x200) 此設計架構定義了電腦五大運作單元: - `算術邏輯單元(Arithmetic Logic Unit)`:從記憶單元中取得指令與資料,進行資料運算,其中`累加器(Accumulator)`作為暫時存放運算過程的區塊 - `控制單元(Control Unit)`:控制系統運作 - `記憶單元(Memory)`:存放資料 - `輸入單元(Input)`:輸入資料 - `輸出單元(Output)`:輸出資料 例如一台電腦,應該要擁有以下電子零件: 1. 算術邏輯單元:`CPU` 2. 控制單元:`CPU` 3. 記憶單元:`RAM`, `SSD`, `HDD` 4. 輸入單元:`鍵盤`(控制指令訊號)、`滑鼠`(控制指令訊號)、`麥克風`(聲音訊號)、`攝影機`(影像訊號) 5. 輸出單元:`喇叭`(聲音訊號)、`螢幕`(影像訊號) :::warning 關於記憶體的種類,RAM, SSD, HDD的差異與用途,請務必釐清 - 是否可以永久儲存資料 - 存取速度的快慢 - 根據特性,適合存放的資料類型 ::: #### 指令集架構 指令集架構(Instruction Set Architecture,縮寫為`ISA`),是電腦進行運算的程序方法,也就是設計電腦CPU的架構基礎。 常見的架構有兩種 **1. `CISC`(複雜指令集運算, Complex Instruction Set Computing)** 最知名的廠商為Intel,生產自家廠牌的CPU,又因為名氣很大,所以讓CISC後來又被稱為`x86架構`,主要相容運作的作業系統是微軟的`Windows`和蘋果公司的`macOS` **2. `RISC`(精簡指令集運算, Reduced Instruction Set Computing)** 最知名的廠商為Arm,所以把RISC架構稱為`Arm-based`,不過Arm不直接製造生產CPU,而是授權設計架構給其他IC公司設計生產製造,例如Qualcomm, nVidia,主要相容Google的`Android`和蘋果公司的`iOS` 目前我們所稱呼的電腦,是指符合以上硬體設計與指令集架構的電子裝置。 ### 隨堂練習 1. 教室的冷氣,是不是一台電腦?如果是,請說明其零件對應的電腦五大單元。如果不是,也請說明缺少了哪個運作單元。 2. 請舉例RISC架構CPU跟Windows搭配運作的3C產品 ## 認識程式 ### 什麼是程式 電腦執行各種作業的腳本,就是`程式(Program)`。 ### <a id="program_operation"></a>程式運作原理 1. 人類使用程式語言撰寫程式碼,這些程式碼文字,我們稱為`source code`,儲存在非揮發性記憶體中,例如硬碟、SSD。 2. CPU將`source code`取出,翻譯成`機器碼(machine code)`,然後放入揮發性記憶體,例如`RAM`,因為`RAM`的存取速度比較快。 3. CPU去剖析機器碼,區分`指令`與`資料`,根據指令,去操作運算各類資料,輸入、輸出結果,達成各種程式功能 :::info 補充知識:當載入資料量超過記憶體可承載資料量限制,我們稱為溢位(overflow) ::: ### 程式的種類 程式執行各種作業,根據程式作業的應用範圍,分為`韌體(Firmware)`與`軟體(Software)` #### 韌體 控制硬體運作的程式,這類程式又稱為`嵌入式程式(embedded programming)`,主要用途是讓硬體按照開發者的想法運作,例如手機裡有讓攝影機模組零件運作的`驅動程式(driver)`、讓驅動程式運作的`作業系統(Operating System, OS)` #### 軟體 讓使用者操作電腦的程式,又稱`應用程式(application program)`根據運作環境,又分成幾類 - 原生電腦應用程式(Native Application) 泛指在個人電腦作業系統(Windows, macOS, Linux)執行的程式,例如`Microsoft Office`讓使用者進行各類文書資料處理, `Adobe Photoshop`讓使用者進行數位照片編輯。 - 行動裝置應用程式(MobileApplication) 泛指在行動裝置(智慧型手機、智慧型手錶、平板電腦、智慧喇叭) 作業系統(`Android`, `ios`)執行的程式,例如`Line`可以讓使用者進行文字或語音的通訊。 - 網路應用程式(Web Application) 泛指在網路瀏覽器上(例如`Chrome`, `Firefox`, `Edge`等)執行的程式,從傳統的單向資訊網站、隨著技術進步,一路發展到可以讓使用者有更多接近PC、Mobile App的操作,又因為每個作業系統都有可以連上網路瀏覽資訊的瀏覽器版本。 所以Web App擁有跨作業系統(跨平台)運作的優點,例如`Google Map`,可以從 https://www.google.com/maps 登入執行,也可以在手機上用行動App版本執行,對於使用者,可以選擇自己適合的管道,使用地圖搜尋功能。 ![](https://i.imgur.com/9dNZgqS.png) ### <a id="programming_language"></a>什麼是程式語言 人類發明`程式語言(Programming Language)`來撰寫程式腳本,是我們人類跟電腦溝通的方式,根據不同的應用範圍與特性,發展出上百種程式語言,廣為人知的有`C/C++`, `Java`, `Javascript`, `Python`。 #### 程式語言分類 **1. 依階層劃分** 同時也是程式的發展演進,從`低階語言`到`高階語言`,越低階越接近機器運作的方式、越高階越接近人類認知運作的方式。 - 低階語言:`機器語言(Machine Language)`、`組合語言(Assembly Language)` - 高階語言:`C/C++`, `Java`, `Python` > 最終我們希望完全使用自然語言操作電腦,也就是:人類的語言系統 **2. 根據執行方式劃分** - `直譯式程式語言(Intepreted Language)` 系統可以將原始程式的指令逐一的翻譯並執行,不需要經過編譯,如`Python`、`HTML`等。特點是修改程式及除錯,較為簡單容易。 - `編譯式程式語言(Compiled Language)` 撰寫的原始程式,需要經過編譯器編譯之後,輸出為電腦中直接執行的目的程式,如`C`、`C++`、`PASCAL`...等。特點是再次使用只要執行目的程式,無須重新在編譯其原始程式。 **3. 根據設計方式劃分** - `結構化程式語言(Structured Programming Languages)` 結構化的程式是以一些簡單、有層次的程式流程架構所組成,針對「循序、條件、重複」三大訴求。例如: `C`, `BASIC` - `物件導向程式語言(Object-oriented Programming Language)` 具有封裝(隱藏)、繼承、多型三大概念的程式程式設計典範,同時也是一種程式開發的抽象方針。 它可能包含資料、屬性與方法。物件則指的是類別的實例。它將物件作為程式的基本單元,將程式和資料封裝其中,以提高軟體的再利用性、靈活性和擴充性,物件裡的程式可以存取及經常修改物件相關連的資料。例如: `Python`, `Javascript`, `C++` **4. 根據軟體與使用者和資料互動面向劃分** - 前端程式語言 可設計軟體使用者介面,讓使用者操作、取得資料輸出。 例如:`Javascript` - 後端程式語言 用來讀取、運算資料,傳輸到前端。例如:`Python`,`PHP`,`ASP` - 資料標記語言 用來描述資料,以便提高存取效率。 例如: `css`(描述網頁樣式), `HTML`(描述網頁資料格式與內容), `XML`, `JSON` ### 隨堂練習 請開啟[HACKMD](https://hackmd.io/),將本日課程內容整理成自己的筆記 ## 延伸閱讀 1. [Python官方文件 ](https://www.python.org/) 2. `RISC-V`:基於RISC設計原則的開源指令集架構 3. [設計嵌入式硬體 (Designing Embedded Hardware, 2/e)](https://www.tenlong.com.tw/products/9789867794789) ###### tags: `電腦科學概論`