為什麼十年來新興的編程語言,大多是動態類型語言?

為什麼像 Java、C、C++ 這樣的靜態語言會比 Python、Ruby 這樣的動態語言流行得多? - 編程語言

與上述問題有關聯,但我問的正好相反,所以得再提問一個。 根據我這十年在各個網路社區看到的情況,近十幾年(Java興起之後)興起的編程語言,如Ruby,Scala等,幾乎全部是動態類型,而靜態類型的語言主要是Java, C等幾個老牌的,新興的Golang等沒怎麼火起來。 是什麼原因導致新興技術一面倒的姿態倒向動態類型語言呢?

  當前靜態語言(靜態類型語言)有:java、C/C++、C#、DELPHI、VB等。

  動態語言(動態類型語言)有:asp、php、cgi、lisp、Perl、python,Smalltalk、Ruby等。

(是一個很早的資料了,還有cgi,asp也是醉了。誰幫忙編輯一下~~)


以前計算機性能資源很稀缺而寶貴,比如CPU運算能力和RAM大小等,甚至軟體是為硬體服務的,所以需要專業人士去挖掘很一分潛力,做的業務也是很貴的項目,從業者門檻高。

現在計算機資源很充裕而便宜,都面向大眾化了,要的是快速布置與重配置,要求方便快捷地完成業務,從業人員也多(題主列的動態語言也大多是網站開發和腳本類),門檻變低,所以就越來越動態化。

另外,還有個趨勢就是靜態語言下沉化,動態語言上浮化。

怎解?以我熟悉的EDA行業有例子,在伺服器上跑的大型程序動不動一個應用佔用內存幾個G的,比如Synplify, Vivado, VCS, Questa之類,還是以C/C++/Java作為開發語言,但是對用戶層都提供了TCL介面,用戶可拿TCL/Perl這樣的語言作為粘合工具去調用這些程序,同時自己也可以方便去腳本去完成自動化操作,比如提交給伺服器五十個批處理任務,按不同的參數配置把Synplify/Vivado跑五十遍,並把結果提取出來(Perl處理文本非常拿手),按一定的格式保存為.txt文件。下班前提交任務,晚上伺服器運行,第二天上班看結果並分析原因,作下一次優化。

再拿matlab為例,這大家都熟悉,非常容易上手。但Matlab本身是Java開發的,裡面一個個命令也是預先編譯好的,你運行.m腳本時,只是腳本是邊解釋邊執行,但裡面的元素是已經編譯過的。

需要以性能為首要因素的場景還是以靜態語言實現,但需要用戶靈活簡單地調用的場景使用動態語言,普通用戶把靜態語言實現的功能當元素隨手抓來使用,這樣可兼顧性能和靈活易用性。

蘋果發布的Swift應屬於靜態語言,屬於需要編譯類,原因不用多說吧?


靜態和動態的說法不準確,容易在兩個概念之間迷惑,應該換成另外兩組相對的名詞,編譯型和解釋型,強類型和弱類型。

先說強弱類型,是指變數聲明或者賦值之後,類型是不是固定的,固定就是強類型,不固定是弱類型。比如php裡面可以這麼干:

&

整數型和字元型變數直接操作,強類型的語言都會報錯。

perl php js 是弱類型,c c++ java python ruby scala 都是強類型。

再說編譯型和解釋型,編譯型是源代碼必須先編譯成可執行文件,再真正執行,解釋型是源代碼直接解釋執行,不需要經過編譯環節。

c c++ java是編譯型的,perl php python js ruby scala都是解釋型的。

弱類型一直是非主流的小眾派(非使用人數區分),近十年變遷的應該是編譯型為主變為解釋型為主,這個變化的主要原因應該是三個方面:

1. 硬體性能的增強。以前硬體性能低資源少(主要是內存),編譯型性能更好,資源佔用低。現在硬體性能越來越強勁,成本越來越低,可使用的資源越來越多,編譯型的好處就越來越不明顯。而相比之下解釋型開發和測試省時方便的優點開始凸顯。

2. web開發方式的崛起。網站和APP成為主流產品,主流開發方式從原來的GUI客戶端方式,轉為web方式。web要求快速迭代,開發周期短,代碼部署方便,可以熱更新,這些特性解釋型可以更好的支持。編譯型雖然理論上也能做熱更新,但是非原生方式,比較複雜。web面臨的高並發和大數據等技術難點,也主要靠分散式架構解決,單點等性能差異意義越來越小,進一步削弱了編譯型的優勢。

3. 解釋型沒有固步自封,性能在增強。解釋型運行的基礎,各種虛擬機不斷優化,性能越來越好。轉為中間碼和JIT(運行時編譯,實時編譯)等等優化方式,也讓解釋型性能越來越好,和編譯型的差距進一步縮小。


你的描述有問題,scala是強類型的。而且某些弱類型的語言也存在強類型變種。比如type script,typed racket等。所以你的描述本身不一定正確。


用戶購買洗衣機,最主要是看能不能用、好不好用。至於洗衣機的各個組件是用什麼技術製造的,洗衣機的控制晶元用的什麼編程語言、什麼架構,根本不重要。

軟體也是這樣。寫代碼是為了做出產品賣錢,不是為了炫酷。

說 C++ 代碼的開發成本和維護成本和 Python 一樣,我是不信的,就像我不信 Python 寫的代碼的計算性能跟 C++ 一樣。

所以選擇用什麼編程語言和架構,是性能和成本的綜合考慮。

性能只要達到要求就行了,再快沒有意義。比如大多數 web app 的瓶頸在資料庫 I/O,那麼你計算速度再快也沒有卵用。

成本包括開發的時間、維護的難易程度、團隊學習新技術的時間等等。比如你的團隊有十年 Java 經驗,那麼即使是做一個非常輕快的小項目,那麼也應該用 Java 而不是 Ruby,因為 Java 相對於 Ruby 多出的開發時間可能遠小於團隊學習 Ruby 的時間以及使用不熟悉的技術坑掉的時間。

限於個人經驗我舉得例子都很淺顯,不過道理很簡單,就是要具體問題具體分析,綜合考慮追求凈收益最大化。


靜態類型更容易在寫代碼時查錯,動態類型更容易書寫


經濟基礎決定上層建築.


感覺最近靜態強類型語言有復興的趨勢,比如Swift, Rust, Go......


因為牛人還是少,目前也就看好go


夠浪就不是。


程序設計只有一個問題需要解決:速度。

用C是因為運行速度。

用Python是因為開發速度。

只有java是例外,是因為 方便會計 而設計的


推薦閱讀:

如何將主機上的CVS文件入庫到oracle數據中?
請問寫SQL腳本的算不算程序員?

TAG:編程語言 | Ruby | Python | 腳本語言 | Perl |