顯示具有 Programming 標籤的文章。 顯示所有文章
顯示具有 Programming 標籤的文章。 顯示所有文章

2007年4月16日 星期一

ACE--C++的網路框架

0

這個東西斷斷續續的也翻閱了其中的幾個部份
以往,一直因為在台灣沒有相關的資訊
以為沒有人在使用
總算,間接得知,原來有使用在電信交換機系統上

曾經在大陸看過一些討論
關於ACE跟ICE在開發網路服務上得優劣跟效能
但是因為信息實在是有點少
不太能說服自己這是個好物
ACE的source可是個龐然大物呢
若只是取些組件來使用,當然不用花費太多心血
不過ACE的設計要比他的組件來的有趣,對我來說啦
ace都有跟上C++設計的腳步
但總是怕踩到地雷
投入了太多時間沒有回報

在C++ In-Depth系列中有兩本ace的書籍
C++ Network Programming Volume1&2
大陸有中文翻譯
在一年多前有買到手
當時只稍微翻翻
最近再度燃起興趣是因為dillo
自己的經驗不夠多
不過我怎樣都習慣不了dillo的code
看的實在是很累
想到個題外話--dillo在2月的時候frozen了
gtk的設計雖然不錯
但總是希望可以再方便些
這些個種種
讓我興起了搞個framework的想法
但是要能更進一步的消除GUI的複雜度才行
否則就沒意義了,使用gtk就好啦(這也算是gtkmm的下場)
而ace的設計,當初就是為了消除複雜性
說起來是對自己的期許啦
畢竟到那一步實在是距離有點給他遠
目前還是得先努力解決眼前的問題才是(我的論文啊~~)

Web Site
ACE
ICE
C++ Network Programming, Vol. 1
C++ Network Programming, Volume 2
C++網路編程 卷1
C++網路編程 卷2

Read more

2006年9月5日 星期二

C++/CLI...What is it?

0

今天裝了VS2005,開了我第一個在其上的C++專案...
...
...
這是C++嗎?
看著不再熟悉的source code
馬上發動google大神來幫我釋疑

在微軟發展了.net之後,該架構被微軟拿去提交給ECMA委員會(其實微軟自己是委員之一啦)
變成了標準,通過了這一個中間層語言...
而未來幾年windows上得程式庫應該都會移植到.net平台上
上次忘了在哪邊看到的資料是2008以後binary code會在virtual machine上執行...
VS支援的語言中,VB那種直譯式的是比較沒差,不過譯完也不是機械碼
翻譯完是.net 中間層的程式碼,再由.net VM去執行
有趣的是,除了VB,其他語言全部都是如此
c#算是java的替代品,理所當然.net則是相對於java VM
然而C++編譯完的程式碼也不是機械碼,一樣是.net byte code
理論效率上應該會比直接編成機械碼來的慢,
不過慢多少倒是很難說啦,
http://www.vertigosoftware.com/Quake2.htm
這是上次在討論版上看到大陸一個寫遊戲程式的人在一篇文章上得佐證資料
他用這個來說明.net應該效率上不會造成太大的損失

在.net 1.1時的C++叫做manager c++
後來微軟找了herber suter跟stan lipperman進入VC team
前者是C++標準委員會的主席,後者是C++ primer的作者
這兩個大喀進微軟第一件事就是修改MC++~~他們覺得manager c++的語法太不自然了
所以現在的C++/CLI跟manager c++是不一樣的,也不相容
目前看來微軟的開發工具可說為了連結.net都做出了語法上得改變
而Visual Studio開出來的C++ windows form專案差點把我嚇死
專案一新建出來的東西有好幾個看不懂的關鍵字
首先就會在程式碼裡面看到這種東西 String ^argv
這算是.net新多出來的運算子符號,(^,%)==>(*,&) (呵,就是按照鍵盤上shift-8開始往下四個)
這是相對於原本的pointer跟reference,不過產生的物件是由.net管理記憶體垃圾回收和執行緒
此外也多出ref class A{} 跟value class A{}
不過在Bjanine的訪問上,他認為C++被擴充用來支援.net的特性其實可以用template的方式去完成,
雖然不知道那樣設計是不是可以漂亮點,不現在擴充關鍵詞的目的就是為了讓語法自然點
而我猜微軟不用template的方式是因為採用template的話,
程式在編譯的時候就會需要原始碼,如果是提供開發工具的話就得提供整個library的source
是否有人能提一下反方的看法呢?

現在C++/CLI也算是標準了,也是跟.net一樣有提交給ECMA
補充一下ECMA這組織是制定javascript標準的委員會,也是通過openoffice文件標準的
那java script的正式名稱是ECMA script,他其實真的跟java一點關係都沒有,只是語法用的是類java的
現階段C++ 0x (下一代的C++標準) 就真的不知道會怎樣了,不知道有沒有可能通過C++/CLI
VC++目前能開的專案還是很多,CLR系列是採用.net framework,而MFC跟ATL則看起來是跟.net無緣
我開了一下預設的MFC專案出來看了一下,他的整個東西還是跟以前一樣
MFC的視窗也一樣不能用物件拖拉,開windows form專案的話
整個設計就跟VB差不多了,視窗物件全部都可以從工具箱拉進去。

