新語言學習

2022-07-16 22:33:15 字數 1607 閱讀 1468

用過的語言按時序算:c++、lua(粗淺指令碼)、erlang、c#(unity)、lua、go。印象最深的是erlang,因為特別吃虧,嗯。

那會連多執行緒、多程序都不怎麼了解,雖然看了erlang的程序通訊模型,mail_box、gen_server原理,但不理解什麼時候要它們。還有遞迴為主的編碼方式,也不大習慣。

……以上不是本是要說的重點:技術上的東西,時間夠,多用用就熟絡了,且專案組對新人也有足夠的寬容度。

更緊要的是那些「安全性」上的東西,尤其對已發布的專案而言。

自己以往編碼,把幾乎全部精力放在把握「邏輯脈絡」上,切換到新語言後連犯好幾回錯。一直在想為什麼,以為細心、嚴謹方面的理由不夠充分(當然確有些高手真的很細緻,能考慮到方方面面~)。

近半年後,某次看著專案裡一片片的**,大家寫了那麼多,忽然意識到:把業務邏輯寫對並不是難事(寫好另當別論),那麼多人寫了那麼多……業務邏輯,理清之後在編碼中算是比較粗枝大葉的了。可算人人都能寫,效率差別而已,且這類邏輯上的錯誤、疏漏也更容易發現。據實際專案經歷看來,外網損失極少是業務邏輯疏漏造成的。什麼最多?邊邊角角的東西——臨界值、空指標、引數檢驗、下標越界、析構**不充分……這些傢伙還比較難在測試中覆蓋到,稍不留神就放出去了。

還碰到客戶端同事,自測試乙個合作功能老報錯,下狠心單步到c++底層,發現建構函式裡指標沒初始化。致電合作方開發者,溝通不是很順暢,只聽他爆了一句:「你在質疑我的專業性嗎?」

霸氣十足,當場心動!

很希望自己往後也有資格講這樣的話。

排程回重點:實際開發裡,語法/用法其實是第二梯隊關注度,最重要的是了解語言特有坑點( ̄﹁ ̄)~

比如c++的空指標,stl迭代器的實效,容器遍歷it在某個分枝裡木有++it,new/delete的恆久匹配,記憶體操作的越界防範,丟進函式算出個小標再訪問陣列……

比如看到erlang的併發,就要想到ets裡的資料是共享的,大夥都能讀寫,所以彼此互動時,得gen_server套一層;它函式的多分枝式遞迴寫法,提供了新的死迴圈形式——同個函式分枝間無限蹦躂(~ ̄▽ ̄~) 啊哈

作為動態語言,變數可匹配任意型別,許多函式的返回帶有錯誤碼,但無法從宣告中看出。常常順手一用就忘記判斷了。尤其取資料介面,不似c++用指標作返回值,無腦判斷空指標即可,形式統一(留個小心眼,所有get、find方法都是可能失敗的,凡是此語義的函式,都檢查返回值)。

再比如lua的table引用傳遞,當引數傳來傳去,指不定哪哪改下,原始資料就變了,搞不好還是配置資料。一樣有erlang動態語義,檢查nil返回的問題……關鍵是不方便判定哪些函式要檢查哇~

c#,變數都是引用,連續使用閉包,觸發**時,很可能捕獲的是同一value,上**

for (int i = 1; i <= 7; ++i)

了解c++11的lambda表示式,知曉其有「[=]、[&]」兩種捕獲方式便可理解其原理。

修補也就有了針對性:迴圈體內加一句「int idx = i」,重新生產變數給閉包即可。

最近用的go,發現的乙個大坑,range迴圈,值傳遞,比lua的ipair危險好多。尤其涉及狀態改變時候(比如用框架**中),迴圈體內的更改可能都是無效的,出了bug藏得還深( ̄^ ̄),跟同事商議後決定禁止用它了。

最後:各個語言函式庫的坑點,彼此差別很大,需額外關注,常用介面自己寫**試試邊界情況,無論它多麼簡單。

怎樣學習新語言

作為乙個c 出身的程式設計師,好多語言看起來都很陌生,但是又十分有吸引力 python perl ruby lisp luahaskell ocaml 其實學習一門語言的過程並不簡單,需要花費很多的時間來與它建立親密的關係,淺嘗輒止基本上是不能領會其中的奧秘的。但是無論如何,學習的指令碼不能停止。對...

語言學習 Python學習

1.關於識別符號 python 中的識別符號是區分大小寫的。以下劃線開頭的識別符號是有特殊意義的。以單下劃線開頭 foo 的代表不能直接訪問的類屬性,需通過類提供的介面進行訪問,不能用 from import 而匯入 以雙下劃線開頭的 foo 代表類的私有成員 以雙下劃線開頭和結尾的 foo 代表 ...

SQL 語言學習

一.插入刪除索引,測速 declare d datetime set d getdate select from cvtuser select 語句執行花費時間 毫秒 datediff ms,d,getdate update testrelation set dif4 0,dif5 0 drop i...