[編譯 vs. 直譯] / [靜態 vs. 動態] / [強型別 vs. 弱型別]

by Benmr
language-type

[編譯 vs. 直譯] / [靜態 vs. 動態] / [強型別 vs. 弱型別]

前言

最近因為 [編譯 vs. 直譯] / [靜態 vs. 動態] / [強型別 vs. 弱型別]
有各種理解上的困難
索性寫一篇文章下來當作筆記
提醒自己的同時也希望對讀者有幫助!

編譯 vs. 直譯

首先我們要理解到
為了讓我們人類寫的程式碼能讓機器讀懂
中間就一定會有一個轉譯的過程
透過這個過程
將我們人看的懂的語言轉換成機器看的懂的語言 也就是 0 和 1
圖解如下:
file
而這個轉換的的方式則分成兩種 → 編譯直譯
對應到的工具就是 編譯器直譯器
差別如下:

編譯器:

一次性把所有的程式碼轉成機器看的懂的 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. 弱型別]

討論到現在
我們終於可以把這兩個象限、四種類型給排列組合起來如下了:
file
(source: https://ithelp.ithome.com.tw/articles/10202260)
file
(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

You may also like

2 comments

HPC 2022-10-25 - 11:06 下午

你的強弱型別那邊寫錯囉~

Reply
Benmr 2022-11-19 - 11:12 上午

不好意思可以詳細說明一下哪裡寫錯嗎?
我再來調整一下~

Reply

發佈回覆給「Benmr」的留言 Cancel Reply