[編譯 vs. 直譯] / [靜態 vs. 動態] / [強型別 vs. 弱型別]
前言
最近因為 [編譯 vs. 直譯] / [靜態 vs. 動態] / [強型別 vs. 弱型別]
有各種理解上的困難
索性寫一篇文章下來當作筆記
提醒自己的同時也希望對讀者有幫助!
編譯 vs. 直譯
首先我們要理解到
為了讓我們人類寫的程式碼能讓機器讀懂
中間就一定會有一個轉譯的過程
透過這個過程
將我們人看的懂的語言轉換成機器看的懂的語言 也就是 0 和 1
圖解如下:
而這個轉換的的方式則分成兩種 → 編譯
與 直譯
對應到的工具就是 編譯器
與 直譯器
差別如下:
編譯器:
一次性把所有的程式碼轉成機器看的懂的 0 和 1
他的文件就是在Windows裏叫的.exe檔
或者Unix中的可執行檔
優點:
- 執行速度快 (因為已經編譯好了)
- 程式有問題時在編譯時就能即時發現報錯 (而非執行時)
減少執行時的風險
缺點:
- 開發較慢
→ 開發時也不能開發一段就執行一次,而是須要等到編譯完後才能執行
特色:
- 使用編譯器的編譯語言多數是靜態語言。他們會事先定義變數類別和做類別檢查等等。
- 常見語言: C++、C、Rust、Go、Visual Basic、Swift、Obj-C
- 編譯語言的可執行檔是可以獨立運行的
比如說 C++ 雖然只能在新電腦中編譯,但他的可執行檔甚至連不支援C++的電腦,都可以運行
直譯器:
一列一列轉換並執行
優點:
- 可以用交談式的方法寫程式
- 可以開發一小段程式碼就執行一次,加快開發時程
缺點:
- 執行速度較慢 而且沒辦法一次編譯完然後重複執行
特色
- 常見語言: Javascript 、Python、Shellscript、PHP
- 直譯語言需要有一個適合的執行環境/或者說是一個VM,才可以執行
例如 Python3 程式碼便需要有在有安裝 Python3 的電腦中才可以運行
靜態 vs. 動態
定義:
變數和型別的綁定方法
白話來說,可以理解成變數在宣告的時候是否綁定型別
靜態語言(Statically Typed Languages):
- 程式撰寫時必須使用明確的型別宣告。
- 型別一旦宣告後,在執行時期時無法任意更換型別,否則會發生錯誤。
- 編譯時期 (Compile Time)確認與檢查型別,一旦有變數誤用或資料型態上的 Bug,在編譯時期就能發現,降低執行時期的風險。
java 例
int x;
x = "Hello";
這樣子就會出錯
因為型別宣告為整數
卻塞了個非整數的值 於是會報錯如下
HelloWorld.java:5: error: incompatible types: String cannot be converted to int
動態語言(Dynamically Typed Languages):
- 程式撰寫時不用明確的型別宣告
- 執行時,變數能任意更換型別
- 與靜態語言相反,是在執行時期(Runtime)確認與檢查型別
PHP 例
$a = 123;
echo $a; // print: 123
$a = "Hello";
echo $a; // print: Hello
與 Java 不同
變數 a 的型別怎麼變都沒關係
弱型別 vs. 強型別:
定義:
語言型別系統(Type System)對型別檢查的嚴格程度,也就是型別安全的程度。
簡單來說,就是編譯器或直譯器對型別檢查的寬容程度
更淺白地形容:允許編譯器或直譯器自作主張的程度
強型別語言偏向說一是一、說二是二,你沒有在程式語法上明確指示就是沒這件事,發現不是正常寫法,直接停下來告訴你發生錯誤
弱型別語言就不同了,發現不是正常寫法,會試圖去做一些自動轉型,讓這段程式繼續運作下去
強型別(strongly typed):偏向不容許隱性型別轉換,型別檢查上較為嚴格。
以 Java 為例
var string = "3";
var number = 2 + string;
這樣就會出錯
而在弱型別的JavaSctipt中就會顯示23,它幫我們把2轉為字串了
弱型別(weakly typed):偏向容許隱性型別轉換,型別檢查上較為寬鬆。
以 Java 為例
var string = "3";
var number = 2 + string;
這樣就會出錯
而在弱型別的JavaSctipt中就會顯示23,它幫我們把2轉為字串了
[靜態 vs. 動態] + [強型別 vs. 弱型別]
討論到現在
我們終於可以把這兩個象限、四種類型給排列組合起來如下了:
(source: https://ithelp.ithome.com.tw/articles/10202260)
(source: https://millenniummeetonce.blogspot.com/2018/04/blog-post_5.html)
是否看到了一堆沒看過的語言呢xd
沒關係 就只是一張圖
這篇文章可以讓各位知道
自己常用的語言是靜態的還是動態的、強型別還是弱型別、編譯語言還是直譯語言囉!
參考資料
https://millenniummeetonce.blogspot.com/2018/04/blog-post_5.html
https://www.zhihu.com/question/19918532
https://ithelp.ithome.com.tw/articles/10214510
https://ithelp.ithome.com.tw/articles/10201839
https://ithelp.ithome.com.tw/articles/10202260
2 comments
你的強弱型別那邊寫錯囉~
不好意思可以詳細說明一下哪裡寫錯嗎?
我再來調整一下~