Re: [問卦] 有沒有c++跟c差很多的八卦?消失
: → 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
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
08/11 22:34, 5F
※ 編輯: HuangJC (60.251.197.63), 08/11/2017 22:37:56
推
08/11 22:36, , 6F
08/11 22:36, 6F
學電腦有點像在打乒乓球時,要找個球友
球友太強了,我整天撿球,他也會嫌我,他寧可找別人去練了
看來你已經找 Swift 的球友了
※ 編輯: HuangJC (60.251.197.63), 08/11/2017 22:39:57
推
08/11 22:39, , 7F
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
08/11 22:43, 11F
→
08/11 22:43, , 12F
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
08/11 22:46, 13F
推
08/11 23:02, , 14F
08/11 23:02, 14F
→
08/11 23:02, , 15F
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
08/11 23:17, 16F
→
08/11 23:18, , 17F
08/11 23:18, 17F
→
08/11 23:18, , 18F
08/11 23:18, 18F
推
08/12 16:27, , 19F
08/12 16:27, 19F
→
08/12 16:27, , 20F
08/12 16:27, 20F
→
08/12 16:28, , 21F
08/12 16:28, 21F
推
08/12 22:13, , 22F
08/12 22:13, 22F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 9 之 9 篇):