---
# System prepended metadata

title: '1.Introduction to Computers,the Internet and the Web'
tags: [學校門口大樹石頭下, 程設好難, 他的課就很好睡阿]

---

1.Introduction to Computers,the Internet and the Web
===

### **1.1 Introducion** 
- ~~簡稱幹話~~
- 大概的解釋：C非常的簡潔有力所以很適合沒學過或有一些基礎能力的人，C How to program和Eighth Edition是每一位讀者好用的工具~(偷偷打廣告ㄟ)~
- 程式碼可以在 www.deitel.com/books/chtp8/ 這裡下載
### **1.2 Hardware and Software**
- #### 1.2.1 Moore's Law
	- Def. Every year or two,the capacities of computers have approximately doubled inexpensively(積體電路上可容納電晶體數目約每隔兩年便會增加一倍)
- #### 1.2.2 Computer Organization~(P.36)~
	- <補充> 組成電腦五大單元：
			1.輸入單元(Input Unit)簡稱IU~(不是會唱歌的那個)~
			2.輸出單元(Output Unit)簡稱OU
			3.控制單元(Control Unit)簡稱CU
			4.記憶單元(Memory Unit)簡稱MU
			5.邏輯運算單元(Arithmetic & Logic Unit)簡稱ALU
			
	- ==Input unit(輸入單元)==：Example：鍵盤、觸控螢幕...等
	- ==Output unit(輸出單元)==：Example：監視器(俗稱電腦螢幕)、列表機...等
	- ==Memory unit==(記憶單元)：優點:速度快，可立即使用 缺點:沒電就沒用(揮發性)
	- ==Arithmetic and logic unit==(運算邏輯單元)：
		- 功能
		 	1.算術運算：加減乘除
		 	2.按位邏輯運算：AND OR XOR 補碼(2's complement)
		 	3.位移操作(課本未提到)
	- ==Central processing unit(CPU)==(中央處理器)：
		![](https://i.imgur.com/Fe95Ql4.png)
	- ==Secondary storage unit==：次級儲存裝置
	    - Example:DVD USB
### **1.3 Data Hierarchy(資料階層)**
用以說明物件大小層次的關係
![](https://i.imgur.com/PmtsNm8.png)

- ==Bits==：最小的資料單位
    - binary digit 的縮寫
    - Computer中最小的單位(有點像細胞)
    - 只用0和1做運算--**檢查位值、設置位值和反轉位值 (從1變0 或 從0變1)**

- ==Characters==:字元
    - 器官
    - 由bits所組成
    - character set(字符集):是所有字元的集合，用以編寫程序與表示數據。 （ex:Unicode,ASCII)
- ==Fields==：欄位
    - 器官系統
    - 由字元或bits組成
- ==Records==：紀錄
    - 人
    - 由數個有關係的Fields組成
- ==Files==
    - 人群
    - 由相關的records組成
    <Note>一份文件包含任意的資料與格式，在某些作業系統中，文件被視為字節的順序---文件中任何組織(例如將data組成records)都是被應用程序員創造出的視圖</Note>
- ==Database==：資料庫
    - 簡易的存取與操縱權
    - 最常使用的模式是relational database(關聯式資料庫-將data儲存於表格中(表中包含records和fields))
- ==Big Data==
    - 用來解決大量數據
![](https://i.imgur.com/hbr7Umo.png)

### 1.4 Machine Languages,Assembly Languages and High-Level Languages

- Machine Languages:
    - 電腦只懂自己的機械語言(最初的設計) 通常由一串數字所組成，指示電腦一次執行一個最基本的操作(特定的機械語言只能在特定的電腦上運作)
- Assembly Languages and Assemblers(組合語言)
    - 最接近機器語言的一種低階語言，屬於符號式語言。組合語言必須經由組譯器 (assembler)轉換成機器語言，才能在電腦上執行。
    - 使用組合語言編寫的原始碼，然後通過相應的組譯程式將它們轉換成可執行的機器碼。這一過程被稱為組譯過程。
    - Assembly languages：以類似英文縮寫作為基礎的語言

- High-Level Languages and Compilers
    - High-Level Languages(例如C)
        - 開發來編寫語句以執行大量任務
    - Compiler
        - 將高階語言轉換成機械語言
        - 原始碼（source code）→ 預處理器（preprocessor）→ 編譯器（compiler）→ 組譯程式（assembler）→ 目的碼（object code）→ 連結器（linker）→ 執行檔（executables）
- Intercepts (直譯式ex:python)
    - 可直接執行高階語言
    - 為了避免編譯時間過長而設計(雖然他跑得比編譯過的程式慢)
### 1.5 The C Programming Language
- C語言是從B和BCPL進化而來
    - BCPL
        - Martin Richards於1967年開發
        - 用於執行OS(作業系統)與compilers
    - B 
        - 使用BPCL語言的許多特點
        - Ken Thompson於1970在貝爾實驗室(Bell Laboratories)使用B開發出早期版本的UNIX程式
    - C
        - 1972年 Dennis Ritchie在貝爾實驗室創造
        - 從B語言演變而來
        - 最初作為UNIX的開發語言因而變得有名
- Built for Performance
    <這裡有些東西是我寫的，不是課本內容>
    - Operating systems(作業系統 簡稱os):
        - Example:Linux,Unix,Microsoft's Windows and Android.
    - Embedded systems(嵌入式系統)：
        - 需要快與減少內存(使反應時間最小化，可以理解成減少延遲)
        - Example：車子防鎖死煞車系統(ABS)，導航，智能家電...等 
    - Real-time systems(實時操作系統)
        - 用於關鍵程序(電腦中程式的優先級)
        - 通常以搶占式進行(強盜的概念 我要多少資源我直接搶過來)
    - Communications systems(通訊系統)
        - 集合電信網路，傳輸系統，中繼站，支流站與終端設備
        - 能越快傳遞大量資料到目的地越好(網路延遲)
- Standardization(標準化)
    - 製作標準C語言(就像秦始皇統一度量衡)
    - Def.明確且獨立於機器的語言
    - 1989年 該標準被承認為ANSI X3.159-1989
    - 1999年 標準更新，被稱為INCITS/ISO/IEC 9899-1999 也就是C99
- The C11 Standard
    - 於2011再次改版 也就是C11
:::info
>Portability Tip 1.1
>因為C是獨立且廣泛被應用的語言，通常可以在各種計算機上運行，幾乎不用修改
>[name=蜜蜂]
:::
### 1.6 C standard Liberary
- 幹話一篇，跟廣告沒兩樣，無聊再來看
- 大概內容:C由函數所構成，大部分的函數Library裡都有，學C有兩個重點：1.學C語言本身 2.學C函數的用法 
- (廣告)P. J. Plauger’s 寫的 The Standard C Library給有興趣專研的人，裡面講解如何執行與使用函數。
- 此書鼓勵用積木式創建程式，避免"重新發明輪子(俗稱多此一舉)"，使用現有部分(回收的概念)在進行C編成的時候通常會使用以下區塊 1.C標準函數庫2.使用者創建的函數3.其他人(您所信任的人)創建的函數，
- 好處：您會知道他是怎麼去運作的，可以自行檢查程式碼
- 缺點：浪費時間，創建、檢查、測試...等

:::info
>Performance Tip 1.1
>使用C標準函數庫裡的函數可以提高性能，因為他是精心設計過的
>[name=蜜蜂]
::: 
:::info
>Portability Tip 1.2
>使用C標準函數庫裡的函數可以提高可移植性，因為幾乎都可以在標準C裡執行
>[name=蜜蜂]
:::
### 1.7 C++ and Other C-Based Languages
- C++是由貝爾實驗室的Bjarne Stroustrup開發的
- Objective -C：以C為基礎的物件導向語言 
    - 1980年代先被NeXT收購，後來被Apple收購
    - 現為OS X系統與iOS設備(如iPad,iPhone)主要語言
- Java:
    - Sun Microsystems 於1991資助開發
    - 以C++作為基礎
    - 主要目標：編寫可以在任何計算機系統與控制設備的一套語言 有所謂的==一次編寫，隨處運行==
    - 被用來寫大企業的應用程式以增強Web 伺服器
    - Android 大部分也是用Java編成
- C#:
    - Microsoft主要是由三種語言編成
        1.Visual Basic(以Basic為基礎)
        2.Visual C++(以C++ 為基礎)
        3.Visual C#(以C++和Java為基礎，為了集合網路與網站到電腦應用程式而開發)
- PHP：
    - 一種物件導向且腳本開源的語言
    - 常見的Unix Linux Windows Mac都有支援
- Python：
    - 另一種物件導向語言
    - 1991年 由Guido van Rossum開發
- Javascript：
    - 目前最被廣泛使用的腳本語言
    - 主要被用於動畫與使用著互動
- Swift
    - 用於開發iOS和Mac應用程式的新程式語言
### 1.8 Objective Technology
(還是這裡冷靜一下 這裡好像不關C的事)

#### 1.8.1 The Automobile as an Object
 `小故事:假設今天你想要開車並且踩油門加速，在你開車以前，必須有人要設計出車子，通常車子都要有工程圖(就像房子有藍圖一樣)，工程圖包含加速踏板的設計，加速踏板背後藏有複雜的機械結構使他能夠加速，就像煞車踏板隱藏減速的機械結構，方向盤隱藏轉向的結構。` 
`你不能直接把工程圖拿來開(就像廚房的藍圖不能拿來煮飯一樣)，還需要利用工程圖去製造出車車，一輛完整的車車有一個油門可以加速，你以為故事結束了嗎? 車車不會自己加速 (他不知道現在有電動車嗎)所以，你要踩下踏板才能加速汽車。(全劇...幹還有)`

 #### 1.8.2 Methods and Classes
` 在程式中執行任務需要一種方法。該方法包含實際執行其任務的程序語句。它對用戶隱藏這些語句，就像汽車的油門對你隱藏了加速的機制。在物件導向的編程語言中，我們創建了一個稱為class的program unit來容納一組執行類任務的方法。`
` Example：ATM上有deposit(存錢的方法)，withdraw(提款的方法)，check account balance(查詢餘額)。在概念上就有點像車車的油門、煞車、方向盤...等。`
#### 1.8.3 Instantiation(實例化)
` 有人先根據工程圖製造汽車，然後你才能開車車，必須先構建一個class的對象，然後程序才能執行以下任務類的方法定義。這樣做的過程稱為實例化。一個對象是然後被稱為它的class的一個實例。`
先冷靜一下:CRY:

### 1.9 Typical C Program-Development Environment
:::warning
IMPORTANT 
:::
C通常由幾個部分所構成：程式開發環境、C 語言、C標準資料庫(圖書館)
![](https://i.imgur.com/Ek9twgQ.png)
- C 程式通常要經過六個階段才能執行。
    1.編輯(edit)
    2.預處理(preprocess)
    3.編譯(compile)->.o
    4.鏈接(link)->.exe
    5.加載(load)
    6.執行(execute)
#### 1.9.1 Phase 1:Creating a Program
- 階段一包括編輯文件，這階段是通過編輯器來完成
- 利用編輯器輸入一個C程式，需要時可以進行修改，然後將它儲存在二級儲存裝置(如硬盤)。
- C程式文件結尾應有 .c作為結尾
#### 1.9.2 Phase 2 and 3 Preprocessing and Compiling a C Program
- Phase 2 Preprocessing:
    - Preprocessor會在開始編譯前自動執行，依據程式碼中 # 所標示的指示 (preprocessor directives)，進行代換或插入等動作。例如：#include <stdio.h> 告訴編譯器在未編譯程式之前，先將程式庫中的標頭檔 stdio.h 插入該位置。
- Phase 3
    - Compiler將程式碼編譯為目的碼(object code)
    - 當編譯器無法識別語句時會發生語法錯誤，因為違反了C語言的規則。編譯器會發出錯誤消息來幫助您定位和修復不正確的說法。
    - 不同的系統可能在錯誤消息上的措辭不同
    - 語法錯誤也稱為編譯錯誤或編譯時錯誤。
#### 1.9.3 Phase 4 Linking
- Linker主要負責將將一個或多個由編譯器或組譯器生成的目的檔外加庫(Liberary or 使用者創造的Liberary)，鏈結為一個可執行檔。
#### 1.9.4 Phase 5 Loading
- 載入器 (loader) 將可執行檔 (.exe) 載入記憶體，並與動態程式庫檔 (.dll) 連結。動態程式庫可減少執行檔所佔的硬碟和記憶體空間。
#### 1.9.5 Phase 6 Execution
- 在CPU的控制下，執行一次執行一條程式。
### 1.9.6 Problem That May Occur at Execution Time
- 程式不一定會在第一次run的時候就成功，前面每個Phase都可能會失敗，然後我們就需要一一檢視(阿不是就是除錯)
:::info
>程式運行時會發生類似被0除的例子，而這些就被稱為運行時錯誤或是執行時錯誤
>除以0通常是致命的錯誤，也就是說，程式在沒有成功運行的情況下立即中止。
>非致命的錯誤，程式雖然可以運行，但通常得到錯誤的結果。
[name=蜜蜂]
:::
### 1.9.7 Strandard Input,Strandard Output and Strand Error Streams
- Strandard Input 
    - 某些C函數會從stdin提取數據，通常是使用鍵盤(但也可以指定輸入點)。
- Strandard Output
    - 數據通常輸出到stdout，通常是指將結果輸出到電腦螢幕上，但也可以輸出到磁盤或是印表機
- Strandard Error 
    - stderr用來輸出錯誤訊息(通常輸出到電腦螢幕上)，也就是說，將strdout到螢幕以外的設備，同時stderr輸出至螢幕上，如此使用者就能立即知道錯誤。

### 1.10 Test-Driving a C Application in Windows,Linux and Mac OS X
- 這裡就是說猜數字遊戲在Windows Linux Mac OS X的運行方式
- 唯一重點：教你怎麼改背景...：打開命令->在標題欄按下右鍵->選擇屬性(我的是內容拉)->然後改完記得儲存就好。
#### 1.10.1 Running a C Application from the Windows Command Prompt
這裡自己跑一次會比較清楚，所以我只列個順序 ~(絕對不是我找不到重點)~
1. Checking your setup
2. Locating the completed application
3. Running the GuessNumber application:
[Note: GuessNumber.exe 是這個程式的真實名字; 而Windows 假設 .exe 為預設副檔名.]
4. Entering your first guess
5. Entering another guess
6. Entering additional guesses
7. Playing the game again or exiting the application: 
8. Close the Command Prompt window.

### 1.11 Operating System
操作系統是讓使用者、應用程式開發人員與系統管理者用起來更方便的軟體。
所提供服務的允許每個應用程式能在安全，高效，同時(並行)的執行。
#### 1.11.1 Windows--A Proprietary Operating System
- 1980年代中期，微軟開發Windows系統，是一套建立在DOS上的圖形用戶系統，用戶利用鍵入命令來跟Windows作互動(操作)
- 借用早期Apple Macintosh的許多概念(例如圖標、菜單和窗口)
#### 1.11.2 Linux--An Open-Source Operating System
- 在服務器、電腦和嵌入式系統~(前面有提到喔)~中很流行
- 是開源的喔~~
#### 1.11.3 Apple's Mac OS X;Apple's iOS for iPhone,iPad and iPod Touch Device

#### 1.11.4 Google's Android
- 以Linux為核心Java作為主要語言
- 開發Android應用程式的好處：平台是開放的而且系統是開源免費的。
### 1.12 The Internet and World Wide Web
History:看過就好
- <補充>傳輸控制協定(TCP):將一段訊息分成若小段，而TCP為了要不發生丟包情形，所以會給予每一段一個編號。從發送方傳遞至接收方，成功接收時會回應一個確認資訊(ACK)，假設沒收到確認資訊，則該封包將被當成遺失並且重傳。
- <補充>AJAX:(Asynchronous JavaScript and XML)（非同步的JavaScript與XML技術）:僅向伺服器傳送並取回必須的資料，並在客戶端處理來自伺服器的回應。因此伺服器與瀏覽器之間傳輸的資料大量減少，伺服器回應加快，也能減少伺服器的負荷量。
### 1.13 Some Key Software Terminology
- Agile software development(敏捷軟體開發):新型軟體開發方法，嘗試用更少的資源更快的產出軟體
- Refactoring(重構):重構程式，使其能在保持正確和功能的情況下更容易去維護。
- Design patterns(設計模式):將軟體設計中常出現(反覆出現)的問題，提出解決方案，鼓勵其他開發人員重複使用這些方案，減少時間、金錢與力氣的浪費。
- LAMP:4個開源技術首字母的縮寫
    - 1.Linux 作業系統
      2.Apache 網頁伺服器
      3.MariaDB 或 MySQL 資料庫管理系統(資料庫伺服器)
      4.PHP Perl 或Python (腳本語言)
- Software as a Service (SaaS):軟體即服務
    - 不需經過傳統安裝步驟即可使用(一般經由網頁存取)
- Platform as a Service (Paas):平台即服務
    - 是一種雲端運算服務，提供運算平台與解決方案服務
- Cloud computing:雲端運算
    - 是一種基於網際網路的運算方式，通過這種方式，共享的軟硬體資源和資訊可以按需求提供給電腦各種終端和其他裝置。
- Software Development Kit (SDK):軟體開發套件
    - 特定開發工具的集合
- 軟體版本週期
    - Alpha:最初版，通常由內部人員測試(功能不健全，bug很多...)
    - Beta:測試版(公開測試)(功能還有調整空間，可能還存在bug)
    - Release candidates(RC):可能成為最終產品的候選版本，如果未出現問題則可釋出成為正式版本(功能接近完整，bug修復差不多了)。
    - Final release:最終釋出版本
    - Continuous beta:不斷更新，釋出新版本
### 1.14 Keeping Up-to-Date with Information Technologies
- 看看就好



###### tags: `程設好難` `學校門口大樹石頭下` `他的課就很好睡阿`
<style>
.navbar-brand::after { content: " × 老葉的程式設計"; }
</style>