通常來說,根據資料型別可以將程式語言分為兩類:
強型別語言
- 強型別語言(Strongly typed language)不僅強制要求事先宣告變數,還要求宣告每個變數的資料型別,這樣編譯器就能準確地知道這個變數中的值的型別。強型別語言在資料型別上要求很嚴格:必須事先說明變數中存放的資料的型別,而在程式的程式碼中不將其他型別的資料存放到變數中。若將某個變數宣告為數字,那麼編輯器就認為存放的是一個數字;若違反了這個規定 ,比如將日期存放在這個變數中,比那機器就會報錯。
弱型別語言
- 在弱型別語言(loosely typed language)中,無需事先宣告變數的資料型別。但存放在變數的資料型別依然是個需要注意的問題(不能要求計算機2 + banana),但弱資料型別不會在這個問題上斤斤計較。通常,在弱型別語言中都無法宣告資料型別,而強型別語言則強制要求宣告每個變數的資料型別
編譯型語言
- 編譯型語言通常都是強型別的,但也確實存在介於兩者之間的語言。用編譯型語言編寫的程式碼預先由編譯器處理,生成一個經過最佳化的二進位制可執行檔案————例如EXE檔案。指令碼語言事先不會被編譯,而是在執行時編譯。
編譯型語言流程
- 在普通文字中編寫程式碼
- 將程式碼編譯成可執行檔案
- 執行編譯好的可執行檔案
- 程式執行
指令碼型語言
- 指令碼語言通常都是弱型別的, 其中執行時引擎(runtime engine)會在執行時解釋程式碼,而不是事先編譯
指令碼型語言流程
- 在普通文字中編寫程式碼
- 執行指令碼檔案
- 指令碼執行時引擎在程式執行時編譯程式碼
- 程式執行
由於程式碼實在程式執行時才編譯,所以編譯器會檢查變數存放的資料和操作合理的猜測其資料型別(2 + banana),進行隱式轉換
因此準尋變數用途唯一原則,避免隱式轉換
Dim strFirst,lngSecond
strFirst=CStr(50)
lngSecond=CLng(100)
result=strFirst+lngSecond
Msgbox result
' 兩個變數都是字串子型別,會將進行字串連線
' 其中有一個式數字子型別,隱式轉換Str->double
' MsgBox將內容轉為字串輸出或解析變數result
' 其中的字串子型別不含有數字,相加會產生"Type Mismatch"錯誤.
#! /bin/bash
strFirst="50"
IntSecond=100
result=$[$strFirst + $IntSecond]
echo $result
echo "$result"
# result接受到隱式轉換的str->int
# echo 前者輸出 變數 $result 的值 後者輸出 帶引號的變數 $result 的值
strFirst="50"
IntSecond="100"
result=strFirst.to_i+IntSecond.to_i
puts result
puts "#{result}"
# 其中有一個式數字子型別,無法進行隱式轉換否則會觸發TypeError
# puts 前者輸出變數 result 的值 後者輸出帶引號的變數 result 的值