機械語言

（）係程式語言嘅一種，呢啲語言嘅特徵係由佢哋寫成嘅機械碼可以俾部電腦粒 CPU 直接噉處理，而且佢哋行行指令都會叫粒 CPU 做一個好特定嘅作業，好似係加載啲資訊、直接噉跳去某個步驟嗰度、以及係攞 CPU 暫存器或者記憶入面某啲數據嚟做算術邏輯嘢呀噉。

機械語言之所以可以俾部電腦直接處理，係因為佢哋係好低級嘅程式語言－淨係用數字表達嗮所有嘢。組成一段機械碼嘅數字會包含嗮「要用啲乜嘢數據」同「要做啲乜嘢作業」等嘅資訊。舉個例說明：假想而家有一款機械語言，佢嘅每段指令都由 18 個數字組成，呢 18 個數字每一個都一係 1 一係 0，頭嗰 7 個數字用二進制表達數據 A，跟住嗰 7 個數字用二進制表達數據 B，最尾嗰 4 個數字就表達「要做啲乜」－「0000」代表「做加」，「0001」代表「做減」等等。於是喺用呢種語言寫成嘅源碼入面，「0000011 0000100 0000」呢個指令會叫部電腦計 3（用二進制寫係「11」）加 4（用二進制寫係「100」）嘅結果出嚟。

一段典型嘅機械碼指令當中會有至少一橛嘅行動碼（opcode），而行動碼入面通常有一橛負責講明段指令係邊個類型（例如係「跳轉」、「算術」呀噉），跟住又有一橛指定要做啲乜（例如係做算術嘅話，要做嘅到底係加定乘定點）。段碼淨低嘅部份會提供要處理嘅數據喺記憶入面邊個位置同埋係乜等嘅資訊。攞返上面嗰個例子，嗰段碼入面最尾嗰橛「0000」就係嗰段指令嘅行動碼，而佢其餘嗰啲部份就講明咗要處理嘅數係啲乜嘢。

機械語言嘅高度數字化令到電腦好容易明白佢，所以機械碼有個優點，係可以唔使過編譯器（compiler）就直接入落去粒 CPU 嗰度，所以做嘢會快啲；但係喺實際應用上，啲人好少可會直接用機械語言寫程式，因為直接用佢哋實在太容易出錯（多咗個 0 或者少咗個 0 都會搞到成段指令嘅意思唔同嗮），而且用佢哋做起除錯上嚟又嫌撈攪得滯。比較常見嘅做法係用一啲冇噉數字化嘅高級程式語言寫好段源碼，再用編譯器等嘅架生將段源碼轉化做機械碼，俾部電腦執行。

## 指令集

每個處理器或者每個系列嘅處理器都有佢哋自己特色嘅一套指令集（Instruction set），而指令集係機械語言嘅基礎。喺一個處理器入面，一段指令所用嘅數據同埋佢做嘅作業查實都係對應住嗰個處理器處理緊嘅一啲電子訊號嘅，呢啲電子訊號通常都係數位（Digital）型式嘅訊號－亦即係一係冇訊號一係有訊號，分別以 0 同 1 代表。例如而家有一部電腦處理緊一幅圖，噉佢啲記憶體入面實會有有關呢幅圖嘅數據喺度，而當個用家（又例如）叫部電腦將幅圖嘅某一忽變做紅色嗰陣，部電腦實際做嘅嘢係將有關嗰一忽嘅數據嘅數值改變，變成對應「紅色」嘅數值，再將呢串訊號傳去個熒光幕嗰度，等個熒光幕顯示紅色出嚟（有關呢啲嘢嘅詳情，可以睇吓電子工程）。

一個處理器嘅指令集就係話俾個用家知嗰個處理器邊一啲 0 同 1 嘅組合對應住啲邊啲數據同作業－有啲處理器可能會用「000000」代表「做加」呢個作業，又有啲處理器用「000000」代表「做乘」呢個作業。因為噉，對於一個用機械語言嘅程式設計員嚟講，指令集會話嗮佢需要知嘅嘢俾佢聽。

;有關指令集嘅一啲事實：
* 有陣時喺設計新嘅處理器嗰陣，啲設計師可能會郁個指令集，令到唔同系列嘅處理器會有唔同嘅機械語言。
* 一個處理器嘅指令集入面可能款款指令都係一樣噉長嘅，但係又有某啲處理器嘅指令集會唔同指令唔同長度。
* 唔係所有嘅指令都會喺段指令入面講明要處理乜嘢數據嘅－喺某一啲指令集入面，機械碼淨係會講明要做乜嘢作業，而個作業會處理乜嘢數據由堆疊（Stack）入面有啲乜而定。

## 例子
MIPS架構（MIPS architecture）係一款指令集，其中一種特色係佢啲指令冚唪唥都係 32 位元（即係有 32 個 1 同 0）噉長嘅。MIPS架構嘅指令多數有 6 個位元嘅行動碼，當中 J-型（jump）同 I-型（immediate）嘅指令會由呢 6 個位元嘅行動碼完全呈現，而 R-型（register）嘅指令就另外有多啲位元嚟講明個指令嘅細節。呢個架構嗰啲指令嘅格式係噉嘅：

    6      5     5     5     5      6 位元
 [  op  |  rs |  rt |  rd |shamt| funct]  R-型
 [  op  |  rs |  rt | address/immediate]  I-型
 [  op  |        target address        ]  J-型

op 係行動碼。rs、rt、同 rd 表明咗「要處理嗰啲數據要由邊度攞」同埋「處理完要擺去邊」。舉幾個例說明：

;MIPS架構例子

 [  op  |  rs |  rt |  rd |shamt| funct]
     0     1     2     6     0     32     十進制
  000000 00001 00010 00110 00000 100000   二進制

「000000 00001 00010 00110 00000 100000」呢段機械碼喺 MIPS 架構入面係叫個處理器「將暫存器 1 同暫存器 2 入面嗰兩個數字加埋一齊，跟手將個結果擺落去暫存器 6 嗰度」。

 [  op  |  rs |  rt | address/immediate]
    35     3     8           68           十進制
  100011 00011 01000 00000 00001 000100   二進制

「100011 00011 01000 00000 00001 000100」就會叫個處理器由記憶某個位置入面攞一個數值出嚟，跟手擺落去暫存器 8 嗰度，個目標嘅位置係暫存器 3 入面嗰個數字之後 68 個格。

 [  op  |        target address        ]
     2                 1024               十進制
  000010 00000 00000 00000 10000 000000   二進制

「000010 00000 00000 00000 10000 000000」就係叫個處理器跳去「1024」呢個地址嗰度。

## 可讀性
* 機械語言係公認咗可讀性最低嘅程式語言種類－冇返噉上下專業訓練嘅人冇乜可能會睇得明。
* 美國版權局係俾人將電腦程式攞去申請版權嘅，但係有學者指出，機械語言嘅可讀性低到當局根本冇能力睇得出一個用機械語言寫嘅程式係咪原創作品。呢樣嘢搞到啲人攞親電腦程式去申請版權都要將個源碼譯做啲比較易睇嘅程式語言先。
* 認知科學家 Douglas Hofstadter 話機械語言有些少似遺傳碼，指出「望住一個用機械語言寫嘅程式有少少似逐粒逐粒原子嚟去睇一條 DNA 分子噉」。

## 組合語言

組合語言（Assembly language）係一種稍為高級啲嘅程式語言，會用一啲羅馬字母嚟表示佢哋啲指令俾個用家睇，而唔係直接用啲指令嘅數值，呢點令到佢哋對一般人嚟講易用好多。舉個例，喺 Zilog Z80 嘅處理器嗰度，「00000101」呢段機械碼會令到粒 CPU 將 B 處理器暫存器入面嗰個數值下降 1，而呢段碼用組合語言寫嘅話會係「DEC B」－當中見到「DEC」呢三個羅馬字母，代表咗英文字「decrement」，呢個字嘅意思係「令某啲嘢數值下降」噉解。

## 睇埋

*機械
*電子工程
*寫程式
*程式語言
**組合語言
**高級語言

## 參考書
* 
* 
* 

## 攷