Re: [閒聊] 寫程式真的這麼邪門嗎?
: 科學家:讚啦!有用了!
: 教授:很好,讓我們看看是如何作用跟怎麼作用!
: 碼農:讚啦!跑起來了!
: 主管:別再碰它,沒人知道會不會無預警當掉。
: 寫程式真的這麼邪門嗎?
:
初五開工
這邊用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
01/26 17:11, 1F
推
01/26 17:12,
1年前
, 2F
01/26 17:12, 2F
→
01/26 17:12,
1年前
, 3F
01/26 17:12, 3F
推
01/26 17:12,
1年前
, 4F
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
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
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
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
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
01/26 17:22, 15F
→
01/26 17:22,
1年前
, 16F
01/26 17:22, 16F
→
01/26 17:22,
1年前
, 17F
01/26 17:22, 17F
推
01/26 17:22,
1年前
, 18F
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
01/26 17:26, 22F
推
01/26 17:27,
1年前
, 23F
01/26 17:27, 23F
→
01/26 17:27,
1年前
, 24F
01/26 17:27, 24F
→
01/26 17:29,
1年前
, 25F
01/26 17:29, 25F
→
01/26 17:29,
1年前
, 26F
01/26 17:29, 26F
→
01/26 17:29,
1年前
, 27F
01/26 17:29, 27F
→
01/26 17:29,
1年前
, 28F
01/26 17:29, 28F
推
01/26 17:30,
1年前
, 29F
01/26 17:30, 29F
→
01/26 17:30,
1年前
, 30F
01/26 17:30, 30F
→
01/26 17:30,
1年前
, 31F
01/26 17:30, 31F
推
01/26 17:31,
1年前
, 32F
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
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
01/26 21:06, 81F
→
01/26 21:06,
1年前
, 82F
01/26 21:06, 82F
→
01/26 21:06,
1年前
, 83F
01/26 21:06, 83F
→
01/26 21:06,
1年前
, 84F
01/26 21:06, 84F
→
01/26 21:06,
1年前
, 85F
01/26 21:06, 85F
→
01/26 21:06,
1年前
, 86F
01/26 21:06, 86F
→
01/26 21:06,
1年前
, 87F
01/26 21:06, 87F
→
01/26 21:06,
1年前
, 88F
01/26 21:06, 88F
→
01/26 21:06,
1年前
, 89F
01/26 21:06, 89F
推
01/26 21:07,
1年前
, 90F
01/26 21:07, 90F
→
01/26 21:31,
1年前
, 91F
01/26 21:31, 91F
推
01/26 21:40,
1年前
, 92F
01/26 21:40, 92F
→
01/26 21:42,
1年前
, 93F
01/26 21:42, 93F
→
01/26 21:43,
1年前
, 94F
01/26 21:43, 94F
推
01/26 22:00,
1年前
, 95F
01/26 22:00, 95F
推
01/26 22:06,
1年前
, 96F
01/26 22:06, 96F
推
01/26 22:15,
1年前
, 97F
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
01/26 22:49, 99F
※ 編輯: dzwei (223.140.209.40 臺灣), 01/26/2023 23:26:32
推
01/26 23:32,
1年前
, 100F
01/26 23:32, 100F
→
01/26 23:32,
1年前
, 101F
01/26 23:32, 101F
推
01/26 23:37,
1年前
, 102F
01/26 23:37, 102F
→
01/26 23:37,
1年前
, 103F
01/26 23:37, 103F
推
01/27 01:07,
1年前
, 104F
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
01/27 01:07, 107F
推
01/27 02:54,
1年前
, 108F
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
01/27 14:38, 111F
→
01/27 14:38,
1年前
, 112F
01/27 14:38, 112F
討論串 (同標題文章)