動態類型的語言的優缺點有哪些?

從代碼的角度,從工程的角度來看動態、弱類型的編程語言與靜態、強類型的編程語言相比有哪些優缺點?

===

我擅自編輯了一下問題,因為我覺得不是弱類型而是動態類型,弱類型動態類型語言貌似主流的只有 JS 了……問題補充保留,如果覺得不妥請改回去。


duck type是優點也是缺點。

優點是簡單粗暴,介面什麼都扔一邊,代碼量少

缺點是容易break build,沒法用編譯器來檢查和約束代碼改動帶來的影響。


用動態類型的語言來寫程序,那個duck type的interface,十分有利於你在寫程序的時候不斷地拍腦袋創造出一些interface然後還不用文檔log下來。寫小程序的時候是挺爽的。用C++和C#什麼的,你寫個class和interface還得先想一想,多浪費時間呀!


其實它的特點就是非常靈活,所有的優缺點都是這個特點的體現.

寫起來隨心所欲,想到哪裡寫到哪裡,想怎麼寫就怎麼寫.但如果業務比較複雜,數據模型也多,那麼代碼就很難維護.一段時間之後,就看不明白自己當時寫的代碼了.

從工程的角度來看,動態語言一般適合短平快,需求多變但簡單清晰的項目.

而大型項目,還是必須要靠java和c#.


優點:可以早點下班,適合小團隊快速解決戰鬥

缺點:不適合和「想怎麼寫就怎麼寫」的程序員合作開發


強類型,定義好類型後,編譯器給你檢查賦值的類型。

弱類型,由於沒有定義,必須編寫代碼進行賦值檢查。

強類型,IDE比較容易定位錯誤的賦值類型,所以這樣的語言使用IDE比較方便

弱類型,IDE基本無法辨別賦值類型的錯誤,更合適使用編輯器。

強類型由於變數類型定義好了,所以數組保證了所有值的類型一致。當然你可以gentic的類去變相地繞過這個限制,但是要付出一些性能上的減弱。

弱類型的數組,可以類型混用,用起來方便,但數組有類型要求的話,反而麻煩。

強類型,由於事先定義好了,所以基本是靜態分配內存大小,這樣可以提高性能

弱類型,由於無法測算內存使用量,要動態分配內存,所以程序效率相對低。

當然,雖然這些都是某型的先天優缺點,但是現在有很多很多優秀的軟體工程師在減少雙方的差距,學習對方的優點,而降低自己的缺點。


優點:方便、入門快,適合寫小玩意兒。

這點某些程序員就要嘲笑另外某些程序員:寫個小玩意兒還要搞上幾百行——而我們,世界上最好的語言,只要寫十幾行!

當然看應用場景,並不是所有的東西都要講性能的。有時候處理一下數據,程序就跑這麼一次,運行時間是5秒還是1秒針真沒什麼區別。可是你寫這些代碼,花2分鐘和10分鐘來寫就真的有區別了。

缺點:性能略差,不適合做大型系統(見仁見智)

不過 百度貼吧、新浪微博、Yahoo、Wiki 這樣上億用戶的產品也可以用LAMP來做,主要還是看應用領域,也不是就是說PHP是世界上最好的語言,雖然PHP確實很方便但是我沒有這個意思。

因為LAMP架構一般主要的性能瓶頸在MySQL上,而PHP在性能消耗上只佔用了很小一部分,而MySQL是用C語言寫的——這也再次說明了弱類型動態語言性能差不適合做大型系統。另外PHP的拓展也是用C寫的,這和Python等動態語言不同。

另外如果業務核心除了資料庫讀寫排序外還有推薦等等功能的話,LAMP就會遇到PHP的瓶頸。

因此FaceBook也把PHP換成了強類型靜態的PHP: Facebook 開發的高性能PHP虛擬機 HHVM 比官方的 PHP解釋器 快超過9倍」的說法是否屬實?


弱類型語言接觸不多,唯一用到的是JS。我覺得優點是寫起來很有酣暢淋漓的快感,缺點是代碼重構比較麻煩,改動之後生怕有遺漏。


一個語言特點,在某些場合可以是優點,在某些場合也可以是缺點,寫的代碼足夠多便可以體會到。

動態語言最大的一個特點就是duck type 它的靈活性已經可以完全無視什麼多態和介面,不用被類型束縛。但是這就導致了大部分的錯誤你都要到運行時才能發現。有時你檢查了很久發現最後是變數名寫錯也也要呵呵。舉個例子

def handle(n):
n.do_something()

這裡你沒辦法保證函數會被正常調用,因為n不一定有do_something這個函數,可能是你不知道這個參數n要用這個函數,編譯器也不會有提示,也可能你的函數名寫錯了,函數明明風格不同。程序一大,用的庫多了,這些問題就多了。你調用的時候當然可以去檢查,但是這時結果已經不是預料的那個了。

當然很大的好處就是易學,還有就是寫起來特別爽,沒有限制,有些什麼地方想改馬上就能改,當然這不能防止你手賤。然後想做動態綁定也是分分鐘的事,相比之下靜態類型就麻煩了。


動態類型沒有優點,動態類型使得一個數據(變數或其他的稱呼)的內部結構完全不能推測,特別是接手項目的人沒有地方查看類型結構定義導致修改和更新代碼變得寸步難行,如果定義成類封裝起來還好說,如果是利用動態類型的特點在使用的地方直接組成數據結構那TMD就是一坨狗粑粑。


拿js舉例。

寫起來爽,但是速度慢。

為什麼速度慢?因為不指定類型,沒有辦法靜態編譯優化,只能動態解釋。因為cpu指令是有類型的,所以。

可以看看google的chrome團隊怎麼提高js性能,為什麼說js是有缺陷的語言。以及為什麼有type script,asm.js之類。


不用聲明變數類型

不用聲明返回值

想return 就return

打開notepad就能寫

找個解釋器就能跑

啊,快要被類型搞到神經衰弱了,一堆的強類型語言,很明顯的類型,非要我去聲明


推薦閱讀:

python shell代碼無法保存為何?
python 中 os._exit(), sys.exit(), exit() 的區別是什麼?
Python3.3和Python3.2的區別在哪裡?
為什麼在Python定義函數中想使用return語句返回一個list卻沒有任何返回值?
為什麼可以像執行系統命令一樣執行 Python 的包,如 scrapy crawl xxx?

TAG:JavaScript | Python | Java | C編程語言 | 動態語言 |