Re: [閒聊] 寫程式真的這麼邪門嗎?

看板C_Chat作者 (Args&&... args)時間1年前 (2023/01/26 17:07), 1年前編輯推噓56(56056)
留言112則, 52人參與, 1年前最新討論串5/19 (看更多)
※ 引述《STAV72 (刁民黨黨務主委)》之銘言: : https://i.imgur.com/NLPJc6B.jpg
: 科學家:讚啦!有用了! : 教授:很好,讓我們看看是如何作用跟怎麼作用! : 碼農:讚啦!跑起來了! : 主管:別再碰它,沒人知道會不會無預警當掉。 : 寫程式真的這麼邪門嗎? : 初五開工 這邊用C++給大家玩一個小遊戲 一個hello world等級的小程式 #include<iostream> using namespace std; int main() { int i = 1; cout << i++ <<" "<< i-- << " " << i--; return 0; } A得到結果: 1 2 1 B得到結果: -1 0 1 A的結果對於有C/C++基礎的人 蠻直覺的正確(?) 但是B怎麼感覺先做了兩次i--在輸出 https://i.imgur.com/ooLD9nN.png
思考一下 當你想要說標題上面說的"邪門" 現在我要告訴你 A用的可能是比較新的編譯器 B用的可能是比較舊的編譯器 並且運氣不好 如果B用的是比較舊的編譯器 並且運氣很好 他會得到跟A一樣的結果 因為 同行出現 i++ 與 i 與 << 的operator 此行為在C++17以前為: Undefined Behavior 簡稱UB 中文翻譯是"未定義"行為 但我們常稱UB 也就是語言規格書 沒有規範輸出結果會怎樣 所以會有怎樣的結果 全部由編譯器設計者團隊決定(或者無法決定) 今天這個例子 用白話文說就是: 同一行中 i++與i--與<< 的順序都沒有定義 由編譯器開發者決定 所以B今天從GCC改成Clang 且都是指定C++14或C++11或C++98的情況下 可能會得到一樣的結果 或者說B預期跟A結果一樣 比較符合直覺的 1 2 1 參考資料 有興趣可以去看看 [C++17規格書] https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf [Jserv說UB,大推,也有YT影片] https://hackmd.io/@sysprog/c-undefined-behavior 以下實作收尾 GCC 6.3沒有完整的支援C++17 所以可能得到-1 0 1 這邊是B運氣不好的狀況 https://i.imgur.com/Y9KzLyY.png
GCC 7.0以後完整的支援C++17 所以是符合預期的1 2 1 這邊可能是A的狀況 https://i.imgur.com/CoyEEU1.png
然後clang 5.3沒有完整的支援C++17 卻得到符合預期的1 2 1 並且有丟出警告 這邊可能是A的狀況 也可能是B運氣好的狀況 https://i.imgur.com/z0z125n.png
結論: 0. 其實不能說是邪門,是C++語言規格書沒有看完(?) 1. 歡迎加入clang/llvm的陣營 編譯器提示比較好 2. 請放棄C++這種過時的語言 加入rust/llvm (其實rust也有一些少數的UB 其他程式也有) 有句話這麼說: Rewriting everything with rust! 3. 其他程式語言 多少也有這種UB 然後C/C++這種底層的東西 有些python程式也會摳它 自然繼承了UB 所以在說程式邪門之前 是否這個邪門 是這個所謂的UB所造成的呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.24.212.214 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_Chat/M.1674724075.A.D84.html ※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:12:18

01/26 17:11, 1年前 , 1F
I don't know what it means, but it scares me.
01/26 17:11, 1F

01/26 17:12, 1年前 , 2F
rust 是多好,你已經是第三個在推的人了...我該開
01/26 17:12, 2F

01/26 17:12, 1年前 , 3F
始學了嗎幹....
01/26 17:12, 3F

01/26 17:12, 1年前 , 4F
所以當初VB6.0的團隊真的是爆肝
01/26 17:12, 4F

01/26 17:12, 1年前 , 5F
未定義行為
01/26 17:12, 5F

01/26 17:12, 1年前 , 6F
所以最好不要用這種可能有分歧的寫法阿
01/26 17:12, 6F
但其實好一點的編譯器會拋出警告啦 問題是目前C++/C還有很多UB不會拋出警告 所以我才說歡迎加入 編譯器"非常嚴格"的Rust ※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:14:35

01/26 17:16, 1年前 , 7F
新手入坑主流還是推python吧膠水語言 至少寫點實用小外掛
01/26 17:16, 7F

01/26 17:16, 1年前 , 8F
會有點成就感
01/26 17:16, 8F
真的 其實我工作的時候 也不懂一些人只是用csv畫個圖 卻要用dependency那麼複雜的cern root... python+matplotlib+panda就能搞定的東西.. ※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:17:17

01/26 17:16, 1年前 , 9F
Ola大好像不是新手?
01/26 17:16, 9F

01/26 17:18, 1年前 , 10F
看到膠水語言直接笑出來
01/26 17:18, 10F
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:19:57

01/26 17:19, 1年前 , 11F
話說聽說3.11有把以前錯誤訊息很亂的問題改好 不知道真的
01/26 17:19, 11F

01/26 17:19, 1年前 , 12F
假的
01/26 17:19, 12F
沒 還是rust和clang給的訊息比較有用 python還是老樣子 錯誤訊息只會給stack unwinding ※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:21:05

01/26 17:20, 1年前 , 13F
Rust比較不會有C++這種迭代的問題?
01/26 17:20, 13F

01/26 17:21, 1年前 , 14F
什麼是膠水語言
01/26 17:21, 14F
I have panda I have matplotlib oh~ panplotlib 大概是這樣 ※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:22:23

01/26 17:22, 1年前 , 15F
外掛一般還是用pyinstaller+pyautogui+tkinter吧(然後在
01/26 17:22, 15F

01/26 17:22, 1年前 , 16F
壓成腳本時就會東缺西缺 cv2等等麻煩自己hidden import…
01/26 17:22, 16F

01/26 17:22, 1年前 , 17F
…)
01/26 17:22, 17F

01/26 17:22, 1年前 , 18F
原來還有這種狀況 所以為什麼說python是膠水語言?
01/26 17:22, 18F

01/26 17:22, 1年前 , 19F
膠水語言->我看到這個用法是在形容它什麼都能做
01/26 17:22, 19F

01/26 17:23, 1年前 , 20F
那我就不冒險升級了
01/26 17:23, 20F

01/26 17:25, 1年前 , 21F
膠水語言=>跑得慢,但他能用
01/26 17:25, 21F
居然 我以為是AMD那個膠水CPU的梗 ※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:25:47

01/26 17:26, 1年前 , 22F
一個膠水三種說法w(為啥膠水是跑得慢?
01/26 17:26, 22F

01/26 17:27, 1年前 , 23F
但是用了python就回不去了 社群太方便了
01/26 17:27, 23F

01/26 17:27, 1年前 , 24F
很慢乾掉的意思?
01/26 17:27, 24F

01/26 17:29, 1年前 , 25F
真的 當年還想學lisp 結果社群完全無法比
01/26 17:29, 25F

01/26 17:29, 1年前 , 26F
不過最近實戰發現matlab和wolfram的mathematica還是有些東
01/26 17:29, 26F

01/26 17:29, 1年前 , 27F
西不是社群能輕易取代的
01/26 17:29, 27F

01/26 17:29, 1年前 , 28F
我就是在說你們兩個啦sympy和scipy
01/26 17:29, 28F

01/26 17:30, 1年前 , 29F
膠水乾的比較慢,但他功能是有的,
01/26 17:30, 29F

01/26 17:30, 1年前 , 30F
而且剛好跟python一樣,
01/26 17:30, 30F

01/26 17:30, 1年前 , 31F
適合剛開始勞作(打碼)的人使用
01/26 17:30, 31F

01/26 17:31, 1年前 , 32F
所以rust好在哪
01/26 17:31, 32F
太多了 這可以寫很長一篇 沒人想看完的文章(?) 我舉幾個簡單的說 1. 嚴格的語法 嚴格的編譯器 有句話說 過的了rust的編譯器 沒有拋出錯誤訊息 就是memory safe 也有thread safe 2. 效能近乎C++ 3. 有LLVM的支援,開發、維護編譯器相對容易 ※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:34:05
還有 43 則推文
還有 14 段內文
01/26 20:16, 1年前 , 76F
法寫code 或者乾脆用別的語言
01/26 20:16, 76F

01/26 20:17, 1年前 , 77F
我想是訂標準時,他們不認為會有人在同行裡面塞一堆++在搞
01/26 20:17, 77F

01/26 20:28, 1年前 , 78F
就像為什麼微波爐說明書不會寫不能微波貓狗一樣,到底
01/26 20:28, 78F

01/26 20:29, 1年前 , 79F
誰會沒事做這種噁心事
01/26 20:29, 79F
也可能是Kiss原則吧 因為你要塞這些防火防爆防閨密的東東 勢必會增加編譯器的複雜度 讓編譯器更難開發 clang也只是丟出警告 並不阻止你通過編譯

01/26 20:39, 1年前 , 80F
哥真專業碼農,推
01/26 20:39, 80F

01/26 21:06, 1年前 , 81F
要把軟體用rust重寫應該沒公司會願意,成本太高了,除
01/26 21:06, 81F

01/26 21:06, 1年前 , 82F
非重寫之後有非常巨大的效能進步
01/26 21:06, 82F

01/26 21:06, 1年前 , 83F
很難確保重寫之後不喪失原有的feature,regression有其
01/26 21:06, 83F

01/26 21:06, 1年前 , 84F
侷限性,再來就是重寫過程中客戶issue可不會等你,工程
01/26 21:06, 84F

01/26 21:06, 1年前 , 85F
師又要多線作戰
01/26 21:06, 85F

01/26 21:06, 1年前 , 86F
而且工程師也都沒碰過rust,某種程度都是rust新手,這
01/26 21:06, 86F

01/26 21:06, 1年前 , 87F
樣一來程式品質也不會多高
01/26 21:06, 87F

01/26 21:06, 1年前 , 88F
最後就是rust還不夠主流,就業市場上熟悉C/C++的人肯定
01/26 21:06, 88F

01/26 21:06, 1年前 , 89F
還是大宗,公司若要補人去哪找有豐富rust經驗的人
01/26 21:06, 89F

01/26 21:07, 1年前 , 90F
讓我想起初學程式語言,i++跟++i搞了很久才懂
01/26 21:07, 90F

01/26 21:31, 1年前 , 91F
大型專案的程式碼太龐大了 不太可能換另一套語言改寫
01/26 21:31, 91F

01/26 21:40, 1年前 , 92F
既有的C/C++專案要重寫很難,rust自己在用的LLVM是個例子
01/26 21:40, 92F

01/26 21:42, 1年前 , 93F
大致上是大公司才有能力重寫,rust在管理上方便很多。
01/26 21:42, 93F

01/26 21:43, 1年前 , 94F
另外一個rust的問題是用到LGPL的情況,現在有常用解了嗎?
01/26 21:43, 94F

01/26 22:00, 1年前 , 95F
我好害怕
01/26 22:00, 95F

01/26 22:06, 1年前 , 96F
license 問題 cargo 有 plugin 可以檢查像 cargo deny
01/26 22:06, 96F

01/26 22:15, 1年前 , 97F
rust也能調用其他語言的庫吧?應該不用完全重寫,新
01/26 22:15, 97F

01/26 22:15, 1年前 , 98F
的需求再用就好了這樣?
01/26 22:15, 98F
上面有說了 可能會繼續把ub 或其他不安全的因素繼承下來 但是不怕的話 其實有不少c++的ffi可以摳 比方說opencv就有

01/26 22:49, 1年前 , 99F
push
01/26 22:49, 99F
※ 編輯: dzwei (223.140.209.40 臺灣), 01/26/2023 23:26:32

01/26 23:32, 1年前 , 100F
Rust的需求還是在需要性能跟安全的地方吧 大型專案一旦決
01/26 23:32, 100F

01/26 23:32, 1年前 , 101F
定tech stack 要轉換就很麻煩吧
01/26 23:32, 101F

01/26 23:37, 1年前 , 102F
主要還是遇到瓶頸時才會跟換Discord 的一部份服務就從gol
01/26 23:37, 102F

01/26 23:37, 1年前 , 103F
ang 換成Rust解決垃圾回收的問題
01/26 23:37, 103F

01/27 01:07, 1年前 , 104F
某些老師:好耶C++17 有定義了我要繼續考學生一堆+
01/27 01:07, 104F

01/27 01:07, 1年前 , 105F
+—在同一行的
01/27 01:07, 105F

01/27 01:07, 1年前 , 106F
程式碼
01/27 01:07, 106F

01/27 01:07, 1年前 , 107F
強力推薦 Rust,我已經寫六年了,變成我的主力語言了
01/27 01:07, 107F

01/27 02:54, 1年前 , 108F
某種程度上C++比Rust還難學
01/27 02:54, 108F

01/27 02:54, 1年前 , 109F
01/27 02:54, 109F

01/27 03:52, 1年前 , 110F
01/27 03:52, 110F

01/27 14:38, 1年前 , 111F
這不就你寫垃圾code得到垃圾結果? 幹嘛把運算跟輸出混在
01/27 14:38, 111F

01/27 14:38, 1年前 , 112F
一起
01/27 14:38, 112F
文章代碼(AID): #1ZqaBhs4 (C_Chat)
討論串 (同標題文章)
文章代碼(AID): #1ZqaBhs4 (C_Chat)