動態語言 靜態語言 強型別語言 弱類型語言

來源:互聯網
上載者:User

標籤:推導   basic   一點   置疑   最大的   理解   中間   好處   上下   

一 、靜態語言的優勢到底在哪?

引用 是像Java或者C#這樣強型別的准靜態語言在實現複雜的商務邏輯、開發大型商業系統、以及那些生命週期很長的應用中也有著非常強的優勢

 

這是一個存在於大家心裡常識了。我承認我自己在潛意識裡面也覺得靜態強型別語言適合開發複雜,大型系統。而弱類型指令碼語言不適合開發太複雜,太大型的項目。但是在參與這個討論過程中,我突然開始置疑這個觀點,事實究竟是不是這樣的呢?

先定義一下標準:

靜態類型語言是指在編譯時間變數的資料類型即可確定的語言,多數靜態類型語言要求在使用變數之前必須聲明資料類型,某些具有類型推導能力的現代語言可能能夠部分減輕這個要求. 
動態類型語言是在運行時確定資料類型的語言。變數使用之前不需要型別宣告,通常變數的類型是被賦值的那個值的類型。 
強型別語言是一旦變數的類型被確定,就不能轉化的語言。實際上所謂的貌似轉化,都是通過中間變數來達到,原本的變數的類型肯定是沒有變化的。 
弱類型語言則反之,一個變數的類型是由其應用上下文確定的。比如語言直接支援字串和整數可以直接用 + 號搞定。當然,在支援運算子多載的強型別語言中也能通過外部實現的方式在形式上做到這一點,不過這個是完全不一樣的內涵 
通常的說,java/python都算是強型別的,而VB/Perl/C都是弱類型的. 

引用 觀點一:靜態類型語言因為類型強制聲明,所以IDE可以做到很好的代碼感知能力,因為有IDE的撐腰,所以開發大型系統,複雜系統比較有保障。

 

對於像Java來說,IDEA/Eclipse確實在代碼感知能力上面已經非常強了,這無疑能夠增加對大型系統複雜系統的掌控能力。但是除了Java擁有這麼強的IDE武器之外,似乎其他語言從來沒有這麼強的IDE。C#的Visual Studio在GUI開發方面和Wizard方面很強,但是代碼感知能力上和Eclipse差的不是一點半點鐘。至於Visual C++根本就是一個編譯器而已,羞於提及Visual這個字眼。更不要說那麼多C/C++開發人員都是操起vi吭哧吭哧寫了幾十萬行代碼呢。特別是像Linux Kernel這種幾百萬行代碼,也就是用vi寫出來的阿,夠複雜,夠大型,夠長生命週期的吧。

 

引用 觀點二:靜態語言相對比較封閉的特點,使得第三方開發包對代碼的侵害性可以降到很低。動態語言在這點上表現的就比較差,我想大家都有過從網上下載某個JS包,然後放到項目代碼裡發生衝突的經曆

 

也就是說靜態類型語言可以保障package的命名空間分割,從而避免命名衝突,代碼的良好隔離性。但是這個觀點也缺乏說服力。

靜態類型語言中C,VB都缺乏良好的命名空間分割,容易產生衝突,但是並沒有影響他們做出來的系統就不夠大,不夠複雜。

而Visual C++開發的DLL版本衝突也是臭名昭著的,似乎C++的命名空間沒有給它帶來很大的協助。

而動態類型語言中Ruby/Python/Perl都有比較好的命名空間,特別是Python和Perl,例如CPAN上面的第三方庫成噸成噸的,也從來沒有聽說什麼衝突的問題。

誠然像PHP,JavaScript這樣缺乏命名空間的動態語言很容易出現問題,但是這似乎是因為他們缺乏OO機制導致的,而不是因為他們動態類型導致的吧?

說到大型系統,複雜商務邏輯系統,Google公司很多東西都是用python開發的,這也證明了動態類型語言並非不能做大型的複雜的系統。其實我個人認為:

動態類型語言,特別是進階動態類型語言,反而能夠讓人們不需要分心去考慮程式編程問題,而集中精力思考商務邏輯實現,即思考過程即實現過程,用DSL描述問題的過程就是編程的過程,這方面像Unix Shell,ruby,SQL,甚至PHP都是相應領域當之無愧的DSL語言。而顯然靜態類型語言基本都不滿足這個要求。

那靜態類型語言的優勢究竟是什麼呢?我認為就是執行效率非常高。所以但凡需要關注執行效能的地方就得用靜態類型語言。其他方面似乎沒有什麼特別的優勢。

若干評論:

1。看看yahoo吧,它是用PHP寫的。給你用JAVA也可能做不出來那樣的效能。

2。我的一點感覺,動態語言足夠靈活,因此雖然它能夠讓人更集中精力思考商務邏輯的實現,同時也向人工智慧的方向走得更近一些,但因此它也更依賴於開發人員本身的技術功底,初學者、中級開發人員,難以很好的利用它。 而靜態類型語言,與我們電腦教學的基本科目(c/pascal/basic)延續性比較好,所以對於剛畢業的學生而言,更好接受和學習。因此我覺得還是學習/培訓/開發成本佔主要因素。一個不太恰當的例子:javascript的Regex,雖然功能強大,但並不易理解和學習。一般只能copy/paste來用。所以很多情況下,還是寧願手寫標準js來處理。

3。我感覺類似Java這樣的強型別的准靜態語言還有一個重要的特點。一旦程式員基本掌握了文法規則和書寫規範,寫出來的程式的可讀性會強很多,因為它本身的限制更多。在一個大型系統中,Team成員之間互相可以知道對方在寫什麼是非常關鍵的,這也成為了交流的重要基礎。

然而Ruby這樣的語言,雖然看上去更加符合“描述問題即解決問題”,但是對於同一段邏輯,同樣可以滿足要求,寫法上卻差別很大。我曾經見過用1行寫出來的解決數讀演算法的Ruby解法,誰能看懂?

4。我更經常見到的是Java程式員屁大點事寫幾百行,Ruby幾行就搞定了

5。靜態類型語言是指在編譯時間變數的資料類型即可確定的語言,多數靜態類型語言要求在使用變數之前必須聲明資料類型,某些具有類型推導能力的現代語言可能能夠部分減輕這個要求. 
動態類型語言是在運行時確定資料類型的語言。變數使用之前不需要型別宣告,通常變數的類型是被賦值的那個值的類型。 
強型別語言是一旦變數的類型被確定,就不能轉化的語言。實際上所謂的貌似轉化,都是通過中間變數來達到,原本的變數的類型肯定是沒有變化的。 
弱類型語言則反之,一個變數的類型是由其應用上下文確定的。比如語言直接支援字串和整數可以直接用 + 號搞定。當然,在支援運算子多載的強型別語言中也能通過外部實現的方式在形式上做到這一點,不過這個是完全不一樣的內涵 
通常的說,java/python都算是強型別的,而VB/Perl/C都是弱類型的. 
不過相比於動態/靜態語言的分類,強型別/弱類型更多的是一個相對的概念。

6。如果採用動態語言,單元測試上的工作量要比靜態語言的多很多

robbin 回這一條。其實你忽略了一點,當使用類似RoR這樣的架構的時候,應用代碼量是很少的,所以相應需要測試的部分也很少,比使用靜態類型語言需要測試的部分少了很多。

另外,缺少單元測試沒有你說的那麼恐怖。我們現在就沒有寫單元測試,ruby代碼都已經有6000多行了,編程也好,排錯也好,一樣很輕鬆,哪有你吹的那麼恐怖。

7.商業系統的複雜在於組織上交流的困難,一個大公司,內部有個人能把商業流程搞得一清二楚就不錯了,這個人還能把過程給軟體人員講清楚那簡直是可遇不可求的事。這樣用ruby反而有優勢了,可以快速開發,促進交流,開發出個模型出來給商務人員看看,用用,自然交流起來就容易多了。

現在一個開發人員的開發效率比以前高多了,主要原因是因為開發語言和編譯器的進步,這個趨勢,只會繼續下去,不要抱著過去的教條不放,java也是在不斷改進的,加了reflection, 加了assert,加了泛型,下個版本,也要加指令碼支援了。

8.其實靜態類型語言,除了效能方面的考量之外,最大的優勢就是可以提供靜態型別安全,編譯器可以檢查你的每一個函數調用是不是書寫了正確的名字,是不是提供了正確類型的參數。這樣一個系統,配合自訂類型的功能,可以讓很多錯誤(比許多人想象的要多)在編譯時間就能被發現和定位。

9.我在slashdot上類似話題的討論上曾經看到過有人抱怨動態語言,那個哥們是從事銀行系統的,大概有10萬行的python代碼,最後因為細小隱錯不斷而覺得無法維護,貌似要轉到java平台。(如果把slashdot上近兩年來關於ruby和python的文章和評論看一邊,大概還能夠找到這個跟貼) 
從這哥們的描述來看,他的主要問題是沒有單元測試或者單元測試沒有達到語句覆蓋或者更強的弱條件組合覆蓋,從而導致某些非正常流程發生時,流經這些未被測試的語句導致語法錯誤而最終整個程式都掛掉.對於業務系統來說,這是非常嚴重的事情。就像我前面說的那樣,我自己的程式就曾經不止一次死在logging語句上,因為最初我也不測試這類語句的可通過性。 
至於單元測試有沒有用,三五人的項目幾千行的代碼是看不出來的。其實,作坊式開發照樣能夠做出很多東西來,5年前國內的開發方式基本上是沒有單元測試的,照樣也能玩得轉。 
但是,就我自己的體驗而言,雖然我並不遵循TDD,但單元測試是足夠詳盡的,而這個測試網給我的信賴度(尤其是在修改代碼和較大規模重構時)是之前不可想象的。我估計上千行的程式,就能夠在漸增式的單元測試中嘗到好處。 
10.編譯器對程式員的協助到底有多大,這個還是要應人而異的。編譯器能查出來的很多都屬於打字錯誤,拼字錯誤。對於robbin來說,即使沒有編譯器,檢查這種錯誤也是小菜一碟。可是對於經驗不是很豐富的程式員來說,情況恐怕就大大不同了。畢竟程式員經驗方面差異的一個重要方面就是Debug能力和經驗的差異。對高手來說仔細讀上兩遍程式就能發現的錯誤,對一些新手來說可能會花上一兩小時,這種情況我在實際項目中碰到很多次了。

下面是些例子

無類型: 彙編
弱類型、靜態類型 : C/C++
弱類型、動態類型檢查: Perl/PHP
強型別、靜態類型檢查 :Java/C#
強型別、動態類型檢查 :Python, Scheme
靜態顯式類型 :Java/C
靜態隱式類型 :Ocaml, Haskell

 



動態語言 靜態語言 強型別語言 弱類型語言

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.