認識程式
在談 JavaScript 之前,我想解釋程式的概念,讓大家對程式有一個基本的認識。
什麼是程式?
電腦是一個非常強大的工具,但它只是一個工具,它不會自己動,也不會自己思考,它只會執行我們給它的指令。
由程式設計師來決定電腦該做什麼指令,而這些指令就是我們所謂的程式 Program。
機器語言
當我們寫程式時,想要告訴電腦它應該要做什麼,但是電腦只看得懂 0 和 1 這樣的指令。 所以我們需要編寫 0 和 1 來讓電腦理解我們的意圖,這就是最初的程式語言,也就是機器語言。
但機器語言會長得像是這樣的東西:
10110000 01100001
10110000 01100010
10110000 01100011你應該會覺得以上這段程式非常難以閱讀和維護的。 所以我們開始使用組合語言,這是一種比上面的機器語言更容易閱讀和編寫的語言。
INFO
最早的機器語言不是透過鍵盤輸入的,最早是透過開關來設定,而後用紙帶、磁帶、磁盤等儲存媒介來儲存機器語言。
組合語言
section .data
num1 db 5 ; 第一個數字
num2 db 10 ; 第二個數字
result db 0 ; 儲存結果
section .text
global _start ; 必須告訴鏈接器入口點
_start:
; 將 num1 複製到 AL 寄存器
mov al, [num1]
; 將 num2 加到 AL 寄存器
add al, [num2]
; 將結果儲存到 result
mov [result], al
; 呼叫系統呼叫來退出程式
mov eax, 1 ; 系統呼叫號碼 (sys_exit)
xor ebx, ebx ; 狀態碼 0
int 0x80 ; 呼叫內核跟前面的機器語言比起來,組合語言的閱讀性好很多。 但是相對現代的高階語言來說,還是很難以閱讀和維護。 所以像是 C 語言這樣的高階語言就應運而生了。
C 語言
#include <stdio.h>
int main() {
int num1, num2, sum;
// 提示使用者輸入第一個整數
printf("Enter the first integer: ");
scanf("%d", &num1);
// 提示使用者輸入第二個整數
printf("Enter the second integer: ");
scanf("%d", &num2);
// 計算兩個整數的和
sum = num1 + num2;
// 輸出結果
printf("The sum of %d and %d is %d\n", num1, num2, sum);
return 0;
}C 語言是一個相對於機器語言、組合語言來說更高階的語言,它的語法更接近自然語言,更容易閱讀和編寫。 它經過編譯器的編譯後會變成機器語言,再交由電腦執行。
編譯語言與直譯語言
現代常見的程式語言可以分為兩種:編譯式語言和直譯式語言。
編譯式語言
編譯語言是指程式碼在執行前需要先經過編譯器的編譯,排除掉語法錯誤後,再轉換成相對應的機器語言。 好處是執行速度快、而且比較嚴謹,在執行前就能夠發現錯誤。 代表者有 C 語言、C++ 語言等等。
直譯式語言
直譯語言是指程式碼在執行時才會被解譯器逐行解讀,並且執行。 好處是開發速度快、容易學習,但是執行速度比較慢,而且容易在執行時發生錯誤。 代表者有 JavaScript、Python、Ruby 等等。
| 類別 | 優點 | 缺點 | 代表語言 |
|---|---|---|---|
| 編譯式語言 | 執行速度快、嚴謹 | 開發速度慢、學習曲線高 | C, C++ |
| 直譯式語言 | 開發速度快、容易學習 | 執行速度慢、容易發生錯誤 | JavaScript, Python |
強型別與弱型別
程式語言可以依據型別系統的嚴格程度分為強型別語言和弱型別語言。
強型別語言
強型別語言是指在建立變數時,必須指定變數的型別,並且在使用變數時,必須符合變數的型別。 好處是在開發時比較嚴謹,可以避免一些資料錯誤。
int num = 10; // 建立一個整數變數
num = 'a'; // 這樣的賦值會發生錯誤弱型別語言
弱型別語言是指在建立變數時,不需要指定變數的型別,而且在使用變數時,可以隨意改變變數的型別。 好處是在開發時比較靈活,但是容易在開發時發生資料型別混淆的問題。
let num = 'hello'; // 建立一個字串變數
num = 1; // 這樣的賦值不會發生錯誤,是合法的
num.charAt(0); // 但是這樣的操作會發生錯誤,因為 num 已經不是字串了| 類別 | 優點 | 缺點 |
|---|---|---|
| 強型別語言 | 開發時比較嚴謹 | 開發時比較不靈活 |
| 弱型別語言 | 開發時比較靈活 | 開發時容易發生錯誤 |
基於 JavaScript 的 TypeScript
根據以上的範例,你會發現 JavaScript 在變數型別上是弱型別的,容易導致一些開發、執行時的錯誤。
TypeScript 是 JavaScript 的超集,它在 JavaScript 的基礎上加入了型別系統,讓 JavaScript 變成了強型別語言。
而且 TypeScript 是編譯式語言,它會在開發時就檢查變數的型別,並且透過一些打包工具編譯成 JavaScript 後再執行。
let num: number = 10; // 建立一個整數變數
num = 'a'; // 這樣的賦值在開發時會發生錯誤