Re: [問卦] 有沒有c++跟c差很多的八卦?消失

看板Gossiping作者時間7年前 (2017/08/11 22:32), 7年前編輯推噓8(9112)
留言22則, 12人參與, 最新討論串9/9 (看更多)
: → reinforce15: 以前聽過愛丁堡教授說過的一句話 人工智慧注定失敗 08/11 21:33 : → reinforce15: 啊對那個 是不是要叫operator overloading比較適合 08/11 21:38 : 推 kindaichitom: 例子看起來就好像overloading.. 08/11 22:10 應該就是吧.. 來離題談另一個 Obj C 寫 mac/ios 在用的,compiler 叫 xCode obj c 也是讓我覺得很詭異 主管邊學邊罵為什麼它要這樣設計 我回主管一句:因為它比 C++ 早出喔... 主管說:不會吧,C++ 很早耶 然後我從 wiki 找來找去,翻一堆資料給他 他才說: 搞不好 Obj C 真的更早 ------------------------------ 一些名詞,即使不一樣,其實講的是同一種東西 我們理工科必需要有這種能力 因為我們不是在背,而是要去理解 舉例來說 設 x 為半徑,y z 為距離 於是寫一堆公式 x^2 = y^2 + z^2 之類 另一個人寫設 r 為半徑,x y 為距離 x^2 + y^2 = r^2 是的,符號不一樣了,但這在講同一回事 因為理工人可以先定義符號,再使用符號 (難道人類的語言不夠用了,非要自己定義一套? XD) 扯這麼遠,我是要說 我覺得 Obj C 的訊息傳遞有夠像 Win OS 的 DLL 這只是我覺得,我就沒看到書上這樣寫 因為我所看的書,作者並不想為 win 下的工程師特別介紹啊 為什麼我這樣說呢? 因為比如 [x add]; // 這道指令是說,x 是物件,去執行一道叫 add 的指令 而 add 不用先宣告 萬一 x 沒有寫這個函式,執行時它會 crash 萬一有寫,那它就會對起來,會去執行 這在 C++ 可不是這樣說的 C++ 裡面的函式都要先宣告 由宣告的順序會產生一個 member function 序號 用來在結構陣列中指向 因此,x.add() 可能 compiler 做完後,可以拋去 symbol table 理解成 x[0]() 意思是 x 這個物件的第 0 個函式 而繼承時,如果衍生類別也寫了 add, 那就把衍生物件的 function table 換掉 反正我要呼叫陣列中第 0 個函式,就對了 而 function table 換掉就可以很容易的做出繼承的概念來 在程式執行的速度上,因為是以陣列定址,所以編出來的機械碼也很簡潔 -------------------- 但 Obj C 裡的函式 add, 它必需到執行時才知道有沒有這個函式 那我就要問了: 它是不是保留整個字串?而且是進行字串比對! Win 的 DLL,動態連結也是這樣的;當然它另有把 DLL function 編號的方法,不提那個 我就提它字串比對的那種 動態連結字串比對的結果是: 1.link 完的 DLL 檔,雖然類似 exe 檔,但它無法拋去 symbol table 事實上用些工具程式就可以讀出 symbol table 2.執行速度上,它是字串比對,那它就是要付出字串比對的時間 如果我的理解無誤,那這兩個缺點在 Obj C 上面也會有 程式容易被人讀出介面 執行速度應該比較慢 可是在 wiki 中說,它不會慢多少 而我本身有在寫 android 也有寫 ios 同樣的程式邏輯,在 ios 就是跑得順些 因此我完全搞不懂是發生什麼事了 該說 ios 的硬體太強大,我不是用相同的東西在比較,所以不公平嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.251.197.63 ※ 文章網址: https://www.ptt.cc/bbs/Gossiping/M.1502461952.A.55C.html

08/11 22:32, , 1F
你以為有人看得懂膩
08/11 22:32, 1F
這邊 wolf 藏龍的人很多 只是都有脾氣 但不是每個有脾氣的人都有本事 有的人只會發脾氣而已

08/11 22:33, , 2F
專通c語言 摸不到c罩杯
08/11 22:33, 2F

