Re: [閒聊] 寫程式真的這麼邪門嗎?
※ 引述《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所造成的呢?
--
I don't know what it means, but it scares me.
rust 是多好,你已經是第三個在推的人了...我該開
始學了嗎幹....
所以當初VB6.0的團隊真的是爆肝
未定義行為
所以最好不要用這種可能有分歧的寫法阿
但其實好一點的編譯器會拋出警告啦 問題是目前C++/C還有很多UB不會拋出警告 所以我才說歡迎加入 編譯器"非常嚴格"的Rust
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:14:35新手入坑主流還是推python吧膠水語言 至少寫點實用小外掛
會有點成就感
真的 其實我工作的時候 也不懂一些人只是用csv畫個圖 卻要用dependency那麼複雜的cern root... python+matplotlib+panda就能搞定的東西..
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:17:17Ola大好像不是新手?
看到膠水語言直接笑出來
話說聽說3.11有把以前錯誤訊息很亂的問題改好 不知道真的
假的
沒 還是rust和clang給的訊息比較有用 python還是老樣子 錯誤訊息只會給stack unwinding
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:21:05Rust比較不會有C++這種迭代的問題?
什麼是膠水語言
I have panda I have matplotlib oh~ panplotlib 大概是這樣
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:22:23外掛一般還是用pyinstaller+pyautogui+tkinter吧(然後在
壓成腳本時就會東缺西缺 cv2等等麻煩自己hidden import…
…)
原來還有這種狀況 所以為什麼說python是膠水語言?
膠水語言->我看到這個用法是在形容它什麼都能做
那我就不冒險升級了
膠水語言=>跑得慢,但他能用
居然 我以為是AMD那個膠水CPU的梗
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:25:47一個膠水三種說法w(為啥膠水是跑得慢?
但是用了python就回不去了 社群太方便了
很慢乾掉的意思?
真的 當年還想學lisp 結果社群完全無法比
不過最近實戰發現matlab和wolfram的mathematica還是有些東
西不是社群能輕易取代的
我就是在說你們兩個啦sympy和scipy
膠水乾的比較慢,但他功能是有的,
而且剛好跟python一樣,
適合剛開始勞作(打碼)的人使用
所以rust好在哪
太多了 這可以寫很長一篇 沒人想看完的文章(?) 我舉幾個簡單的說 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 重寫再來學啊
現在要吹捧rust不是用火狐了啦 是amazon做的s2n-quic 一個QUIC的rust實作方式 這個是有大量的應用的 現在火狐團隊根本射後不理
推Python社群真的好用
最近學Rust analysis超強
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連結
感覺要普及還要一段時間吧 畢竟太多專案用c/c++寫的
個人估計至少要十年了
…還好我不靠寫code謀生
算小型的跨平台FLAC專案 下載最新的VC和SDK 編譯過關沒出錯
但老邁又封閉歷經無數接手的大型違章建築 就難說順不順利XD
真的 rust才是未來
但也是有它難學的地方XD
未定義行為就跟js一樣糞
別這樣說 大家的瀏覽器都靠js的QQ
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 18:15:38恩恩 我也是這樣想
推這篇 有趣
C&C++還有implementaion defined,也是個用不同complier會有
不同結果的地方, 都需要讀過standard, 相當麻煩XD
不過有standard真的是好是 rust還沒那麼一個完整的standard iso那種的standard
rust沒法相容C++ABI,就是和歷史作對
前面說的 這樣ub或unsafe也會跟著繼承下來 rust的著學就是Rewriting 雖然官方repo還是找的到 很多binding就是 熱門的套件沒時間重寫 還是得依賴binding
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 18:49:29js更可怕
其實我真的很佩服寫JS的人 就是因為我真的學不來
看得滿頭問號QQ
何不用scanf跟printf,cin 跟cout個人覺得難用
cin 跟cout個人覺得難用+1
類似我前面那段 printf("%d %d %d\n", i++, i--, i--); 這也是UB哦 cout的好處是compiler 可以自動推斷性別 雖然特殊性別還是要對cout動點手腳就是
rust不用太神話,雖然它算目前少數以安全為第一目標的語言
我覺得 他光是能成為linux kernel 6.0 的第二開發語言 已經夠神了 你看c++20幾年了都沒有這樣XD
※ 編輯: dzwei (223.140.209.40 臺灣), 01/26/2023 19:11:19the book裡面都示範怎麼寫個safe但會memory leak的code了w
好奇rust到底能不能在效能上超越C?
c&cpp版都開放可以問rust問題,候捷又退出翻譯圈,感覺c
pp真的沒啥未來了
C++我怎麼印象沒穩定ABI,有穩定ABI的是C。
我寫js,我很佩服寫C跟C++的人,我腦袋會燒掉
type用型態啦 形別打錯字看起來變奇怪的東西惹
我反而佩服寫js的,到底為啥不會被那個機掰語法搞瘋
https://i.imgur.com/5pFXFbR.jpg 我也很佩服寫JS的人
js繞過那個g8語法後就習慣了
這的確不是邪門 因為C++ compiler真的改個版就天下大亂
比較邪門的通常會出現在大系統裡 用比較高階的語言
去寫不同的module 然後各種巧合發生才造成的
這種結果by編譯器寫法的狀況 以前高考有出過 我氣到寫申
訴 然後他們回我改考卷的教授會斟酌批改...
c++ 沒未來XDD
要是誰讓我看到他寫這種狗屎爛扣,我一定打斷他的腿
我早就看 i = ++j 與 i = j++ 這種扣不爽很久了== 雖然不是ub 但是很惱人 python跟rust還有一些更先進的語言 都把他拿掉了
到底為什麼不先定義 故障與否交給編譯器決定很好玩?
為什麼不定義這個要問開發者 使用者只能避免用未定義語
法寫code 或者乾脆用別的語言
我想是訂標準時,他們不認為會有人在同行裡面塞一堆++在搞
就像為什麼微波爐說明書不會寫不能微波貓狗一樣,到底
誰會沒事做這種噁心事
也可能是Kiss原則吧 因為你要塞這些防火防爆防閨密的東東 勢必會增加編譯器的複雜度 讓編譯器更難開發 clang也只是丟出警告 並不阻止你通過編譯
哥真專業碼農,推
要把軟體用rust重寫應該沒公司會願意,成本太高了,除
非重寫之後有非常巨大的效能進步
很難確保重寫之後不喪失原有的feature,regression有其
侷限性,再來就是重寫過程中客戶issue可不會等你,工程
師又要多線作戰
而且工程師也都沒碰過rust,某種程度都是rust新手,這
樣一來程式品質也不會多高
最後就是rust還不夠主流,就業市場上熟悉C/C++的人肯定
還是大宗,公司若要補人去哪找有豐富rust經驗的人
讓我想起初學程式語言,i++跟++i搞了很久才懂
大型專案的程式碼太龐大了 不太可能換另一套語言改寫
既有的C/C++專案要重寫很難,rust自己在用的LLVM是個例子
大致上是大公司才有能力重寫,rust在管理上方便很多。
另外一個rust的問題是用到LGPL的情況,現在有常用解了嗎?
我好害怕
license 問題 cargo 有 plugin 可以檢查像 cargo deny
rust也能調用其他語言的庫吧?應該不用完全重寫,新
的需求再用就好了這樣?
上面有說了 可能會繼續把ub 或其他不安全的因素繼承下來 但是不怕的話 其實有不少c++的ffi可以摳 比方說opencv就有
push
Rust的需求還是在需要性能跟安全的地方吧 大型專案一旦決
定tech stack 要轉換就很麻煩吧
主要還是遇到瓶頸時才會跟換Discord 的一部份服務就從gol
ang 換成Rust解決垃圾回收的問題
某些老師:好耶C++17 有定義了我要繼續考學生一堆+
+—在同一行的
程式碼
強力推薦 Rust,我已經寫六年了,變成我的主力語言了
某種程度上C++比Rust還難學
推
這不就你寫垃圾code得到垃圾結果? 幹嘛把運算跟輸出混在
一起
爆
首Po科學家:讚啦!有用了! 教授:很好,讓我們看看是如何作用跟怎麼作用! 碼農:讚啦!跑起來了! 主管:別再碰它,沒人知道會不會無預警當掉。7
嗯 就算你寫的是C/C++ 也已經是「高階語言」 真的要探究 要了解的東西太多太多15
: 1/sqrt(x) 用神秘的數字y=0x5f3759df 帶入: y+y*(1.5-(x*y^2)/2) 後直接算出來 或是:47
畢竟嚴格來說 只有自然科學才是科學 其他學科因為變數太多 很難嚴格的用科學方法來解決問題 反而很多時候都是經驗主義 甚至有些迷信 以寫程式來說 比起科學他反而更接近工程學 工程學很講究實用主義8
之前有陣子做實驗趕著出結果 會開好幾個程式同時去跑好幾個不同的數據 但很常隔天起床看就發現電腦當機了 原本以為是工作量太大電腦扛不住 試過加記憶體、重開機、減少數據量4
針對inverse square root 其實回覆提供的文章沒有很好的解釋神秘數字的由來 我認為這部影片講解得很清楚 簡單來說是利用浮點數bit representation與log base 2近似的特性58
? : 其他學科因為變數太多 很難嚴格的用科學方法來解決問題 : 反而很多時候都是經驗主義 甚至有些迷信 : 以寫程式來說 比起科學他反而更接近工程學 : 工程學很講究實用主義7
呃 講這個其實蠻尷尬的 因為綠乖乖是最省錢的解(?)XD 一般來說要提升程式碼品質 一些軟體工程的東西要確實執行9
話說理工科的人 不是最講究實驗跟理論嗎 怎麼問題一出現 沒有辦法的時候 就突然迷信起乖乖起來了4
其實軟體工程品質在許多業界 還是有在要求的 甚至是成為規範跟SOP 像在以下的業界: ‧ 汽車 ‧ 航空航太和國防 ‧ 醫療設備
20
[請益] 私立科大大四生未來方向如題 是這樣的 小弟目前就讀私立科大,剛升大四,看學分只剩6個選修了 應該不能再逃避找工作了 目前會一點C和剛學 還不是很懂的javascript15
Re: [問卦] 你們寫coding都是用空格還是tab?南無阿彌陀佛。 正經的答案是直接按tab可以空好幾格,所以有些人喜歡tab,但tab在不同文字編輯器下 呈現的格數不同,所以有些人支持空白。 不過用分號縮排才是王道: #include <iostream>18
Re: [分享] F-22猛禽機的飛航控制系統雖然回自己的文章有點奇怪 但突然想到一些原文與電腦科學和程式語言的事想跟大家 分享一下。我會盡量寫跟軍事相關的部分 如偏題太多再麻煩版主提醒一下(抖 : : : 推 OpenGoodHate: 何時史塔克工業要改用C#/Java 記得叫我 07/13 09:505
[問卦] 為何用中文程式編碼的商用軟體沒出現中文算是世界使用人數第一,也有五千年的歷史 中文程式編碼也推行了不少年 怎麼到現在都沒有商用的中文程式編碼出現啊 中文編碼的話比較好懂吧 打印("你好,世界");9
Re: [問卦] 業界寫程式用 i++ 多還是 ++i 多?int i = 0; 原則上 i++;與 ++i; 在單運算時 是完全等價 不過若 int a = i++; (a為0) 或7
[討論] GCC、Clang使用C++編寫?是這樣的。 GNU GCC 原本使用C語言編寫,隨著Clang、LLVM的崛起, 改由C++編寫,Ian Lance Taylor也表示C++效能不會輸給C 而且能設計出更好,更容易維護的程式。 但本魯很不解,C++複雜的程度遠遠超過C,為何還能設計出效能5
Re: [討論] 寫三元判斷式code review被打槍好啦 假設不是反串 我覺得滿有道理的 但有一點其實你說錯了 其實並不是語法進步 之前學 Rust 覺得哇 pattern matching 真是他媽神 好潮喔 後來跑去學 OCaml 我才發現(Rust設計者是OCaml粉 一開始的compiler就是用OCaml寫)4
[閒聊] 太閤5DX 事件編輯器災情XDD中國那邊有不少人在搞戰國繪卷移植到DX版上 但就像貼吧這篇說的不少問題都出現了 不是單純簡轉繁 或 繁轉簡 EVM丟上去事件編輯器就能解決 轉載一下這篇的一個簡單說明
30
[推薦] 趁棒球熱的時候來偷推薦《失憶投捕》26
[討論] 投摔鬼憑什麼當神奇寶貝?54
[劍星] 欸不是 金變態 可以這樣的嗎17
[閒聊] elona(elin)的名物 妹妹21
[閒聊] 星際寶貝史迪奇 前導預告42
[問題] 大蔥鴨憑什麼當神奇寶貝17
[閒聊] 索尼會怎麼防止黃牛?34
[BGD] 為什麼買狗CP是愛爽配==8
[蔚藍] 為什麼催眠對老師沒有用呢?7
[閒聊] 購買自組電腦該注意的地方9
[情報] 石黑正數短篇集:偵探綺譚&正向老師28
[閒聊] 美國富翁:想要我的財寶嗎?那就去尋找吧26
[閒聊] 12點了 誠實說有對Biboo起色心嗎?12
[蔚藍] 小春 Pro Max40
[閒聊] 與變成了異世界美少女的大叔一起冒險(7
[Vtub] 鐵匠Kaela 你最愛的虛擬美食部落客9
[LL] 這才是真正紫禁之巔13
Re: [問題] 帝國是誰的問題大? 幼女戰記雷11
[蔚藍] 剛起床的全身赤裸陽奈4
[問題] 異形羅穆路斯的人形異形,為啥是噁男臉3
[塗裝] 陰森守衛-元帥23
[閒聊] 矢吹:能看到出包再刊載於JUMP真是高興啊3
[閒聊] 海外 音速小子電影3 爆米花桶公開 開腦殼5
[LL] LoveLive Superstar三季 08 這在寫什麼5
[問題] 一拳超人第三季怎麼都沒消息7
[閒聊] ヨルシカ 前世LIVE 大阪場 簡單心得7
[閒聊] 睡前來點虛擬腳腳5
[閒聊] 吸尻鬼第2話是怎麼回事5
[MyGO] 海鈴和喵夢能有甚麼故事8
[GBC] 手島nari 刺刺 形象改造