而mono呢?現在還是在.net 1.1而已,等到mono完全支援.net 2的話
在windows下寫的c++/CLI程式就可以直接拿去linux下了
mono還有支援arm平台喔~
所以呢,只要你能夠把mono放進去的話,程式應該是可以直接在mobile的東西上跑的
在我來說,.net頂多就是跨平台,類似java的技術平台,此外就是不同語言可以混合使用
可是部份重量級開發人員把他說成是最近軟體工程上最重要的事
他們都認為.net是未來軟體最具潛力的平台,是最近軟體業界最重要的發展...
如果只是剛才我說得那幾點,那java早就這樣啦
又沒什麼特別的,那是還有什麼事我沒看到的呢?
聽說.net 3.0(WINFX)將會是最輝煌的時代,我不太清楚哪些重要的技術細節會在3.0發表
3.0要在明年下半或後年上半才會發表,所以會有時間可以追一下
目前C++/CLI的書是一本都沒有,市面上VC++ 2005中文書全部都還在講MFC

Read more

2006年7月5日 星期三

思考泛型設計的學習 2

0

上次說到在泛型庫上,目前就是介意必須提供整個源碼,而無法只提供共享庫,其主要原因來做個簡單的說明吧!先看以下程式碼
//file print.h
#include < iostream >

template < class T >
void print(T &data);

//file print.cpp
#include "print.h"
#include < iostream >

using namespace std;

template < class T >
void print(T &data)
{
cout << data << endl;
}

//file main.cpp
#include < string >
#include "print.h"

using namespace std;

int main()
{
string s("Hello" );
print(s);
}

在這邊,我們提供一個function templare,簡單的做個輸出,而.h檔裡面放置宣告,實做細節在.cpp檔中,而我們的主程式則是在main.cpp,在裡面宣告一個字串並初始為Hello,然後用print輸出他

接著我們試著編譯我們的程式
$g++ main.cpp print.cpp

不過卻會發生一個錯誤
/tmp/ccRlq0pc.o: In function `main':main.cpp: ( .text+0x54): undefined reference to `int print, std::allocator > >(std::basic_string, std::allocator >& )'
collect2: ld 回傳 1

有趣的是錯誤的來源,居然是發生在ld,也就是linking的時候,程式的生成過程基本上是 源碼--編譯器--> 中介碼--組譯器--> 二進位碼 --連結器--> 執行檔

在連結時期會將所有相關的code組合起來,包括你所使用的其他函式庫,或分散其他部份的源碼所產生的二進位碼,而問題的發生便是連結時,找不到你所使用的print的定義,也就是寫在print.cpp裡的內容,或者說找不到其具現化(實體化)的部份

可以在main.cpp中加入一行
#include "print.cpp"

或者將定義一併寫入print.h中,而後者被稱為置入式模型(inclusion model),如此linker便可依據源碼,具現化所有的物件,詳細討論可見C++ template一書第六章...

所以呢,如果真想只提供編譯後的共享連結庫,恐怕得在編譯器或連結器上採用不同的作法,不然就是以泛型庫做為基本組件,而在自己編寫的庫中都會被具現化,提供出來的則是包裝後的產品,不會在用到模板參數(template parameter)...不知道ACE裡面怎麼結合這些設計,再找時間來看看

Read more

2006年6月24日 星期六

Smartwin++

0

在C++程式設計上,我一直很在意的東西便是generic programming,及延伸出來的meta-programming,雖然很多人不太能接受C++語言上的複雜度,但是對我而言提供出來的抽象性能否降低寫碼時的複雜度是目前相對重要的問題

Smartwin++是 一個以C++ STL及Booster為基礎的設計,設計模式上類似是loki那樣Policy設計,主要是希望取代MFC及WTL,而目前是在windows平台,但 可以透過winelib在unix-like平台上執行,特別的是他採用BSD license(真是感謝設計者)

GUI領域本來就存在很多的設計議題,實做上更可以有各種理論跟實現,對於目前現存的GUI library我是都略有微詞,看了部份的source,Smartwin++倒是引起我的興致,不知道能否在理論上直接證明效能的好壞,哈!!不過還要在更深入的去研究,畢竟我對GUI程式的經驗並不是相當的足夠(以前寫些簡單的視窗就讓我覺得有很多頭大的問題,如果需要複雜的圖形介面表現...)

Read more

 
Design by ThemeShift | Bloggerized by Lasantha - Free Blogger Templates | Best Web Hosting