腳本類語言真的方便嗎?
我是一名編程經驗不算豐富的普通 Java 程序員,由於工作需要,這兩天首次用 Python 寫了一點正經的東西(Python 雖然學了一段時間,但一直沒正式使用過),單從語言角度,確實讓我覺得比 Java 方便不少,但是在實際編碼的過程中,發現了一個問題,IDE 的代碼提示太弱(我用的是 pydev),調用函數的時候,很多時候都要進入源碼查看,甚至直接調出 ipython,help,dir 一番,語言便捷所節省下來的時間,貌似都花在這些操作上了,寫代碼的時候,完全沒有寫 Java 時那種一氣呵成的感覺,難道真要去背 API?
和邏輯相關的思維活動,一般有兩個步驟。第一,是用邏輯符號驗證頭腦中的想法;第二,是用「改進過」的邏輯符號表達來讓他人理解已經驗證過的想法。
邏輯思維是人腦進化到最近幾萬年的產物。「邏輯」這個工具固然強大,但是人腦前幾百萬年的進化遺產顯然還沒有,而且似乎也永遠不會完全向「邏輯」靠攏。這樣就造成一個問題。從邏輯的角度來看,人腦的活動有點「天馬行空」。容易在關鍵點上產生跳躍。所以,有時候頭腦中的一閃念看起來不錯,用嚴密的邏輯符號寫到紙上,就會發現根本行不通:幸運的話,稍稍修改,不幸的話,可能整個想法都要推倒重來。
所以,人們發明了很多嚴密形式化邏輯符號來幫助大腦。但是這樣的邏輯符號必須有一個特點:使用流暢,盡量避免干擾大腦本身的思維。比如說,牛頓和萊布尼茨發明微積分的時候都使用自己的符號,這很好,只要不影響他們自己的思路。
接下來,你必須把自己用符號驗證過的想法介紹給別人,因為,你的想法必須併入到已有的邏輯系統中,才能發揮僅憑一人之力無法達到的功效(包括你驗證自己的想法時也利用了別人的很多想法)。這時就需要更加便於交流的符號。
軟體開發是最容易出現最初的想法和實際邏輯產生出入的地方。所以,對第一種邏輯符號的需求產生了高級動態語言。軟體開發又是最需要大規模協作的邏輯活動,所以,對第二種邏輯符號的需求產生了靜態類型系統。所以,高級動態語言的價值在於,在初次把想法變成 code 的時候維持高速度的 flow of thought。這通過兩方面完成:第一,高級動態語言無需編譯,有更快的 REPL 速度;第二,高級動態語言沒有語言冗餘(語言冗餘是靜態類型系統的重要部分,靜態類型系統通過語言冗餘來檢查語言中容易出現的錯誤),所以思路的變化和 code 的修改往往一一對應,避免思路發生小改動的時候 code 必須修改多處,導致思維中斷。
目前軟體開發的一大難題是:兩種符號很難相互轉換。所以,很多團隊為了長遠利益,放棄了第一步(頭腦想法驗證)的效率。還有一些其他原因。比如說:C 語言設計的確實不錯,所以用 C 來完成第一步,雖然效率比不上高級動態語言,但是也差強人意,同時又保證了第二步的效率。
所以,全部用靜態語言,避免採用高級動態語言,有其合理性。不過我認為,在這個問題上業界還需要多種嘗試。特別是 Lua 這種具備優秀的 C 介面的高級動態語言,可能會提供一種在第一步和第二步之間平滑過渡的機制。
「UNIX傳統上認為,一行腳本勝過萬行C代碼。」——《無根的根》
脫離環境談語言都是湊牛氓
取決於你要幹什麼,我常常切換於Java, PHP,Python和Bash,完全取決於目的,駕馭工具,選擇工具,工具才好用,借用知乎里看見的一句話,"當你手上有一把鎚子的時候,看所有的東西都是釘子;當你手上有個釘子的時候,看所有的東西都是鎚子。"
編程是一種平衡的藝術。比如平衡程序運行效率和開發效率。
各種語言、工具都會一點,各種組合搞起來,可能能獲得更好一點的解決方案。
我的生產代碼不是JS,但是我這麼多年也一直用JS寫各種批量處理的腳本,是我的工作流程更加合理、效率更高。用相伴我10餘年的JavaScript,我可以隨時寫一段測試演算法偽代碼,類,屬性均不需要定義,UI元素HTML,方便極了。
我一直認為動態語言
- 開發效率成問題。由於沒有強類型,API所需的參數如何構造毫無提示性,非要看文檔不可
- 深度重構更是夢魘
所以你說的沒錯,Java/C#是更優的選擇
你這標題來的....問號太多餘了,相對與java寫個「hello world」都需要先定義一個class,你說腳本語言是不是方便。你代碼寫到現在,還在糾結於IDE功能太弱了?何況python需要IDE嗎算了,你試試 pycharm 吧,還不能滿足你的話,那額……
邂逅NodeJS後,我才發現JS的世界是如此的廣闊,如此的讓人興奮。另外,依賴代碼提示和不看源碼不是個好的coder。
腳本語言的方便我感覺是不需要編譯啊 抬手F5我就能跑了~相對C++編譯半個世紀真是坑爹,有點BUG python改改我又開跑了,C++我改改又是半個世紀過去了。
真的方便
推薦閱讀:
※字元串在各類語言里是怎麼處理的?
※為什麼 Win7 CMD 下執行兩條 copy 命令,其中一條會完整匹配擴展名而另一條不會?
※為什麼十年來新興的編程語言,大多是動態類型語言?
※如何將主機上的CVS文件入庫到oracle數據中?
※請問寫SQL腳本的算不算程序員?