2010年6月14日

pcman聊C++

從人家blog轉來的文章

2008年5月24日星期六

關於 GTK+/GObject 和 C/C++

今天又忍不住開始譙 GTK+... 因為太常在講一樣的東西,乾脆申請 blog 來紀錄
這樣不用每次都一直罵一樣的事情...
以下是 今天在 irc.debian.org #dot channel 的對話。

(02時05分23秒) pcman: aguai: vala 是... 一個新的程式語言,發明來幫助你寫gtk+
(02時05分23 秒) Fred_: aguai: 是個該死的東西
(02時05分51秒) pcman: aguai: gtk+ 已經難寫到有人認為應該要發明專用的程式語言來寫了.....
(02時05分52秒) wenpei 離開聊天室 (quit: Remote host closed the connection)。
(02時06分 10秒) aguai: pcman: 我一直不懂
(02時06分12秒) pcman: aguai: 他的 compiler 做的事情就是把你寫的 code... 再轉成 C
(02時06分 42秒) hialan: pcman, 以 pcmanfm 為例,他還包含桌面的部份
(02時06分50 秒) aguai: pcman: 你為什麼這麼恨 GTK++ 卻不跳去 QT?
(02時06分50秒) pcman: aguai: C 沒有物件導向功能,但是 GTK+ 團隊要做物件導向,所以他們用 C 模擬了所有物件導向的功能
(02時07分06秒) pcman: aguai: 但是後來有人發現這樣寫起來根本是虐待開發者
(02時07分31 秒) pcman: aguai: 所以,他們發明了另一種物件導向的語言來寫,然後,把寫出來的 code,再轉回 C,再用 C 模擬物件導向.....
(02時07分45秒) Fred_: aguai: 你講到重點了
(02時07分45 秒) pcman: aguai: 簡單說,那些人都是神經病
(02時07分57秒) aguai: 當時沒有 C++?
(02時08分03秒) pcman: aguai: 老早就有了
(02時08分09 秒) aguai: C++ 有這麼新?
(02時08分15秒) pcman: aguai: 他們故意拒用 ok?
(02時08分16 秒) Fred_: aguai: pcman 每一陣子就會花很多 IRC page 去講這個問題
(02時08分39 秒) pcman: aguai: 那時候接近 2000 年了
(02時08分42秒) Fred_: :D
(02時09分05秒) aguai: 2000 年有 C++ 呀....我表弟有學...
(02時09分15 秒) pcman: aguai: 世界上總是有時間太多的人.... C++ 在 dos 時代就有了
(02時09分24 秒) aguai: pcman: C++ 真的不好嗎?
(02時10分38秒) aguai: 我覺得如果不強求 template 之類的東西.... C++ 也不會太難讀呀
(02時11分07 秒) aguai: 是說我沒資格討論這個啦....
(02時11分 13秒) wtsai 離開聊天室 (quit: Ping timeout: 480 seconds)。
(02時11分49秒) aguai: DreamerC: 反正都要重寫...用 C 跟用 C++ 還不差不多....(我的想法啦)
(02時13分58秒) aguai: pcman: 你為什麼這麼恨 GTK++ 卻不跳去 QT?
(02時14分 26秒) pcman: aguai: 你覺得重寫十萬行 code 很好玩嗎?
(02時14分48秒) pcman: aguai: 而且是用完全不相容的工具
(02時15分37 秒) hialan: pcman, 我認為 MS Windows 這樣整體性的設計,易用度比像是 GNOME 這樣拼拼湊湊出來好用的多@@
(02時15分44秒) aguai: Soga.....
(02時15分54秒) pcman: aguai: 不然你來移植看看
(02時16分05 秒) pcman: hialan: 相對喪失的就是彈性
(02時16分15秒) pcman: hialan: gnome 也不是拼湊來的,他是有整體的設計
(02時16分 28秒) pcman: hialan: 不好用是因為軟體沒寫好,不是因為沒有整體設計
(02時16分32 秒) aguai: pcman: 我剛剛真的把咖啡噴到螢幕上了..........
(02時16分36 秒) pcman: hialan: Gnome 是有 guideline 的
(02時18分23秒) hialan: pcman, 恩,我相信,這麼大的 project 一定要有這些東西
(02時18分 41秒) hialan: pcman, 不過這並不表示我們會損失彈性
(02時18分44 秒) pcman: hialan: gnome 其實整合得算不差了
(02時18分54秒) aguai: Fred_, pcman: 請問一下...我慢慢有點知道 GTK+ 在幹嘛了 要讀 LXDE 的 code 從哪裡下手比較好呢?
(02時19分05秒) pcman: aguai: main()
(02時19分44 秒) aguai: pcman: lxsession? lxpanel?
(02時19分49秒) aguai: lx??
(02時19分58秒) pcman: aguai: 隨你高興
(02時20分11秒) pcman: aguai: 其中最容易懂的是 lxsession-lite, 其次是 gpicview
(02時20分 19秒) pcman: aguai: 然後是 lxtask
(02時20分23秒) pcman: aguai: 剩下的大概不行
(02時20分35 秒) Fred_: aguai: 最簡單的入門可從 lxpanel plugin
(02時20分40秒) aguai: lxsession-lite 恩恩
(02時20分40 秒) pcman: aguai: lxpanel 和 pcmanfm 有部份我也看不懂,所以我不預期你會能接受
(02時20分52 秒) aguai: 來去 co
(02時20分58秒) hialan: pcman, 在 unix/linux 世界寫 C++ 是不智的
(02時21分00 秒) Fred_: aguai: 就像玩 kernel 要先從 modules 開始 XD
(02時21分01 秒) ***pcman 已經快看不懂 pcmanfm 的某些部份了
(02時21分09 秒) pcman: hialan: 不會啊
(02時21分36秒) hialan: pcman, 除非你要把所有東西包辦,然後只用 ANSI 發佈的東東
(02時21分 50秒) pcman: hialan: 有差嗎?
(02時21分54秒) hialan: pcman, 不然光是跨平台就會把你搞死:p
(02時22分05 秒) pcman: hialan: 不會啊,用 C 還不是一樣
(02時22分21秒) pcman: hialan: 不要用太新的語法基本上不會有問題
(02時22分36 秒) pcman: hialan: 何況,你到底要跨什麼平台?
(02時22分58秒) hialan: pcman, 或許這是我幾年錢看到的東西,C++ 在 linux 上並不是很好
(02時23分 13秒) pcman: hialan: 有 gcc 的地方就可以編譯,哪裡不好?
(02時23分21秒) aguai: C++ 在 linux 上並不是很好???
(02時23分26 秒) aguai: 不懂?
(02時23分31秒) pcman: hialan: 你看到的是程式沒寫好... C++ 好得很
(02時23分41 秒) aguai: 是表現很差?
(02時23分46秒) pcman: hialan: kde 的品質比 gnome 好多了
(02時24分17 秒) hialan: pcman, 跨 linux 不同家:p
(02時24分29 秒) pcman: hialan: 那關 C++ 什麼事....
(02時24分40秒) pcman: hialan: 會不相容的都不是在 C++
(02時24分43 秒) hialan: pcman, 這大概是好給年前看到的文啦:p
(02時24分44 秒) Fred_: hialan: 你指的應該是 ABI 的 prolem
(02時24分52秒) aguai: kde 還是比較重耶.....
(02時24分58 秒) y5c: kdvi 的確比 evince 好很多
(02時25分00秒) pcman: aguai: 你確定?
(02時25分12秒) pcman: aguai: 你要不要實際測試過
(02時25分15 秒) aguai: pcman: 我自己裝的
(02時25分19秒) pcman: aguai: kde4?
(02時25分20 秒) aguai: pcman: 有耶
(02時25分27秒) hialan: pcman, 不是 C++ 的錯,而是 linux 支援 C++ 的錯,或許現在有改善了也說不定:p
(02時25分29秒) pcman: aguai: 我測試的都是比 gnome 好
(02時25分32 秒) aguai: 4 還沒試
(02時25分38秒) pcman: hialan: 那跟 linux 也沒關係啊
(02時25分47 秒) pcman: hialan: 你的邏輯怪怪的....
(02時26分05秒) aguai: kubuntu 風扇比 gnome 響
(02時26分12 秒) aguai: 這是真的
(02時26分24秒) pcman: aguai: 那是因為 kubuntu 是用 ubuntu
(02時26分 34秒) pcman: aguai: 你找個精簡一點的 distro 裝
(02時26分35秒) hialan: pcman, 總之,這是當初 GNOME 為什麼選擇用 C 來模擬 C++ 而不直接用 C++ 來寫的原因
(02時26分41秒) pcman: hialan: 其實不是....
(02時27分00 秒) aguai: ㄟ丟....自己從頭裝 我武功還不到
(02時27分17秒) hialan: pcman, 恩...ok 總之 GTK 都寫這麼大了 XD
(02時27分 18秒) pcman: hialan: 你講的問題有些是來自 gcc 和他的 lib,那跟 linux 沒有關係
(02時27分45 秒) pcman: hialan: 我相信你講的是 ABI 問題
(02時27分57秒) hialan: pcman, 嗯嗯
(02時28分05秒) pcman: hialan: 除了這個以外,基本上沒有什麼相容性的問題,除非你用了太新的語法
(02時28分 29秒) hialan: Fred_, pcman, 嗯嗯@@
(02時28分32 秒) pcman: hialan: gtk+ 用 C 主因是為了 language bindings
(02時29分15 秒) aguai: 是喔....
(02時29分22秒) pcman: hialan: 因為 C 很容易跟其他語言銜接,但這理由不夠充分,畢竟 Qt 這點也做得很好
(02時29分44秒) aguai: libglibmm-2.4.so 是 for C++ 嗎?
aguai aguaithe1reak
(02時29分53秒) pcman: aguai: 那是垃圾
(02時30分13秒) aguai: ㄟ丟....
(02時30分15秒) pcman: aguai: 那是用 C++ 在 gtk+ 外面再包一層,讓他看起來像 C++,但是裡面還是 C
(02時30分54秒) pcman: aguai: 用沒物件導向的語言,模擬物件導向的功能,然後在用一個物件導向的語言來外面包一層,但骨子裡面還是那個模擬出來的偽物件導向,這不是莫名其妙嗎?
(02時31分 14秒) pcman: aguai: 該死的是包了 C++,程式還變複雜.... 你看 tutorial 就知道了
(02時31分15 秒) aguai: .....class xx(...){struct xx(...), ...;} <= 這樣?
(02時31分 23秒) pcman: aguai: 比那個還糟
(02時31分25秒) hialan: pcman, 嗯嗯瞭解@@
(02時31分32 秒) Fred_: pcman: 建議你可以 blog
(02時31分48秒) pcman: aguai: 很多地方為了要讓你可以用 C++ 寫,他做了大量 dirty hacks... 造成很多不必要的記憶體浪費
(02時31分55秒) Fred_: pcman: 不然你要常常解釋 libg*mm 的爛
(02時31分58 秒) pcman: aguai: 這一切沒有意義的舉動,只是為了讓你的 code 看起來像 C++
(02時32分10 秒) pcman: Fred_: 也是...
(02時32分12秒) aguai: 這是何苦呢?
(02時32分19秒) ***pcman 來去 blogger 申請 gtk_sucks 帳號
(02時32分26 秒) pcman: aguai: 所以我說那是垃圾
(02時32分38秒) aguai: 必要時再包就好啦?
(02時33分16秒) aguai: extern C 也沒有很難........
(02時33分17 秒) Fred_: pcman++
(02時33分21秒) pcman: aguai: 用 C=> window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
(02時33分40秒) pcman: aguai: 用 C++ => window = new Gtk::Window(Gtk::WINDOW_TOPLEVEL);
(02時33分49秒) pcman: aguai: 不覺得有任何幫助
(02時34分05 秒) aguai: 這個就很OO了呀
(02時34分14秒) ***hialan 覺得每個 gtk 函式都有夠長 ~~~
(02時34分20 秒) pcman: aguai: GTK+ 本身就很 OO
(02時34分39秒) pcman: hialan: 我以前很討厭,現在很愛,因為函數本身就可讀,連註解都免了
(02時34分 48秒) hialan: pcman, 哈!
(02時34分55秒) pcman: hialan: 不用查 API doc 都知道用途
(02時35分10 秒) aguai: pcman: 恩恩 這就是所謂"用 C 也可以很 OO "吧
(02時35分25 秒) pcman: aguai: 對, OO 只是一種觀念和方法
(02時35分30秒) pcman: aguai: 不是一種語言
(02時35分33 秒) hialan: pcman, 對了,回到 lxde 的需求裡面.....我覺得彈性和整體性是可以分開的:p
(02時35分52 秒) aguai: 不過很難想要怎麼做到呀....
(02時36分10秒) aguai: C 又沒有 private
(02時36分21 秒) pcman: aguai: 他們真的做到了
(02時36分49秒) hialan: aguai, private 的方法: 每個檔案就是一個 Object, 然後用 static 宣告函式與全域變數
(02時36分50秒) pcman: aguai: 說起來很複雜,但是這些機制在 GTK+ 都有,這才是了不起的地方
(02時36分 59秒) pcman: hialan: 不對
(02時37分09秒) pcman: aguai: GObject 真的有支援 private
(02時37分26 秒) aguai:
(02時37分36秒) hialan: pcman, 哦哦!!
(02時37分37秒) aguai: 沒a毒到過
(02時37分44秒) aguai:
(02時38分42秒) pcman: aguai, hialan: G_TYPE_INSTANCE_GET_PRIVATE
(02時39分05 秒) ***aguai Document 好多呀...讀完 GTK 還要讀 freedesktop...
(02時39分27 秒) pcman: aguai: public/private, RTTI, public/private methods, ctor/dtor, object inspection, .... GObject/Gtk+ 全部都有
(02時39分31 秒) hialan: pcman, 聽說最早的 C++ compiler 是直接把 C++ code 翻譯成 C 再編譯 XDDD 所以這兩個語言轉換並不是難事
(02時39分40秒) pcman: hialan: 你轉轉看
(02時40分01 秒) pcman: hialan: C++ -> C 簡單,C -> C++,幾乎不可能
(02時40分18 秒) pcman: hialan: 雖然 gtkmm 據說做到了一部分....
(02時40分20秒) hialan: pcman, 不要~~ 這是真的啦 ~_~
(02時40分26 秒) aguai: 把 C++ code 翻譯成 C ..... '<<' 就很不知道要怎麼轉
(02時40分41 秒) pcman: aguai: 那只是一個函數而已啊
(02時40分59秒) pcman: aguai: 別被符號限制.... operators 不就都是函數而已?
(02時41分05 秒) aguai: 可是要判斷是要 shift 還是要傳球
(02時41分26秒) aguai: context 會亂掉吧
(02時41分40 秒) pcman: aguai: class 裡面有 overload 就是 function, 沒有就是 shift 啊
(02時41分 56秒) pcman: aguai: 比較難是 RTTI....
(02時42分00秒) aguai: cin<<
(02時42分25 秒) pcman: aguai: read(read(cin, int), int) 而已啊
(02時42分40 秒) aguai: 對吼
(02時43分00秒) pcman: aguai: 難的是在 RTTI,你根本不知道型態,怎麼知道那個是代表啥行為?
(02時43分 01秒) aguai: pcman <- 果然是高手
(02時43分16秒) pcman: aguai: 啊那些 operator 本來就是函數啊
(02時43分25 秒) pcman: aguai: 遇到 virtual 比較討厭
(02時43分26秒) aguai: RTTI 我根本不敢想呀....
(02時43分34 秒) pcman: aguai: GObject 有
(02時43分38秒) pcman: aguai: 很可怕
(02時43分50秒) pcman: aguai: 他還有支援 dynamic_cast
(02時44分02 秒) pcman: aguai: 當然,用 macro
(02時44分32秒) hialan: pcman, 你現在不就是說 C++ ==> C 嗎 ? XDDD
(02時44分 58秒) hialan: pcman, so it's possible
(02時44分59 秒) pcman: hialan: 對啊,很噁心,但是 GTK+ 那種 C 轉成 C++,就很難了....
(02時45分11 秒) pcman: hialan: 我說不能的是 C => C++
(02時45分22秒) hialan: pcman, 噗哈哈哈哈阿,真是一針見血:p
(02時45分31 秒) aguai: 對了 typedef struct xx{...}; (xx)xxx <- 這樣 OK 嗎?
(02時45分 38秒) hialan: pcman, C 本來就是 C++ 的一部分,so it's no need
(02時45分 49秒) hialan: pcman, 有向下相容
(02時45分58秒) pcman: hialan: 我是說,把 GObject 那種... 轉回 C++ native class....
(02時46分28秒) hialan: pcman, 說著說著...我快要跑道 GTK# 去了 ~_~
(02時46分 42秒) pcman: aguai: 我看不是很懂....你這個不是正確語法吧
(02時46分52秒) pcman: aguai: typedef 後面還有東西啊
(02時47分19 秒) y5c: 聽起來 vala 好像是個好主意了
(02時47分24秒) pcman: hialan: 你可以考慮 vala,語法抄襲 C#,但是不是外面多包一層,是轉成 C
(02時47分 39秒) pcman: y5c: 現階段最好的主意,雖然還是有點荒謬
(02時48分12秒) hialan: pcman, 恩,我不希望他轉成 C ,但是我認為 GTK# 是好物,因為 Windows 可以原生執行
(02時48分14秒) aguai: 恩恩...只是想到 C 的 typedef struct xx{}xx; 可不可以直接拿來 cast
(02時48分31秒) pcman: hialan: 不要想太多....
(02時48分50 秒) Fred_: 話說AWN有用到 vala ...對它不爽中...
(02時48分51秒) pcman: hialan: gtk+ win32 基本上屬於 alpha quality,僅只是在能動的品質
(02時49分00秒) ***Fred_ 對他不爽中
(02時49分06秒) aguai: pcman: 你恨 GTK 是因為??? 他???? 看起來蠻厲害的呀...
(02時49分 09秒) pcman: hialan: 在可見的未來我也不覺得會改善,某些部份甚至沒有人確定會不會動
(02時49分28秒) icman 離開聊天室 (quit: Quit: leaving)。
(02時49分33 秒) pcman: aguai: 你用 GTK+ 寫過幾萬行之後就會知道理由
(02時49分36秒) y5c: win32 gtk+ 醜死了
(02時49分42 秒) hialan: pcman, 嘿嘿,有需求就會有供給者阿。你看 Google 不也給 Wine 一堆 code :p
(02時50分05秒) pcman: aguai: 尤其當你過去還曾經用過 Windows 上主流的開發工具,我們這裡根本落後 10 年你知道嗎?
(02時50分19秒) ***aguai <- 一生中應該還沒寫到第一萬行 code
(02時50分21 秒) pcman: hialan: 你可以慢慢等...
(02時50分47秒) aguai: C++builder 幫我生的 code 有算的話可能有接近
(02時50分47 秒) ***hialan 等到地老天荒~地老天荒~地老天荒~~~~
(02時51分03秒) DreamerC: o.o
(02時51分20秒) aguai: C++Buider 隨便就生個幾百行
(02時51分24 秒) pcman: aguai: 你用過 C++ builder 的話,應該很難接受 gtk+
(02時51分36 秒) pcman: aguai: 兩個相比,就會讓人覺得是相差一個世紀的產物
(02時52分09秒) hialan: pcman, 其實 Linux 的人認為 vim 是全世界最好用的 IDE ~~~ 可惜我不是 XDDD
(02時52分13秒) aguai: pcman: 可是講真的 用 C++Builder 拉完都不知道我寫了啥
(02時52分24 秒) y5c: hialan: vim? emacs 吧
(02時52分32秒) aguai: 手寫心裡比較踏實一點
(02時52分45秒) pcman: aguai: believe me, you won't want to try that.
(02時52分59秒) pcman: aguai: 寫一個空白視窗大約要 30 行左右
(02時53分 26秒) DreamerC: !?
(02時53分27秒) pcman: aguai: BCB 幫你生的 code 如果轉成 Win32 API,一般的 form 大概都需要好幾百行
(02時53分52秒) aguai: pcman: for long term.... I don't....but as a newbie... thats a good experience...
(02時53分54秒) hialan: y5c, 恩...@@|| 應該是吧...反正都可以在 文字編輯器下直接編譯、找函式、balabala
(02時53分56秒) pcman: aguai: 加上 anchor, Dnd, 等等有的沒的進階功能,很快就破千行了
(02時54分08 秒) aguai: 對呀
(02時54分14秒) pcman: aguai: 然後,那還是只是空的 GUI
(02時54分16 秒) aguai: 如神....
(02時54分34秒) aguai: 然後用名字猜
(02時54分44秒) aguai: 再補完
(02時54分48秒) pcman: aguai: 幸好有 dialog editor 可用,但是還是差很遠
(02時55分06 秒) aguai: 湊一湊居然就會動了
(02時55分09秒) pcman: aguai: BTW, 建立視窗的 Win32 API 有十個參數吧我記得.....
(02時55分 23秒) pcman: aguai: 我永遠記不起來裡面要填什麼
(02時55分30秒) hialan: MSWIN: cool!
aguai aguaithe1reak
(02時55分35秒) hialan: XD
(02時55分43秒) aguai: 反正有四五個都是 0
(02時55分52秒) pcman: aguai: 在那之前你要先註冊視窗類別,那需要填寫一個十幾個 member 的 struct


沒有留言: