※ 本文轉寄自 ptt.cc 更新時間: 2023-01-26 19:01:19
看板 C_Chat
作者 標題 Re: [閒聊] 寫程式真的這麼邪門嗎?
時間 Thu Jan 26 17:07:50 2023
※ 引述《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 (臺灣)
※ 作者: dzwei 2023-01-26 17:07:50
※ 文章代碼(AID): #1ZqaBhs4 (C_Chat)
※ 文章網址: https://www.ptt.cc/bbs/C_Chat/M.1674724075.A.D84.html
※ 同主題文章:
01-26 10:11 ■ [閒聊] 寫程式真的這麼邪門嗎?
01-26 16:31 ■ Re: [閒聊] 寫程式真的這麼邪門嗎?
● 01-26 17:07 ■ Re: [閒聊] 寫程式真的這麼邪門嗎?
01-26 23:08 ■ Re: [閒聊] 寫程式真的這麼邪門嗎?
02-10 20:51 ■ Re: [閒聊] 寫程式真的這麼邪門嗎?
02-10 21:33 ■ Re: [閒聊] 寫程式真的這麼邪門嗎?
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:12:18
但其實好一點的編譯器會拋出警告啦
問題是目前C++/C還有很多UB不會拋出警告
所以我才說歡迎加入
編譯器"非常嚴格"的Rust
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:14:35
真的 其實我工作的時候
也不懂一些人只是用csv畫個圖
卻要用dependency那麼複雜的cern root...
python+matplotlib+panda就能搞定的東西..
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:17:17
沒
還是rust和clang給的訊息比較有用
python還是老樣子
錯誤訊息只會給stack unwinding
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:21:05
I have panda
I have matplotlib
oh~
panplotlib
大概是這樣
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:22:23
居然
我以為是AMD那個膠水CPU的梗
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:25:47
太多了 這可以寫很長一篇
沒人想看完的文章(?)
我舉幾個簡單的說
1. 嚴格的語法 嚴格的編譯器
有句話說 過的了rust的編譯器
沒有拋出錯誤訊息
就是memory safe
也有thread safe
2. 效能近乎C++
3. 有LLVM的支援,開發、維護編譯器相對容易
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:34:05
現在要吹捧rust不是用火狐了啦
是amazon做的s2n-quic
一個QUIC的rust實作方式
這個是有大量的應用的
現在火狐團隊根本射後不理
其實難度也沒比C++簡單到哪去
他只是拋掉很多C++98的歷史包袱
全部modern C++的觀念套進去
就是rust了
modern C++其實並不簡單
所以rust也不簡單
建議有modern C++的概念
再來玩轉rust
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:43:39
沒 你看我C++/C的UB寫了那麼多東西(?)
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:53:06
這本來就是有點C語言基礎人
需要關注的議題XD
礙於篇幅不方便寫太多
剩下的去看我前面貼的
Jserv說的那個吧
裡面也有YT連結
個人估計至少要十年了
但也是有它難學的地方XD
別這樣說
大家的瀏覽器都靠js的QQ
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 18:15:38
不過有standard真的是好是
rust還沒那麼一個完整的standard
iso那種的standard
前面說的
這樣ub或unsafe也會跟著繼承下來
rust的著學就是Rewriting
雖然官方repo還是找的到
很多binding就是
熱門的套件沒時間重寫
還是得依賴binding
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 18:49:29
--
推 : I don't know what it means, but it scares me.1F 01/26 17:11
推 : rust 是多好,你已經是第三個在推的人了...我該開2F 01/26 17:12
→ : 始學了嗎幹....
→ : 始學了嗎幹....
推 : 所以當初VB6.0的團隊真的是爆肝4F 01/26 17:12
→ : 未定義行為5F 01/26 17:12
→ : 所以最好不要用這種可能有分歧的寫法阿6F 01/26 17:12
但其實好一點的編譯器會拋出警告啦
問題是目前C++/C還有很多UB不會拋出警告
所以我才說歡迎加入
編譯器"非常嚴格"的Rust
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:14:35
推 : 新手入坑主流還是推python吧膠水語言 至少寫點實用小外掛7F 01/26 17:16
→ : 會有點成就感
→ : 會有點成就感
真的 其實我工作的時候
也不懂一些人只是用csv畫個圖
卻要用dependency那麼複雜的cern root...
python+matplotlib+panda就能搞定的東西..
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:17:17
→ : Ola大好像不是新手?9F 01/26 17:16
→ : 看到膠水語言直接笑出來10F 01/26 17:18
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:19:57推 : 話說聽說3.11有把以前錯誤訊息很亂的問題改好 不知道真的11F 01/26 17:19
→ : 假的
→ : 假的
沒
還是rust和clang給的訊息比較有用
python還是老樣子
錯誤訊息只會給stack unwinding
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:21:05
推 : Rust比較不會有C++這種迭代的問題?13F 01/26 17:20
推 : 什麼是膠水語言14F 01/26 17:21
I have panda
I have matplotlib
oh~
panplotlib
大概是這樣
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:22:23
→ : 外掛一般還是用pyinstaller+pyautogui+tkinter吧(然後在15F 01/26 17:22
→ : 壓成腳本時就會東缺西缺 cv2等等麻煩自己hidden import…
→ : …)
→ : 壓成腳本時就會東缺西缺 cv2等等麻煩自己hidden import…
→ : …)
推 : 原來還有這種狀況 所以為什麼說python是膠水語言?18F 01/26 17:22
→ : 膠水語言->我看到這個用法是在形容它什麼都能做19F 01/26 17:22
→ : 那我就不冒險升級了
→ : 那我就不冒險升級了
推 : 膠水語言=>跑得慢,但他能用21F 01/26 17:25
居然
我以為是AMD那個膠水CPU的梗
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:25:47
推 : 一個膠水三種說法w(為啥膠水是跑得慢?22F 01/26 17:26
推 : 但是用了python就回不去了 社群太方便了23F 01/26 17:27
→ : 很慢乾掉的意思?24F 01/26 17:27
→ : 真的 當年還想學lisp 結果社群完全無法比
→ : 不過最近實戰發現matlab和wolfram的mathematica還是有些東
→ : 西不是社群能輕易取代的
→ : 我就是在說你們兩個啦sympy和scipy
→ : 真的 當年還想學lisp 結果社群完全無法比
→ : 不過最近實戰發現matlab和wolfram的mathematica還是有些東
→ : 西不是社群能輕易取代的
→ : 我就是在說你們兩個啦sympy和scipy
推 : 膠水乾的比較慢,但他功能是有的,29F 01/26 17:30
→ : 而且剛好跟python一樣,
→ : 適合剛開始勞作(打碼)的人使用
→ : 而且剛好跟python一樣,
→ : 適合剛開始勞作(打碼)的人使用
推 : 所以rust好在哪32F 01/26 17:31
太多了 這可以寫很長一篇
沒人想看完的文章(?)
我舉幾個簡單的說
1. 嚴格的語法 嚴格的編譯器
有句話說 過的了rust的編譯器
沒有拋出錯誤訊息
就是memory safe
也有thread safe
2. 效能近乎C++
3. 有LLVM的支援,開發、維護編譯器相對容易
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:34:05
推 : 你可以等 moz://a 把 firefox 用 rust 重寫再來學啊33F 01/26 17:31
現在要吹捧rust不是用火狐了啦
是amazon做的s2n-quic
一個QUIC的rust實作方式
這個是有大量的應用的
現在火狐團隊根本射後不理
→ : 推Python社群真的好用34F 01/26 17:32
推 : 最近學Rust analysis超強35F 01/26 17:34
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:36:35→ : rust感覺有勢頭 不過自學好懶36F 01/26 17:36
其實難度也沒比C++簡單到哪去
他只是拋掉很多C++98的歷史包袱
全部modern C++的觀念套進去
就是rust了
modern C++其實並不簡單
所以rust也不簡單
建議有modern C++的概念
再來玩轉rust
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:43:39
推 : 原來是來傳教的(誤37F 01/26 17:44
沒 你看我C++/C的UB寫了那麼多東西(?)
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:53:06
推 : 謝謝 完全看不懂38F 01/26 17:54
這本來就是有點C語言基礎人
需要關注的議題XD
礙於篇幅不方便寫太多
剩下的去看我前面貼的
Jserv說的那個吧
裡面也有YT連結
推 : 感覺要普及還要一段時間吧 畢竟太多專案用c/c++寫的39F 01/26 17:56
個人估計至少要十年了
推 : …還好我不靠寫code謀生40F 01/26 17:56
推 : 算小型的跨平台FLAC專案 下載最新的VC和SDK 編譯過關沒出錯41F 01/26 18:05
→ : 但老邁又封閉歷經無數接手的大型違章建築 就難說順不順利XD
→ : 但老邁又封閉歷經無數接手的大型違章建築 就難說順不順利XD
推 : 真的 rust才是未來43F 01/26 18:08
但也是有它難學的地方XD
推 : 未定義行為就跟js一樣糞44F 01/26 18:10
別這樣說
大家的瀏覽器都靠js的QQ
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 18:15:38
推 : 恩恩 我也是這樣想45F 01/26 18:21
推 : 推這篇 有趣46F 01/26 18:25
推 : C&C++還有implementaion defined,也是個用不同complier會有47F 01/26 18:33
→ : 不同結果的地方, 都需要讀過standard, 相當麻煩XD
→ : 不同結果的地方, 都需要讀過standard, 相當麻煩XD
不過有standard真的是好是
rust還沒那麼一個完整的standard
iso那種的standard
→ : rust沒法相容C++ABI,就是和歷史作對50F 01/26 18:44
前面說的
這樣ub或unsafe也會跟著繼承下來
rust的著學就是Rewriting
雖然官方repo還是找的到
很多binding就是
熱門的套件沒時間重寫
還是得依賴binding
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 18:49:29
推 : js更可怕51F 01/26 18:49
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 18:52:03→ : 其實我真的很佩服寫JS的人 就是因為我真的學不來52F 01/26 18:54
→ : 看得滿頭問號QQ
→ : 看得滿頭問號QQ
--
※ 看板: ACG 文章推薦值: 0 目前人氣: 0 累積人氣: 356
作者 dzwei 的最新發文:
- 智麻惠小隊 公主連結的小小甜心 3倍的3個ㄌㄌU149 然後這三個ㄌㄌ我不能說 大家會想到那些ㄌㄌ團體由三個ㄌㄌ組成呢?29F 24推 1噓
- 7F 3推 4噓
- 19F 13推
點此顯示更多發文記錄
回列表(←)
分享