08/11 22:33, , 3F
第四段開始就錯了好嗎
08/11 22:33, 3F
沒宣告會在 compile 時引起錯誤,我知道 但某些時候,沒宣告也可以用 應該說,寫得很詳細才能寫出差別來 目前我沒在寫那一段,所以找不到更好的字眼

08/11 22:33, , 4F
真的看不懂 逛八卦之後腦袋都空白了
08/11 22:33, 4F

08/11 22:34, , 5F
我還是比較喜歡C++
08/11 22:34, 5F
※ 編輯: HuangJC (60.251.197.63), 08/11/2017 22:37:56

08/11 22:36, , 6F
看過Swift再去看OC覺得厭世
08/11 22:36, 6F
學電腦有點像在打乒乓球時,要找個球友 球友太強了,我整天撿球,他也會嫌我,他寧可找別人去練了 看來你已經找 Swift 的球友了 ※ 編輯: HuangJC (60.251.197.63), 08/11/2017 22:39:57

08/11 22:39, , 7F
用最新android旗艦機來跑看看?OS不同有點難比
08/11 22:39, 7F

08/11 22:41, , 8F
同一篇主題多次回覆 建議版主刪除
08/11 22:41, 8F

08/11 22:42, , 9F
以前有這條板規被執行嗎?
08/11 22:42, 9F

08/11 22:42, , 10F
不是你說的這樣吶
08/11 22:42, 10F

08/11 22:43, , 11F
不關DLL或windows,dyn link本來就要sym table.ObjC那不叫fu
08/11 22:43, 11F

08/11 22:43, , 12F
nction call, 是send message https://goo.gl/AudRFm
08/11 22:43, 12F
是的,它叫 send message 但我只感覺改名字而已; 它怎麼實作? 它可以在 compile time, 把 function name 都丟掉,變成一堆 function table 嗎? 那有一種指令是把 function name 當成字串,傳入這個參數,就可以去呼叫這個指令 應該沒記錯吧.. 這種指令要怎麼實作? 或我誤解了,根本沒這種指令? ※ 編輯: HuangJC (60.251.197.63), 08/11/2017 22:47:44

08/11 22:46, , 13F
可以看一下Smalltalk的訊息傳遞?
08/11 22:46, 13F

08/11 23:02, , 14F
https://goo.gl/7HYdua ObjC 是 綜合C和smalltalk,所以有
08/11 23:02, 14F

08/11 23:02, , 15F
這種 dynamic typed特性
08/11 23:02, 15F
參考 win 的做法 HMODULE WINAPI LoadLibrary( _In_ LPCTSTR lpFileName ); 這裡 Library 可以用字串來找到它,不必 compiler time 決定 FARPROC WINAPI GetProcAddress( _In_ HMODULE hModule, _In_ LPCSTR lpProcName ); 函式也可以用字串找到它 字串可以動態生成,那我就有法子動態去執行不同的 function 要用這機制,那 function & dll name 就拋不掉 LoadLibrary & GetProcAddress 裡也是用字串比對在找 我當然就理解成一樣的事 雖然它改叫 send message 了... ※ 編輯: HuangJC (60.251.197.63), 08/11/2017 23:15:19

08/11 23:17, , 16F
而我認為,字串比對,比起 address jump... 慢很多
08/11 23:17, 16F

08/11 23:18, , 17F
因為位址跳躍可是 CPU 直接支援的指令,一個機械週期完成
08/11 23:18, 17F

08/11 23:18, , 18F
字串比對就必需讀入整個字串 table for loop 去找...
08/11 23:18, 18F

08/12 16:27, , 19F
當然這是原理,compiler有最佳化跟runtime加速,就跟你不會
08/12 16:27, 19F

08/12 16:27, , 20F
每次都要查function symbol在呼叫一樣。google一堆自己參考
08/12 16:27, 20F

08/12 16:28, , 21F
啦,C++ virtual 也是要查表,不是單純 function call
08/12 16:28, 21F

08/12 22:13, , 22F
不過你似乎把dynamic linking跟dynamic type搞混
08/12 22:13, 22F
文章代碼(AID): #1PZS00LS (Gossiping)
討論串 (同標題文章)
文章代碼(AID): #1PZS00LS (Gossiping)