原文:Sachin FromDev 編譯:伯樂線上 –劉志軍
每個人都在想,為什麼大家都在選擇靜態語言,當你準備選擇一門動態語言的時候,卻又冒出瞭如此多的兄弟語言。我們通常考慮的是,哪種語言是我熟練的,那就拿它來做這項工作。總之這做不失為一種著手開乾的好方法。現在還有別的什麼影響你的選擇嗎?測試?開發速度?還是程式的健壯性?
動態型 VS 靜態型
動態語言是一種變數使用前不需要宣告的語言,如 Python、Ruby 和PHP,在動態語言中,還可以像下面這樣做。
1 |
num = 10 |
某種意義上來說,這卻是一把雙刃劍,因為動態語言的型別檢查是在程式執行期間,程式碼執行前沒有任何辦法找出 bug。我知道你可以寫測試,但是你並不能測試任何事情。這裡有一個雖然不重要的例子。
1 2 3 4 |
def get_first_problem(problems): for problem in problems: problam = problem + 1 return problam |
現在如果你被一些嚴重的電子樂干擾著,一個縮排的錯誤很輕易的就忽略了,程式碼弄完了然後部署到生產環境中,於是bug就接踵而來了。
記住,在生產環境中你是唯一能消滅bug的人。
靜態語言 :使用前變數需要宣告,編譯的時候需要型別檢查,包括Java、C、C++在內的語言都是靜態語言。
1 2 3 |
static int awesomeNumber; awesomeNumber = 10; |
關於健壯性的增加和執行時錯誤機會的減少有很多的爭論,編譯器能捕獲一些在你編碼的時候產生的令人討厭的錯誤,方法的契約是嚴格的,不好的地方就是沉重的樣板程式碼。
弱型別 VS 強型別
弱型別和強型別經常與動態語言和靜態語言混淆起來。弱型別語言會引起一些哲學性問題如數字2和字元”two“的相加,在弱型別語言中像這樣做是沒問題的。
1 2 3 4 5 |
a = 2 b = "2" concatenate(a, b) // Returns "22" add(a, b) // Returns 4 |
傳統的語言將嚴格限制各種事務的出現,如強型別語言中字元與整型相加將導致錯誤,如下:
1 2 3 4 5 6 7 |
>>> a = 10 >>> b = 'ten' >>> a + b Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for +: 'int' and 'str' >>> |
總結:
無論你在哪抨擊這篇討論,宣告總比前者好,因為前者會導致一場語言的戰爭。
動態語言適合快速週期開發和原型設計。靜態語言更適合長期的開發週期,零碎的bug非常會付出非常高的代價(電話通訊系統,航空交通系統)例如,如果一巨頭公司叫Moo Corp,花了幾百萬美元在做QA和測試,一bug以某種方式陷入在這個領域中,為了修復意味著另一個輪的測試。當你做在板凳上你要做的就是選擇一種簡潔的靜態語言,這項工作的難度就是得有人做”擠奶”的事。
測試、測試、還是測試
僅僅就一點點資料為了用來思考、啟動下一個專案,你從來就不知道哪些限制你可能放在你自己和你的團隊身上。
當你為你的專案選擇一門程式語言時,你考慮的因素有哪些呢?
原文:Sachin FromDev 編譯:伯樂線上 –劉志軍
【如需轉載,請標註並保留原文連結、譯文連結和譯者等資訊,謝謝合作!】