首頁 »
2011/12/13

靜態語言 vs. 動態語言的比較

我們常聽見某種語言是動態語言,例如JavaScript、Ruby、Python,而某某語言是靜態語言,例如Java、C#、C++是靜態語言,但靜態語言與動態語言劃分的的關鍵是什麼?本篇將為您解析

劃分靜態語言與動態語言的最根本,在於型別的檢查(Type Checking)的時機,說明如下:
•靜態語言(statically typed languages)
若一個程式語言的型別檢查(Type Checking)工作是發生在編譯時期(Compile Time),則稱之為靜態語言。C#與Java都是靜態語言代表,程式撰寫時必須使用明確的型別宣告,編譯的當下,編譯器就會進行型別檢查,且變數或物件的型別一旦宣告後,在Runtime執行時就無法任意更換型別,否則會發生Exception錯誤。

•動態語言(dynamically typed languages)
若一個程式語言的型別檢查(Type Checking)工作發生在執行時期(Runtime),則稱之為動態語言。Python、Ruby、JavaScript、PHP、SmallTalk、ColdFusion、Groovy等都是著名的動態語言,編譯器不會事先進行型別檢查,而是在執行時才會進行,且在執行時,變數還能不斷任意更換型別,JavaScript就是一例。

    故靜態與動態語言在型別檢查的根本出發點大異其趣,也因此利弊互見,各取所需,以下說明其優缺點:
•靜態語言優缺點
優點:
靜態語言因為在編譯時期就進行型別檢查,是故能事先找出型別誤用或不合法的地方,能達到型別安全之目的,同時程式編寫時也能得到開發工具有效支持(例如Visual Studio的IntelliSense),且由於事先就確定型別,編譯器還能進行程式的最佳化,程式執行速度靜態語言通常比動態語言快。
缺點:
因為型別檢查工作較嚴格,程式語言會花很多部分在處理型別工作上,例如型別的宣告,型別的轉換,型別的相容性等等,同時也因為層層的檢查與型別轉換工作,而導致程式語法冗長與撰寫困難。有點像美國為了飛航安全,機場通關要進行十分嚴格又繁複的檢查,導致旅客通關速度緩慢,也是相同的道理。

•動態語言優缺點
動態語言的優缺點恰恰與靜態語言相反的,把對方缺點變優點,但同時也因此失去對方的優點,只是大家各取所需,想取得的優勢不一樣罷了。
優點:
可以不必為了型別問題,耗費太多程式碼與時間,程式簡潔、撰寫速度較快、語法靈活、有彈性。相同的功能,往往用靜態語言要一堆程式,用動態語言幾行就搞定了。甚至在Runtime執行時期,還能動態加入屬性與方法。

缺點:
在程式撰寫時,因為型別是不確定的,或弱型別的關係,難以獲得IDE工具的有效支援。且編譯時期不會事先進行型別檢查工作,因此可能留下不少Bug上的伏筆,在Runtime時才會發生Exception錯誤。且因為型別檢查與轉換工作是在執行時才進行,故很難事先最佳化程式,執行當下會耗費許多時間行型別檢查工作,程式執行速度通常較靜態語言慢。

區分語言的動靜態,是語言觀念上的一件很重要的事,以前你只能意會,但現在能夠清楚明白其中原委及始末,長久以來,心裡的那塊懸而未決的大石頭,終於能放下了。但祭司花了很大的力氣去解釋這其中始末,是為了從根本性來解釋C# 4.0和Dynamic Language Runtime及.NET 4.0到底發生了什麼,它的中心思想,核心做為是什麼,在下一篇,我將延伸解釋【C# 4.0靜態基礎融入動態能力】,這才是故事最大的重點。

另外,我在TIOBE網站剛好看到靜態語言vs.動態語言的使用率比較圖,看來目前靜態語言長期一直佔有使用比例的優勢(因為型別安全、IDE支持,最佳化與執行速度的關係),但動態語言卻是長期看漲(語法簡潔與靈活的關係),在大家受夠了若干靜態語言日趨複雜,程式設計師浪費不少時間與心力只是為了應付語言或平台本身的複雜度(例如J2EE的複雜,連J2EE專家都看不下去,而.NET也是愈來愈不容易了),而非工作與生產力上面,故反思與流行的帶動下,勢必想抛掉這些舊包袱,尋找心中的天堂淨土,遇見一個可以專注在開發樂趣與生產速度的語言,「眾裡尋她千百度,驀然回首,那人卻在燈火闌珊處」,尋覓到心中理想的佳人,琴瑟共鳴,怎能不叫人感動呢!故Ruby與Python這幾年流行也不是沒有道理的。

TIOBE網站靜態語言vs.動態語言的使用率比較圖


以上節錄自【聖殿祭司的ASP.NET 4.0專家技術手冊】。


C# 4.0(VB 10)與CLR 4.0之驚鴻一瞥←上一篇 │首頁
本文引用網址: