---
# System prepended metadata

title: 【程式語言】Chapter.1 Preliminaries
tags: [note]

---

# 【程式語言】Chapter.1 Preliminaries

## 學習程式語言的核心原因

* 增強自己的表達能力
    * 你的code不能只有自己看懂。
* 增強你選擇合適的程式語言的能力
    * 不同的case你需要用不同的語言來進行，會更加適合。
* 增強你學新的語言的能力
* 更快速瞭解實作的意義
* 簡單來說可以加強電腦能力

## 程式領域

* 不同的語言在設計時都有不同的考量，為了達到各自的目的而在架構上有所不同。

---

* 科學應用
    * 大數和浮點數的運算
    * 代表語言：**Fortran**
* 商業應用
    * 產品報告、特別使用decimal numbers(特有的小數型別)和字元
    * 代表語言：**COBOL**
        * COBOL幾乎是上古神獸的語言，但還是有許多如銀行單位在使用。
        * 很多銀行等單位只要程式能work就不太想改變或更新，因為不保險。
* 人工智慧
    * 使用符號來取代數字的操作
    * 代表語言：**LISP**
        * LISP的描述對電腦來說簡單，但是工程師可能難以理解。
        * 之後會有LISP的作業。
* 系統設計
    * 因為大量的連續使用，需要高效率
    * 代表語言：**C**
        * 最能代表的就是UNIX系統，大多的OS都是以此為底往上開發的，而UNIX就是用C撰寫的。
* 網路軟體
    * 以相容為主的概念去架構的，原先理想是做什麼事都可以用該種語言
    * 代表語言：**XHTML**、**PHP**、**Java**

## 語言評估的標準

* 基本上我們可以從幾個大面向去講一個語言的特性：<u>Readability</u>、<u>Writability</u>、<u>Reliability</u>、<u>Cost</u>。

### Readability(可讀性)

- 程式有多好看懂就是可讀性。
* 整體簡單性：程式整體的結構和特徵，還有符號overloading的支援度。
* 正交性：結構和結構間應該可以彼此交融不衝突，同時行為都是合法的。
    * 如：巢狀迴圈是兩個迴圈結構，內外層都保持自己的運行規則而不會衝突。
* 控制手段：while、for等控制的結構設計好壞會大幅影響程式語言的可讀性。
* 資料型別和結構：有點廢話不想打了。
* 語法考量：保留字或語法架構是否有彈性又好懂。

### Writability(可寫性)

- 對於程式設計師來說這語言多容易撰寫就是可寫性。
- 可讀和可寫蠻大的部分會交疊在一起，因為好寫的程式語言同時代表它不難看懂。
* 簡單和正交性：基本上同上。
* 支援抽象化：善用抽象化的概念可以節省大量的時間去實作不重要的細節。
    * 舉例：大多數語言內建log的函式，你雖然不明白它內部如何實作完成log的運算，但你還是可以用得很開心。
* 表達性：支援多種功能類似，但視情況更方便使用的結構。
    * 舉例：for其實有while loop的情況下根本不需要使用，但是for在很多情況很方便。

### Reliability(可信度)

- 一個語言從開發到完成的強健性。
* 型別檢查：語言會不會自動判斷型別錯誤去做修正。
    * 舉例：撰寫C的時候你型別用錯直接當機，但C#可能只會出現NaN。
* 例外處理：遇到錯誤時有沒有能力自動修正回到正確的流程上。
    * 舉例：除0有些語言會當機，有些會變無限大然後繼續運作。
* 別名(Aliasing)：不同的變數去存取同一塊記憶體的時候要如何處理。
    * 很多時候是設計上故意的，如pointer就常常做這件事，但提供的除錯功能就要看語言的可信度了。
* 可讀性和可寫性：其實這兩點都會影響到可信度，因為太難撰寫的語言就容易寫錯。

### Cost(消耗、成本)

- 討論一個語言的cost不只有我們常說的運行時間和記憶體空間等。
- 訓練成本：今天你要找到一個COBOL工程師可不簡單，如果要重頭學又很花時間或金錢。
- 編譯成本：有些好的IDE工具本來就要錢(VS專業版就要付費)，而編譯所花的時間也是成本。
- 維護成本：已經寫好的程式是有可能出bug的，要維修或是怎樣都是額外的成本。

###### tags: `note`