青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 17,  comments - 2,  trackbacks - 0
 
     摘要:   閱讀全文
posted @ 2008-11-02 20:44 BeyondCN 閱讀(215) | 評論 (0)編輯 收藏
     摘要: 轉(zhuǎn)換指南: 將程序從托管擴(kuò)展 C++ 遷移到 C++/CLI發(fā)布日期 : 5/31/2005 | 更新日期 : 5/31/2005Stanley B. Lippman Microsoft Corporation適用于:C++/CLI 第二版ISO-C++摘要 :C++/CLI代表 ISO-C++標(biāo)準(zhǔn)語言的一個(gè)動態(tài)編程范型擴(kuò)展。本文列舉了 V1 版本語言的功能...  閱讀全文
posted @ 2008-10-30 17:08 BeyondCN 閱讀(1392) | 評論 (0)編輯 收藏
     摘要: 利用C#制作一個(gè)仿IE地址欄的文本框利用IE上網(wǎng)時(shí),只要在地址欄中輸入幾個(gè)字母,與這幾個(gè)字母模糊匹配的地址就會自動顯示出來供用戶選擇(如下圖),用戶通過按鍵盤上的上、下箭頭在已有選項(xiàng)中遍歷,找到自己需要的選項(xiàng)后,按回車鍵進(jìn)行選擇,也可以直接用鼠標(biāo)進(jìn)行操作,非常方便,我們在程序中也可以利用這一功能,實(shí)現(xiàn)自動提示,方便用戶輸入,下面就以一個(gè)實(shí)際例子介紹我在工作中是如何實(shí)現(xiàn)的。從上圖中可以看出,最佳的辦...  閱讀全文
posted @ 2008-10-30 14:41 BeyondCN 閱讀(551) | 評論 (0)編輯 收藏
2000年6月,Microsoft推出了“Microsoft.NET下一代互聯(lián)網(wǎng)軟件和服務(wù)戰(zhàn)略”,引起IT行業(yè)的廣泛關(guān)注。2000年9月,Microsoft在舊金山發(fā)布了Enterprise 2000。同月,Microsoft原總裁兼首席執(zhí)行官鮑爾默來到中國就“下一代互聯(lián)網(wǎng)”的主題進(jìn)行演講,在中國掀起了一股“.NET旋風(fēng)”。2000年11月,Microsoft在Comdex計(jì)算機(jī)大展上發(fā)布了Visual Studio.NET軟件,并展示了其.NET發(fā)展戰(zhàn)略的框架體系和開發(fā)工具的相關(guān)特性,全面加速了Microsoft以.NET技術(shù)進(jìn)軍市場的步伐。 

  Microsoft的.NET戰(zhàn)略意味著:Microsoft以及在Microsoft平臺上的開發(fā)者將會制造服務(wù),而不是制造軟件。在未來幾年之內(nèi),Microsoft將陸續(xù)發(fā)布有關(guān).NET的平臺和工具,用于在因特網(wǎng)上開發(fā)Web服務(wù)。那時(shí),工作在.NET上的用戶、開發(fā)人員和IT工作人員都不再購買軟件、安裝軟件和維護(hù)軟件。取而代之的是,他們將定制服務(wù),軟件會自動安裝,所有的維護(hù)和升級也會通過互聯(lián)網(wǎng)進(jìn)行。“Microsoft.NET 代表了一個(gè)集合、一個(gè)環(huán)境、一個(gè)可以作為平臺支持下一代Internet的可編程結(jié)構(gòu)。”這就是鮑爾默對.NET的描述。


  作為.NET的最新特性組成部分,Microsoft .NET Framework是一個(gè)用于構(gòu)建,部署和運(yùn)行Web服務(wù)及應(yīng)用程序的平臺。它為將現(xiàn)有投資與下一代應(yīng)用程序和服務(wù)的集成提供了高產(chǎn)的,基于標(biāo)準(zhǔn)的,多語言環(huán)境,同時(shí)它還用于解決Internet級應(yīng)用程序的部署和操作問題。.NET框架包含三個(gè)主要部分:通用語言運(yùn)行時(shí),一組層次化的統(tǒng)一的類庫,及組件化版本的動態(tài)服務(wù)器主頁(稱為ASP.NET)。

  用于開發(fā).NET Framework的語言有Visual C#、VB.NET和C++托管擴(kuò)展(Managed Extensions for C++)。其中C#是開發(fā).NET的元語言,而C++托管擴(kuò)展是在C++基礎(chǔ)上建立起來的,用來為Visual C++程序員開發(fā).NET框架應(yīng)用程序而設(shè)計(jì)。為敘述方便,我們將C++托管擴(kuò)展就稱之為“托管C++”。
為了幫助C/C++以及Visual C++程序員或愛好者快速使用托管C++開發(fā).NET Framework程序,我們將陸續(xù)推出相關(guān)的一系列文章。

  本篇“托管C++概述”主要講述了什么是托管C++、開發(fā).NET Framework(框架)的項(xiàng)目類型以及與標(biāo)準(zhǔn)C++之間的區(qū)別。

  1、什么是托管C++?

  在回答這個(gè)問題,首先要搞清楚什么是“托管”(Managed)。托管是.NET的一個(gè)專門概念,它是融于通用語言運(yùn)行時(shí)(CLR)中的一種新的編程理念,因此我們完全可以把“托管”視為“.NET”。那么什么是“通用語言運(yùn)行時(shí)”?通用語言運(yùn)行時(shí)是.NET 框架應(yīng)用程序的執(zhí)行引摯。它提供了許多服務(wù),其中包括:代碼管理(裝入和執(zhí)行)、類型安全性驗(yàn)證、元數(shù)據(jù)(高級類型信息)訪問、為管理對象管理內(nèi)存、管理代碼,COM對象和預(yù)生成的DLLs(非管理代碼和數(shù)據(jù))的交互操作性、對開發(fā)人員服務(wù)的支持等等。

  也就是說,使用托管C++意味著,我們的代碼可以被CLR所管理,并能開發(fā)出具有最新特性如垃圾自動收集、程序間相互訪問等的.NET框架應(yīng)用程序。

  由托管概念所引發(fā)的C++應(yīng)用程序包括托管代碼、托管數(shù)據(jù)和托管類三個(gè)組成部分。  

  (1) 托管代碼:.Net環(huán)境提供了許多核心的運(yùn)行(RUNTIME)服務(wù),比如異常處理和安全策略。為了能使用這些服務(wù),必須要給運(yùn)行環(huán)境提供一些信息代碼(元數(shù)據(jù)),這種代碼就是托管代碼。所有的C#、VB.NET、JScript.NET默認(rèn)時(shí)都是托管的,但Visual C++默認(rèn)時(shí)不是托管的,必須在編譯器中使用命令行選項(xiàng)(/CLR)才能產(chǎn)生托管代碼。

  (2) 托管數(shù)據(jù):與托管代碼密切相關(guān)的是托管數(shù)據(jù)。托管數(shù)據(jù)是由公共語言運(yùn)行的垃圾回收器進(jìn)行分配和釋放的數(shù)據(jù)。默認(rèn)情況下,C#、Visual Basic 和 JScript.NET 數(shù)據(jù)是托管數(shù)據(jù)。不過,通過使用特殊的關(guān)鍵字,C# 數(shù)據(jù)可以被標(biāo)記為非托管數(shù)據(jù)。Visual C++數(shù)據(jù)在默認(rèn)情況下是非托管數(shù)據(jù),即使在使用 /CLR 開關(guān)時(shí)也不是托管的。

  (3) 托管類:盡管Visual C++數(shù)據(jù)在默認(rèn)情況下是非托管數(shù)據(jù),但是在使用C++的托管擴(kuò)展時(shí),可以使用“__gc”關(guān)鍵字將類標(biāo)記為托管類。就像該名稱所顯示的那樣,它表示類實(shí)例的內(nèi)存由垃圾回收器管理。另外,一個(gè)托管類也完全可以成為 .NET 框架的成員,由此可以帶來的好處是,它可以與其他語言編寫的類正確地進(jìn)行相互操作,如托管的C++類可以從Visual Basic類繼承等。但同時(shí)也有一些限制,如托管類只能從一個(gè)基類繼承等。需要說明的是,在托管C++應(yīng)用程序中既可使用托管類也可以使用非托管類。這里的非托管類不是指標(biāo)準(zhǔn)C++類,而是使用托管C++語言中的__nogc關(guān)鍵字的類。

2、用托管C++可以開發(fā).NET框架的項(xiàng)目類型

  使用托管C++應(yīng)該是C++程序員編寫.NET框架應(yīng)用程序最好的一種選擇,通過集成在Visual Studio.NET開發(fā)環(huán)境的托管C++向?qū)В覀兛梢詣?chuàng)建以下幾種開發(fā).NET框架的項(xiàng)目類型:

  (1) 托管C++應(yīng)用程序:用來創(chuàng)建一個(gè)支持托管擴(kuò)展的單獨(dú)C++應(yīng)用程序,使用它還可創(chuàng)建任何類型的應(yīng)用程序,包括.NET框架客戶應(yīng)用程序。

  (2) 托管C++類庫:用來創(chuàng)建一個(gè)支持托管擴(kuò)展的C++DLL,使用它可以生成一個(gè)能被.NET框架應(yīng)用程序調(diào)用的托管類型的組件。

  (3) 托管C++空項(xiàng)目:用來創(chuàng)建一個(gè)空的托管項(xiàng)目,該項(xiàng)目只含有支持托管擴(kuò)展的正確編譯和鏈接的開關(guān)選項(xiàng)。使用它能將一個(gè)已有的C++源文件進(jìn)入到一個(gè)托管環(huán)境中。

  (4) 托管C++ Web服務(wù):用于創(chuàng)建兩個(gè)項(xiàng)目,一個(gè)是C++托管擴(kuò)展項(xiàng)目,另一個(gè)是部署項(xiàng)目。

  3、托管C++與標(biāo)準(zhǔn)C++的主要區(qū)別

  盡管托管C++是從標(biāo)準(zhǔn)C++建立而來的,但它與標(biāo)準(zhǔn)C++有著本質(zhì)上的區(qū)別,這主要體現(xiàn)在以下幾個(gè)方面:

  (1) 廣泛采用“名稱空間”(namespace)

  名稱空間是類型的一種邏輯命名方案,.NET使用該命名方案用于將類型按相關(guān)功能的邏輯類別進(jìn)行分組,利用名稱空間可以使開發(fā)人員更容易在代碼中瀏覽和引用類型。當(dāng)然,我們也可將名稱空間理解成是一個(gè)“類庫名”。 

  盡管很早Microsoft就在Visual C++中支持名稱空間的編程方式,但是很少引起Visual C++程序員的普遍關(guān)注。現(xiàn)在在托管C++程序中,我們必須使用這一方式,即使用#using和using關(guān)鍵字。例如下面的簡單程序代碼是在控制臺上輸出“Hello World”:

#using 
using namespace System;
int main(void)
{
Console::WriteLine(S"Hello World");
return 0;
}

  代碼中,#using是用來將一個(gè)元數(shù)據(jù)文件輸入到托管C++程序中,這些文件可以是包含托管數(shù)據(jù)和結(jié)構(gòu)的MSIL (Microsoft intermediate language,微軟中間語言)文件,如DLL、EXE、OBJ文件等。mscorlib.dll是.NET框架的一個(gè)核心類庫,包含主要的名稱空間System。程序的第二行代碼“using namespace System;”用來使用System名稱空間。System是.NET框架根名稱空間,包含最基本的類型,如用于數(shù)據(jù)流的輸入/輸出的System::IO等。

  在對托管C++程序開發(fā)的不斷深入,我們不久就會發(fā)現(xiàn),許多類型的引用都要在程序的前面使用#using和using來進(jìn)行。

  (2) 基本數(shù)據(jù)類型的變化

  我們知道,標(biāo)準(zhǔn)C++語言的數(shù)據(jù)類型是非常豐富的。而托管C++的數(shù)據(jù)類型更加豐富,不僅包含了標(biāo)準(zhǔn)C++中的數(shù)據(jù)類型,而且新增了__int64(64位整型)、Decimal(96位十進(jìn)制數(shù))、String*(字符串類型)和Object*(對象類型)等類型,表1-1列出它們各自數(shù)據(jù)類型。

類型描述標(biāo)準(zhǔn)C++類型名托管C++類型名長度(位)
布爾型boolbool8
字符型charsigned char8
無符號字符型unsigned charchar8
短整型short [int]short16
無符號短整型unsigned short [int]unsigned short16
整型intint 或 long32
無符號整型unsigned [int]unsigned int 或 long32
長整型long [int]long32
無符號長整型unsigned long [int]unsigned long32
單精度浮點(diǎn)型floatfloat32
雙精度浮點(diǎn)型doubledouble64
長雙精度浮點(diǎn)型long double--64
Unicode字符--wchar_t16
64位整型--__int6464
無符號64位整型--unsigned __int6464
96位十進(jìn)制值--Decimal96
對象類型--Object*32
字符串類型--String*--


  需要注意的是,String和Object在定義一個(gè)變量時(shí),注意要有星號(“*”),但這個(gè)變量不是指針變量,這與標(biāo)準(zhǔn)C++的含義是不一樣的。例如上面的代碼可以改為:

#using 
using namespace System;
int main(void)
{
String* hello = S"Hello World";
Console::WriteLine(hello);
return 0;
}
 (3) 新增三個(gè)托管C++類型:__gc class、__value class和__gc interface

  一個(gè)__gc類或結(jié)構(gòu)意味著該類或結(jié)構(gòu)的生命周期是由.NET開發(fā)平臺自動管理及垃圾自動收集,用戶不必自已去調(diào)用delete來刪除。定義一個(gè)__gc類或結(jié)構(gòu)和標(biāo)準(zhǔn)C++基本相似,所不同的是在class或struct前加上__gc,例如下面的代碼:

__gc class G {
public:
int k;
int sum(int);
};

G::sum(int i) {return i*(i + 1)/2;}
int main()
{
G * g = new G;
Console::WriteLine(g->sum(4)); // 結(jié)果輸出10
return 0;
}

  但要注意:

  A. 一個(gè)__gc類不能從一個(gè)非托管類中繼承,且不能包含從它派生的非托管類。但一個(gè)__gc類最多可以從一個(gè)托管類中繼承。

  B. 一個(gè)__gc類不能定義成一個(gè)友元類或包含一個(gè)友元成員函數(shù)。所謂友元函數(shù),是用來讓外部函數(shù)訪問類中的私有和保護(hù)類型成員。

  C. 一個(gè)__gc類不能聲明或定義以及重載new或delete操作以及不能包含using等聲明。

  __value類是用來使用具有短生命期的小型數(shù)據(jù)項(xiàng),它不同于__gc類。__gc類數(shù)據(jù)分配在CLR堆中,而__value類對象是在運(yùn)行棧或稱為NDP(.NET Developer Platform,.NET開發(fā)者平臺)堆中創(chuàng)建的,從而避免了垃圾回收器不斷分配和釋放空間而帶來的開銷。一個(gè)__value類可以聲明成為一個(gè)局部變量、參數(shù)和返回值,也可嵌入到一個(gè)__gc類中或是作為一個(gè)靜態(tài)變量或在C++堆中分配的變量。例如下面的代碼:

#using 
using namespace System;
__value struct V { int i; };
__gc struct G { V v; }; // 嵌入到__gc類中
V f(V v) { // 定義一個(gè)全局函數(shù),其值存儲在運(yùn)行棧中
v.i += 1; // 不影響原來形參v的值
return v; // 返回V結(jié)構(gòu)類型的值
}
int main(void) 
{
V v1 = {10}; // 在運(yùn)行棧中聲明并初始化
V v2 = f(v1); // 調(diào)用f函數(shù),此時(shí)v1中的i為10,而v2中的i為11
G *pG = new G; // 為G實(shí)例分配堆空間
pG->v = v1; // pG的v中的i為10
pG->v.i += v2.i; // pG的v中的i為10+11=21
Console::WriteLine(v1.i); // 輸出結(jié)果為10
Console::WriteLine(v2.i); // 輸出結(jié)果為11
Console::WriteLine(pG->v.i); // 輸出結(jié)果為21
return 0;
}

  除此之外,所有的__gc對象都是從類System::Object派生而來,因而能夠很容易使用作用在__gc類中的集合和映射功能。然而__value類型并沒有與這個(gè)基類所共享,因而不能直接將__value作為函數(shù)中的Object*實(shí)參。為了解決這個(gè)問題,.NET允許我們使用__box關(guān)鍵字將一個(gè)__value類型視為一個(gè)__gc對象。此時(shí)__value類型被封裝成一個(gè)__gc類樁子(Stub),并被復(fù)制到NDP堆中。由于在托管C++中,box不具備隱式轉(zhuǎn)換的功能,因此在轉(zhuǎn)換時(shí)必須指明轉(zhuǎn)換的類型。

  托管C++中的__gc接口最能體現(xiàn)COM接口的思想,它的定義和聲明是非常簡單的,它除了關(guān)鍵字不同外,與一個(gè)__gc類的聲明極為相似。例如下面的代碼定義了一個(gè)接口IMyBase,其中包含了一個(gè)f的方法:

__gc __interface Ibase {
void f();
};

  需要說明的是,接口中所有的方法默認(rèn)時(shí)都是純虛的且都是公有的,我們不需要在方法之前使用virtual關(guān)鍵字或在方法之后加上“= 0”。其次,在一個(gè)__gc接口中不能包含數(shù)據(jù)成員以及靜態(tài)成員,也不能包含任何類的聲明。下面舉一個(gè)示例來說明__gc接口的使用:

#using 
using namespace System;

__gc __interface Ibase1 {
int f(int);
};
__gc __interface Ibase2 {
int f(int);
};
__gc struct C: Ibase1, Ibase2 {
int f(int i) { // 接口方法的實(shí)現(xiàn)
return 2*i-1;
};
};

int main(void){
C* c = new C;
Console::WriteLine((c -> f(1)).ToString()); // 輸出結(jié)果為1
Console::WriteLine((__try_cast (c)->f(2)).ToString()); 
// 輸出結(jié)果為3

Console::WriteLine((__try_cast (c)->f(3)).ToString());
// 輸出結(jié)果為5

return 0;
}

  代碼中,__try_cast用來將某個(gè)對象轉(zhuǎn)換成一個(gè)指定類型,并當(dāng)類型轉(zhuǎn)換失敗時(shí)自動處理由此產(chǎn)生的異常。ToString用來將對象描述成一個(gè)字符串。
(4) 簡化屬性操作

  在__gc類中可以使用.NET的屬性,這個(gè)屬性簡化了屬性函數(shù)的調(diào)用操作,這與標(biāo)準(zhǔn)C++中的屬性不一樣。在標(biāo)準(zhǔn)C++中分別通過get_和put_成員函數(shù)來設(shè)置或獲取相關(guān)屬性的值。現(xiàn)在,托管C++中的屬性操作就好比是對一個(gè)屬性變量進(jìn)行操作,例如下列代碼:

#using 
using namespace System;

__gc class G {
public:
__property int get_Size() {
Console::WriteLine(S"get_屬性");
return nSize;
};
__property void set_Size(int i) { 
Console::WriteLine(S"set_屬性");
nSize = i;
};
private:
int nSize;
};

int main() {
G * pG = new G;
pG->Size = 10; // 調(diào)用set_Size
int i = pG->Size; // 調(diào)用get_Size
Console::WriteLine(i);
}

  程序結(jié)果為:

   set_屬性

   get_屬性

   10

  需要說明的是,托管C++使用__property關(guān)鍵字來定義一個(gè)屬性的成員函數(shù)。從代碼中可以看出設(shè)置和獲取屬性的成員函數(shù)名稱中分別使用了set_和get_,這樣編譯器會自動生成一個(gè)偽成員變量Size,這個(gè)變量名是set_和get_成員函數(shù)后面的名稱。注意不要再在get_成員函數(shù)代碼中使用這個(gè)偽成員變量Size,它會引起該函數(shù)的遞歸調(diào)用。

  (5) 托管C++的委派

  在C/C++中,一個(gè)函數(shù)的地址就是內(nèi)存地址。這個(gè)地址不會帶有任何其它附加信息,如函數(shù)的參數(shù)個(gè)數(shù)、參數(shù)類型、函數(shù)的返回值類型以及這個(gè)函數(shù)的調(diào)用規(guī)范等。總之,C/C++的回調(diào)函數(shù)不具備類型安全性。而.NET框架在回調(diào)函數(shù)的基礎(chǔ)增加了提供類型安全的機(jī)制,稱為委派。

  托管C++的委派方法不像C#那么復(fù)雜,它簡化了委派絕大部分的內(nèi)部機(jī)制,因而使得它的使用變成非常簡單容易。例如下面的代碼:

#using 
using namespace System;

__delegate int GetDayOfWeek(); // 委派方法的聲明
__gc class MyCalendar
{
public:
MyCalendar() : m_nDayOfWeek(4) {}
int MyGetDayOfWeek() {
Console::WriteLine("非靜態(tài)方法"); 
return m_nDayOfWeek; 
}
static int MyStaticGetDayOfWeek() { 
Console::WriteLine("靜態(tài)方法"); 
return 6; 
}
private:
int m_nDayOfWeek;
};

int main(void)
{
GetDayOfWeek * pGetDayOfWeek; // 聲明委派類型變量
int nDayOfWeek;

// 將類的靜態(tài)方法MyStaticGetDayOfWeek綁定成委派
pGetDayOfWeek = new GetDayOfWeek(0, &MyCalendar::MyStaticGetDayOfWeek);
nDayOfWeek = pGetDayOfWeek->Invoke(); // 委派的調(diào)用
Console::WriteLine(nDayOfWeek);

// 將一個(gè)類的實(shí)例綁定成委派
MyCalendar * pcal = new MyCalendar();
pGetDayOfWeek = 
static_cast(Delegate::Combine(pGetDayOfWeek,
new GetDayOfWeek(pcal, &MyCalendar::MyGetDayOfWeek)));
nDayOfWeek = pGetDayOfWeek->Invoke();
Console::WriteLine(nDayOfWeek);

// 刪除綁定委派的類實(shí)例
pGetDayOfWeek = 
static_cast(Delegate::Remove(pGetDayOfWeek,
new GetDayOfWeek(pcal, &MyCalendar::MyGetDayOfWeek)));

return 0;
}

  輸出結(jié)果是:

   靜態(tài)方法
  
   6

   靜態(tài)方法

   非靜態(tài)方法

   4

  4、結(jié)速語

  總之,使用托管C++是C++程序員編寫.NET框架應(yīng)用程序最好的一種選擇,在充分理解.NET框架基礎(chǔ)上,避免了使用其他語言如C#、VB.NET所帶來的額外開銷。
posted @ 2008-10-24 11:43 BeyondCN 閱讀(266) | 評論 (0)編輯 收藏

我心目中的編程高手(完整版)

-- Bill Joy MIT BBS上說微軟電話面試的一道題就是“Who do you think is the best coder, and why?”。我覺得挺有意思的,也來湊個(gè)熱鬧。排名不分先后。

心目中的編程高手 (1)

Joy.Colloquium.png    Bill Joy , 前任Sun的首席科學(xué)家,當(dāng)年在Berkeley時(shí)主持開發(fā)了最早版本的BSD。他還是vi和csh的作者。當(dāng)然,Csh Programming Considered Harmful 是另一個(gè)話題樂。據(jù)說他想看看自己能不能寫個(gè)操作系統(tǒng),就在三天里寫了個(gè)自己的Unix, 也就是BSD的前身。當(dāng)然是傳說了,但足見他的功力。另一個(gè)傳說是,1980年初的時(shí)候,DARPA讓BBN在Berkley Unix里加上BBN開發(fā)的TCP/IP代碼。但當(dāng)時(shí)還是研究生的B伯伯怒了,拒絕把BBN TCP/IP加入BSD,因?yàn)樗X得BBN的TCP/IP寫得不好。于是B伯伯出手了,端的是一箭封喉,很快就寫出了高性能的伯克利版TCP/IP。當(dāng)時(shí) BBN和DARPA簽了巨額合同開發(fā)TCP/IP Stack,誰知他們的代碼還不如一個(gè)研究生的好。于是他們開會。只見當(dāng)時(shí)B伯伯穿個(gè)T-shirt出現(xiàn)在會議室(當(dāng)時(shí)穿T-shirt不象現(xiàn)在,還是相 當(dāng)散漫的哈)。只見BBN問:你怎么寫出來的?而B伯伯答:簡單,你讀協(xié)議,然后編程就行了。最令偶暈倒的是,B伯伯碩士畢業(yè)后決定到工業(yè)界發(fā)展,于是就 到了當(dāng)時(shí)只有一間辦公室的Sun, 然后他就把Sparc設(shè)計(jì)出來樂... 象這種軟硬通吃的牛人,想不佩服都不行的說。據(jù)Bill Joy的同事說,一般開會的時(shí)候B伯伯總是拿一堆雜志漫不經(jīng)心地讀。但往往在關(guān)鍵之處,B伯伯發(fā)言,直切要害,提出漂亮的構(gòu)想,讓同事們徹底崩潰。對了,他還是Java Spec和JINI的主要作者之一。

心目中的編程高手 (2)

John.Carmack.png    John Carmack ,ID Software的founder和Lead Programmer。上個(gè)月和一個(gè)搞圖形的師兄聊天,他竟然不知道John Carmack, 也讓偶大大地暈了一把。不過也許搞研究的和搞實(shí)戰(zhàn)的多少有些隔吧。想必喜歡第一人稱射擊游戲的都知道J哥哥。90年代初只要能在PC上搞個(gè)小動畫都能讓人 驚嘆一番的時(shí)候,J哥哥就推出了石破天驚的Castle Wolfstein, 然后再接再勵(lì),doom, doomII, Quake...每次都把3-D技術(shù)推到極致。J哥哥的簡歷上說自己的專長是"Exhaust 3-D technology",真是牛人之言不我欺的說。做J哥哥這樣的人是很幸福的,因?yàn)楦鞔髨D形卡廠家一有了新產(chǎn)品就要向他“進(jìn)貢”,不然如果他的游戲不支 持哪種卡,哪種卡基本就會夭折樂。當(dāng)初MS的Direct3D也得聽取他的意見,修改了不少API。當(dāng)然,J哥哥在結(jié)婚前十?dāng)?shù)年如一日地每天編程14小時(shí) 以上,也是偶們凡人望塵莫及的。對了,J哥哥高中肆業(yè)(?!),可以說是自學(xué)成才。不過呢,誰要用這個(gè)例子來為自己學(xué)習(xí)不好辯護(hù),就大錯(cuò)特錯(cuò)了。那 Leonardo Da Vinci還是自學(xué)成才呢(人是私生子,不能上學(xué))。普通人和天才還是有區(qū)別的。對了,其實(shí)偶們叫“達(dá)分奇”是相當(dāng)不對的,因?yàn)閂inci是地名,而Da Vinci就是從Vinci來的人的意思。換句話說,Leonardo Da Vinci就是“從Vinci來的Leonardo”的意思。叫別人“Da Vinci”就不知所謂樂。嗯,扯遠(yuǎn)了,打住。

心目中的編程高手 (3)

David.Cutler.png    David Cutler ,VMS 和Windows NT的首席設(shè)計(jì)師,去微軟前號稱硅谷最牛的kernel開發(fā)員。當(dāng)初他和他的手下在微軟一周內(nèi)把一個(gè)具備基本功能的bootable kernel寫出來,然后說:"who can't write an OS in a week?",也是牛氣沖天的說。順便說一句,D爺爺?shù)絅T3.5時(shí),管理1500名開發(fā)員,自己還兼做設(shè)計(jì)和編程,不改coder本色啊。D爺爺天生脾 氣火爆,和人爭論時(shí)喜歡雙手猛擊桌子以壯聲勢。:-) 日常交談F-word不離口。他面試秘書時(shí)必問:"what do you think of the word 'FUCK'?",讓無數(shù)美女剎羽而歸。終于有一天,一個(gè)同樣火爆的女面對這個(gè)問題脫口而出:"That's my favorite word"。于是她被錄取樂,為D爺爺工作到NT3.5發(fā)布。

心目中的編程高手 (4)

Donald.E.Knuth.png    Donald E. Knuth 。 高爺爺其實(shí)用不著偶多說。學(xué)編程的不知道他就好像學(xué)物理的不知道牛頓,學(xué)數(shù)學(xué)的不知道歐拉,學(xué)音樂的不知道莫扎特,學(xué)Delphi的不知到Anders Hejlsberg,或者學(xué)Linux不知道Linus Torvalds一樣,不可原諒啊。:-) 為了讓文章完整,就再羅唆幾句吧。高爺爺本科時(shí)就開始給行行色色的公司寫各種稀奇古怪的編譯器掙外快了。他賣給別人時(shí)收一兩千美元,那些公司拿了 code,加工一下賣出去就是上萬上十萬。不過也沒見高爺爺不爽過,學(xué)者本色的說。想想那可是60年代初啊,高爺爺寫編譯器寫多了,順帶就搞出了個(gè) Attribute Grammar和LR(k),大大地造福后人啊。至于高爺爺在CalTech的編程比賽(有Alan Kay得眾多高高手參加)總是第一,寫的Tex到86年就code freeze,還附帶2^n美分獎勵(lì)等等都是耳熟能詳,偶就不饒舌樂。順便說一下,高老大爺是無可爭議的寫作高手。他給Concrete Mathematics寫的前言可謂字字鏗鏘,堪為前言的典范。他的技術(shù)文章也是一絕,文風(fēng)細(xì)致,解釋精當(dāng),而且沒有學(xué)究氣,不失輕快跳脫。記得幾年前讀 Concrete Mathematics,時(shí)不時(shí)開懷大笑,讓老媽極其郁悶,覺得我nerdy到家,不可救藥。其實(shí)呢,子非魚,安知魚之樂,更不知那完全是高爺爺?shù)墓凇?說到寫作高手,不能不提Stephen A. Cook。他的文章當(dāng)年就被我們的寫作老師極力推薦,號稱典雅文風(fēng)的樣本。庫爺爺一頭銀發(fā),身材頎長,總是面帶謙和的微笑,頗有仙風(fēng)道骨,正好和他的仙文 相配的說。高爺爺其實(shí)還是開源運(yùn)動的先驅(qū)。雖然他沒有象Richard Stallman那樣八方奔走,但他捐獻(xiàn)了好多作品,都可以在網(wǎng)上看到,比如著名的Mathematical Writing,MMIXWare,The Tex Book等,更不用說足以讓他流芳百世的Tex樂。

心目中的編程高手 (5)

Ken.Thompson.png    Ken Thompson ,C 語言前身B語言的作者,Unix的發(fā)明人之一(另一個(gè)是Dennis M. Riche老大,被尊為DMR),Belle(一個(gè)厲害的國際象棋程序)的作者之一,操作系統(tǒng)Plan 9的主要作者(另一個(gè)是大牛人Rob Pike, 前不久被google挖走了)。Ken爺爺也算是計(jì)算機(jī)歷史上開天辟地的人物了。1969年還是計(jì)算機(jī)史前時(shí)代,普通人都認(rèn)為只有大型機(jī)才能運(yùn)行通用的操 作系統(tǒng),小型機(jī)只有高山仰止的份兒。至于用高級語言來寫操作系統(tǒng),更是笑談。Ken爺爺自然不是池中物,于是他和DMR怒了,在1969年到1970間用 匯編在PDP-7上寫出了UNIX的第一個(gè)版本。他們并不知道,一場轟轟烈烈的UNIX傳奇由此拉開了序幕。Ken爺爺在1971年又把Unix用C重 寫,于是C在隨后20年成就了不知多少豪杰的夢想和光榮。Ken爺爺還有段佳話:裝了UNIX的PDP-11最早被安裝在Bell Lab里供大家日常使用。很快大家就發(fā)現(xiàn)Ken爺爺總能進(jìn)入他們的帳戶,獲得最高權(quán)限。Bell Lab里的科學(xué)家都心比天高,當(dāng)然被搞得郁悶無比。于是有高手怒了,跳出來分析了UNIX代碼,找到后門,修改代碼,然后重新編譯了整個(gè)UNIX。就在大 家都以為“這個(gè)世界清凈了”的時(shí)候,他們發(fā)現(xiàn)Ken爺爺還是輕而易舉地拿到他們的帳戶權(quán)限,百思不解后,只好繼續(xù)郁悶。誰知道這一郁悶,就郁悶了14年, 直到Ken爺爺?shù)莱鰝€(gè)中緣由。原來,代碼里的確有后門,但后門不在Unix代碼里,而在編譯Unix代碼的C編譯器里。每次C編譯器編譯UNIX的代碼, 就自動生成后門代碼。而整個(gè)Bell Lab的人,都是用Ken爺爺?shù)腃編譯器。

心目中的編程高手 (6)

Rob.Pike.png    Rob Pike , AT&T Bell Lab前Member of Technical Staff,現(xiàn)在google研究操作系統(tǒng)。羅伯伯是Unix的先驅(qū),是貝爾實(shí)驗(yàn)室最早和Ken Thompson以及Dennis M. Ritche開發(fā)Unix的猛人,UTF-8的設(shè)計(jì)人。他還在美國名嘴David Letterman的晚間節(jié)目上露了一小臉,一臉憨厚地幫一胖子吹牛搞怪。讓偶佩服不已的是,羅伯伯還是1980年奧運(yùn)會射箭的銀牌得主。他也是個(gè)頗為厲 害的業(yè)余天文學(xué)家,設(shè)計(jì)的珈瑪射線望遠(yuǎn)鏡差點(diǎn)被NASA用在航天飛機(jī)上。他還是兩本經(jīng)典,The Unix Programming Environment 和 The Practice of Programming 的作者之一。如果初學(xué)者想在編程方面精益求精,實(shí)在該好好讀讀這兩本書。它們都有中文版的說。羅伯伯還寫出了Unix下第一個(gè)基于位圖的窗口系統(tǒng),并且是 著名的blit終端的作者。當(dāng)然了,羅伯伯還是號稱銳意革新的操作系統(tǒng),Plan9,的主要作者。可惜的是,Plan9并沒有引起多少人的注意。羅伯伯一 怒之下,寫出了振聾發(fā)聵的雄文 Systems Software Research is Irrelevant,痛斥當(dāng)下系統(tǒng)開發(fā)不思進(jìn)取,固步自封的弊病。雖然這篇文章是羅伯伯含忿出手,頗有偏激之詞,但確實(shí)道出了系統(tǒng)開發(fā)的無奈:開發(fā)周期 越來越長,代價(jià)越來越大,用戶被統(tǒng)一到少數(shù)幾個(gè)系統(tǒng)上,結(jié)果越來越多的活動是測量和修補(bǔ),而真正的革新越來越少。就在羅伯伯郁悶之極的時(shí)候,google 登門求賢來樂。如果說現(xiàn)在還有一家大眾公司在不遺余力地把系統(tǒng)開發(fā)推向極致的話,也就是google樂。隨便看看google的成果就知道了。具有超強(qiáng)容 錯(cuò)和負(fù)載平衡能力的分布式文件系統(tǒng)GFS(現(xiàn)在能夠用100,000臺廉價(jià)PC搭起一個(gè)巨型分布系統(tǒng),并且高效便宜地進(jìn)行管理的系統(tǒng)也不多哈),大規(guī)模機(jī) 器學(xué)習(xí)系統(tǒng)(拼寫檢查,廣告匹配,拼音搜尋。。。哪個(gè)都很牛的說),更不用說處理海量并行計(jì)算的各式google服務(wù)了。Rob在System Software Research is Irrelevant里蕭瑟地說現(xiàn)在沒有人再關(guān)心系統(tǒng)研究的前沿成果了。想不到他錯(cuò)了,因?yàn)間oogle關(guān)心。google網(wǎng)絡(luò)了大批功成名就的牛人,還 有大量初生牛犢般博士做開發(fā),顯然不是沒事耍酷,而是因?yàn)樗鼈兊拈_發(fā)總是試圖吸取系統(tǒng)研究的最新成果。想必Rob Pike在google很幸福。愿他做出更棒的系統(tǒng)。

心目中的編程高手 (7)

Dennis.M.Ritchie.png    Dennis M. Ritchie 既然Ken Thompson是我的偶像,新聞組上人稱DMR的Dennis M. Ritchie自然也是,畢竟兩人共同締造了UNIX,而Dennis幾乎獨(dú)力把C搞大(當(dāng)然,C的前身是B,而B是Ken Thompson一手做出來的)。J D兩人1983年分享圖靈獎,是有史以來少數(shù)幾個(gè)因工程項(xiàng)目得獎的工程師(本來是唯一的一對兒,但Alan Kay才因?yàn)镾mallTalk得獎,所以就成了唯二的樂)。一個(gè)人一生能做出一個(gè)卓越的系統(tǒng)已經(jīng)不易,DMR的C和UNIX長盛不衰近30年,至今生機(jī) 勃勃,DMR此生可以無憾的說。D爺爺也算有家學(xué)淵源:他老爸在AT&T貝爾實(shí)驗(yàn)室工作了一輩子,并在電路設(shè)計(jì)方面卓有成就,還出了本頗有影響的 書The Design of Switching Circuits,據(jù)說在交換理論和邏輯設(shè)計(jì)方面有獨(dú)到的論述。當(dāng)然,D爺爺和他老爸是不同時(shí)代的人:他老爸的研究成形于晶體管發(fā)明之前,而D爺爺?shù)墓ぷ?離了晶體管就玩兒不轉(zhuǎn)樂。:-D不要看D爺爺搞出了C,其實(shí)他最愛的編程語言是Alef,在Plan9上運(yùn)行,支持并行編程。Alef的語法和C相似,但 數(shù)據(jù)類型和執(zhí)行方式都和C大大不同。說到語言,D爺爺對后來人有非常中肯的建議:抱著學(xué)習(xí)的目的來開發(fā)你自己的語言,不要冀望于它被眾人接受。這個(gè)建議不 光對語言開發(fā)有用,也適用于其它大型系統(tǒng)的開發(fā)。別的不說,DMR后來領(lǐng)導(dǎo)自己的團(tuán)隊(duì)在1995年和1996分別推出了Plan9和Inferno操作系 統(tǒng),又用多少人知道呢?其實(shí),D爺爺當(dāng)初也沒想過C會風(fēng)行世界。他開發(fā)C的初衷和Eric S. Raymond在Cathedral and Bazaar里闡述的一樣,就是要消除自己對現(xiàn)有工具的不爽之處。誰知D爺爺無心插柳,C竟然受到眾多程序員的狂熱擁戴,連D爺爺自己都大惑不解。在一次 采訪中D爺爺說大概那是因?yàn)镃的抽象程度碰巧既滿足了程序員的要求,又容易實(shí)現(xiàn)。當(dāng)然C一度是Unix上的通用語言也是原因。但不管怎么說,D爺爺對編程 語言出色的審美意識奠定了C廣為流傳的基礎(chǔ)。最后八卦一下。D爺爺?shù)臉I(yè)余愛好和NBA大牛Karl Malone一樣:開卡車。不過D爺爺更喜歡開NASCAR,而KM獨(dú)愛巨無霸。J D爺爺自稱心中不供偶像,如果一定要說一個(gè),那就是Ken Thompson了。現(xiàn)在Ken爺爺退休當(dāng)飛機(jī)教練去了,而D爺爺當(dāng)了貝爾實(shí)驗(yàn)室系統(tǒng)開發(fā)部的頭,整日忙于開支票。他倆合作20年,屢屢創(chuàng)造歷史。這段令 人神往的佳話,也就長留你我心中樂。P.S.,很多人都以為Brian W. Kernighan是C的作者。其實(shí)BWK只是寫了那本經(jīng)典K&R C。據(jù)D爺爺說,他,Ken和Kernighan三人中,Kernighan最能寫文章,他次之,而Ken寫得最少;但說到編程,Ken爺爺才是當(dāng)之無愧 的老大。

心目中的編程高手 (8)

Edsger.Wybe.Dijkstra.png    Edsger Wybe Dijkstra 對,就是E.W. Dijkstra. 一提到EWD,很多人就會想起找最短路徑的Dijkstra Algorithm,就好像一提到Sir. Tony Hoare,就想起Quick Sort一樣。其實(shí)這些個(gè)算法不過是兩個(gè)牛人在他們職業(yè)生涯中最瑣碎的貢獻(xiàn)。比如Dijkstra算法,無非是戴爺爺在1956年為了展示新計(jì)算機(jī) ARMAC的計(jì)算能力,初試身手的成果,屬于他的算法處女作。據(jù)戴爺爺自述,他搞出最短路徑算法的時(shí)候連紙筆都沒用。當(dāng)時(shí)他和他老婆在阿姆斯特丹一家咖啡 廳的陽臺上曬太陽喝咖啡,突然就把這個(gè)算法想出來樂。而且當(dāng)時(shí)的算法研究還比較原始,牛人們忙著用計(jì)算機(jī)搞數(shù)值計(jì)算,對離散算法不屑一顧。那時(shí)連一個(gè)象樣 的專注于離散算法的專業(yè)期刊都沒有。戴爺爺于是推遲發(fā)表這個(gè)算法。直到1959年,他才把這個(gè)算法發(fā)表在Numerische Mathematik的創(chuàng)刊號上,權(quán)為捧場。:-) EWD在多個(gè)領(lǐng)域牛氣沖天,端的是理論和編程兩手硬的高手。只不過他的很多工作比較深刻,學(xué)校的老先生們覺得本科生接受不了,不給本科生講而已。戴爺爺大 概因?yàn)樽疃搪窂剿惴ㄒ粦?zhàn)成名,于是有人請他參加另一臺計(jì)算機(jī)X1的設(shè)計(jì)工作,并且把設(shè)計(jì)實(shí)時(shí)中斷系統(tǒng)的任務(wù)派給了他。現(xiàn)在看來實(shí)時(shí)中斷也許不算什么,但要 知到,X1前根本就沒有實(shí)時(shí)中斷的概念。實(shí)現(xiàn)它簡直就是一場豪賭。戴爺爺起初還不情愿,但經(jīng)不住項(xiàng)目負(fù)責(zé)人Bram和Carel的輪番“吹捧”:我們知道 實(shí)時(shí)中斷讓您工作變得非常困難,但象您這樣的牛人肯定能做出來的說。結(jié)果戴爺爺被糖衣炮彈徹底擊穿,接下了這個(gè)燙手山芋。兩三年后,他不僅搞出了實(shí)時(shí)中 斷,還圍繞這個(gè)寫出了自己的博士論文,順利戴上博士帽。讓戴爺爺真正成名立萬的還是在X1上開發(fā)的Algo60,最早的高級語言之一。戴爺爺沒日沒夜地工 作了8個(gè)月,就搞出了Algo60,也因此獲得了1972年的圖靈獎。因?yàn)锳lgo60,戴爺爺發(fā)表了一篇石破天驚的文章:Recursive Programming,于是人們才知道,原來高級語言也可以高效地實(shí)現(xiàn)遞歸,原來從此以后,所有程序員都不可避免地和戴爺爺發(fā)明的一個(gè)詞(應(yīng)該說是概 念)打交道:堆棧。而且Algo60還讓戴爺爺深入地思考多道程序設(shè)計(jì)的問題,最終發(fā)明了每個(gè)系統(tǒng)程序員都繞不開的概念:semaphore。當(dāng)然,戴爺 爺總是把他發(fā)明的概念嚴(yán)格形式化,極具科學(xué)家本色的說。和這些成就想比,他提出的吃飯的哲學(xué)家問題,也就沒什么好說的了。說來好笑,當(dāng)時(shí)的大學(xué)(忘了哪所 了)還是覺得戴爺爺沒有受過正統(tǒng)的數(shù)學(xué)訓(xùn)練,也不是專門搞數(shù)值分析的,所以最后不太情愿地給了他一個(gè)教職。這種小挫折并不能妨礙象戴爺爺這樣的牛人創(chuàng)造歷 史。他一邊教數(shù)值分析(:-D),一邊開始開發(fā)一個(gè)新的操作系統(tǒng),并培養(yǎng)計(jì)算機(jī)科學(xué)家。幾年后,THE Multiprogramming System橫空出世。THE是第一個(gè)支持松散耦合,顯式同步的進(jìn)程并由此使得嚴(yán)格證明系統(tǒng)沒有死鎖變得容易的操作系統(tǒng)。可惜戴爺爺任職的系不識貨,還強(qiáng) 行解散了他的研究小組(1972年戴爺爺給他的系主任說他得了圖靈獎,系主任的第一反應(yīng)是你們搞計(jì)算機(jī)就喜歡亂發(fā)獎)。這讓戴爺爺相當(dāng)郁悶,得了抑郁癥。 在極度郁悶之中,戴爺爺決定用寫作來治療自己的抑郁癥。于是經(jīng)典就誕生樂:Notes on Structured Programming。戴爺爺從此被尊為結(jié)構(gòu)化編程的奠基人,而且他的抑郁癥也被治好樂。EWD太牛,結(jié)果他的故事也太多。先到這里吧。1973起,他 的故事就在美國發(fā)生了。

心目中的編程高手 (9)

Anders.Hejlsberg.png    Anders Hejlsberg , 微軟.NET的首席架構(gòu)師,編程語言設(shè)計(jì)和實(shí)現(xiàn)的頂尖高手。他一手做出了Turbo Pascal,也是Delphi, J++(尤其是WFC),C#和.NET的主要作者。這些作品的名字足以為他立傳。作為一個(gè)程序員,我在這樣的大師面前實(shí)在無語。生子當(dāng)如Anders的 說。李維的《Borland傳奇》里已詳細(xì)講述了Anders的傳奇故事,我就不用費(fèi)舌了:http://java.mblogger.cn/iexploiter/posts/1505.aspx。Artima上有Anders談C#的系列訪談。MSDN上有一段Anders導(dǎo)游的錄像。有興趣可以去看看牛人的豐采。 
posted @ 2008-10-22 21:29 BeyondCN 閱讀(121) | 評論 (0)編輯 收藏

黑客書架上出現(xiàn)頻率最高的9部半書籍


每一位黑客都需要一個(gè)堅(jiān)實(shí)的圖書館來尋找靈感以及查找參考資料。這兒的列表能給你一些你想要的東西,里面既有計(jì)算機(jī)科學(xué)的頂級大學(xué)教材,也有對業(yè)界的真知灼見,還有你不可或缺的參考書籍。它囊括了黑客的經(jīng)典著作。 

人月神話:軟件工程評述-周年版 

Fredrick P. Brooks著 

這本論述軟件工程中人的因素的經(jīng)典著作出版于1975年。這些年來,技術(shù)已經(jīng)發(fā)生了很大的變化,但是人的因素還是和原來一樣讓人頭痛。這是一本有深刻洞察力的書籍,也是一本在業(yè)界非常著名,常常被引用的書籍。《人月神話》概括了許多在大中型項(xiàng)目中經(jīng)常遇到的,也是非常致命的問題。它提出了2條著名的準(zhǔn)則: 

?人月神話:向一個(gè)已經(jīng)延后的項(xiàng)目中投入更多的人力資源只會讓它更延后 
?沒有銀彈:沒有一種策略,技術(shù)或者技巧可以極大地提高程序員的生產(chǎn)力 
我不僅向程序員推薦這本書,也想任何一個(gè)項(xiàng)目管理人員推薦這本書。項(xiàng)目經(jīng)理和程序員都會喜歡布魯克斯清楚而明晰的觀點(diǎn)。 

C 程序設(shè)計(jì)語言(第二版) 


這是一本權(quán)威的C語言參考書籍,人們通常叫它K&R。它無比精煉,同時(shí)也能恰到好處地給初學(xué)者提供足夠的信息。K&R提供的信息剛好是你需要的,不多也不少。274頁的篇幅是你說能發(fā)現(xiàn)的參考書中最緊湊的。我敢說Java的作者是很難寫出如此簡明扼要的著作。 

這本書適合任意一個(gè)學(xué)習(xí)C語言或者想尋找C語言參考書的人。K&R也是任何一位想撰寫語言參考或者技術(shù)著作的人必讀的書目。 

如果你沒有任何的編程經(jīng)驗(yàn),K&R不太適合做為起點(diǎn)。但是如果你足夠有沖勁的話,它還是能讓你學(xué)到不少東西。初學(xué)者需要去買一本答案,它提供了所有練習(xí)的詳細(xì)解釋。 

計(jì)算機(jī)程序設(shè)計(jì)與解釋 (第二版) 

Harlod Abelson和Gerald Jay Sussman著 

SICP是一本被很多頂級高校,諸如加州大學(xué)伯克利分校,麻省理工學(xué)院等,使用的入門書籍。它用Scheme語言介紹了許多強(qiáng)大的范例,比如遞歸,lamda表達(dá)式,抽象以及解釋性語言。 

我發(fā)現(xiàn)這本書做為入門教材是難以想象的厚重。我工作了幾年并且對這些東西有了更深的了解以后,再來重新讀這本書,仍然學(xué)到了很多東西。 

如果你在課堂上沒用到這本書,我推薦你把它找來仔細(xì)看看自己遺漏了什么,特別是你沒用使用過LISP這樣的語言的話。 

代碼大全2:軟件架構(gòu)的實(shí)用手冊 

Steve McConnell著 

《代碼大全2》是一本在軟件架構(gòu)方面得到高度評價(jià)的書。McConnell在書中定義了主要的編程和調(diào)試的架構(gòu),也闡述了一些架構(gòu)設(shè)計(jì),詳細(xì)設(shè)計(jì),單元測試,整合和整合測試的內(nèi)容。 

這本書的主要目的是讓你寫出更好的代碼。McConnell涉及了包括管理軟件復(fù)雜度,重構(gòu),代碼風(fēng)格和寫出優(yōu)美的注釋等方方面面的內(nèi)容。 

這本書推薦給任何一個(gè)想寫出健壯的代碼的人。當(dāng)你學(xué)習(xí)到了良好的代碼實(shí)踐,那么你就會節(jié)約很多起步的時(shí)間;同時(shí),它對于有多年經(jīng)驗(yàn)的程序員也能幫助他們改變自己不好的開發(fā)習(xí)慣。 

算法簡介 

Thomas H. Cormen,Charles E. Leiserson,Ronald L. Rivest 和 Clifford Stein著 

這是另外一本教材。《算法簡介》也許是大學(xué)中使用的最多的算法教材。它同時(shí)也是一本非常好的參考書。 

盡管在實(shí)際情況中大部分程序員在生產(chǎn)環(huán)境中都不會自己去寫諸如快速排序這樣的算法實(shí)現(xiàn),但是算法知識是了解你所應(yīng)用的庫以及你自己代碼實(shí)際效率的基礎(chǔ)。 

《算法簡介》被推薦給任何一個(gè)想完善自己算法技巧的開發(fā)人員,它也被推薦給那些對NP完備性,隨機(jī)算法,快速傅立葉變換等課題感興趣的人。閱讀這本書也需要良好的數(shù)學(xué)知識。 

設(shè)計(jì)模式:可復(fù)用的面向?qū)ο筌浖脑瓌t 

Erich Gamma,Richard Helm,Ralph Johnson和John M. Vlissides著 

這本書闡述了各種面向?qū)ο蟮脑O(shè)計(jì)模式。對于書中23種模式的每一種,作者都給出了深度分析,這些分析包括清晰的示例,常見的缺陷,相關(guān)的模式,用C++或者SmallTalk寫的示例代碼。這些模式涵蓋了單件模式,觀察者模式,模板方法模式,迭代器模式和代理模式。 

這本書對于使用面向?qū)ο笳Z言的中級或者高級開發(fā)者是必讀書目。剛剛進(jìn)入面向?qū)ο箝_發(fā)的開發(fā)人員最好在掌握了面向?qū)ο笳Z言以及在非實(shí)驗(yàn)性項(xiàng)目中深入實(shí)踐以后再來學(xué)習(xí)里面的模式。否者你學(xué)到的東西不可能是很牢靠的。 

編程珍珠 (第二版) 

Jon Bentley著 

這本書在學(xué)習(xí)解決問題的技巧方面非常突出。15章的每一個(gè)章節(jié)都對應(yīng)著一個(gè)任務(wù),例如排序電話號碼,創(chuàng)建回文詞或者搜索文本。Bentley先定義問題,然后再提出不同的解決方案,提供了討論和對每個(gè)解決方案清晰的分析,最后再給出了編程的基本原則。 

《編程珍珠》包含了一些非常聰明的主意,它們可以用來做為解決一些小問題的時(shí)候做為參考。但是這本書更有用的地方是如何從工程師的角度解決問題。 

我把這本書推薦給每一位享受編程工作的人。 

編譯器:原則,技術(shù)和工具 

Alfred V. Aho, Ravi Sethi 和Jeffrey D. Ullman著 

《編譯器:原則,技術(shù)和工具》通常被叫做“龍書”(封面上有一條紅色的龍)。它是編譯原理課堂上的標(biāo)準(zhǔn)圖書。它涵蓋了你想知道的編譯器的各方面:文法,分析器,詞法分析,語法,中間語言的產(chǎn)生,運(yùn)行時(shí)環(huán)境,優(yōu)化等等。如果你對這些東西還沒有足夠的了解的話,那么你就要準(zhǔn)備去學(xué)習(xí)一些新的術(shù)語和概念,比如確定性有限自動機(jī),有限狀態(tài)自動機(jī),LR剖析器等等。 

我很喜歡龍書的各部分并且對里面的數(shù)學(xué)概念和理論很感興趣(它們貫穿了整本書)。如果你很喜歡正則表達(dá)式和狀態(tài)機(jī),那么你會很喜歡這本書。另外一方面,如果你想知道一些現(xiàn)代編譯器的實(shí)現(xiàn)原理,你可能無法在里面找到你所需要的東西。龍書是1986年出版的,不能涵蓋這些現(xiàn)代的話題。 

Unix強(qiáng)大工具 第三版 

Shelley Powers,Jerry Peek,Tim O' Reilly和Mike Loukides著 

這本書是O'Reilly出版社出版的很多偉大著作中的一本。《Unix強(qiáng)大工具》達(dá)到了1200頁,完全描述了Unix下面命令行工具,用法,腳本語法示例。 

《Unix強(qiáng)大工具》是一本組織的非常好的參考書。如果你依次讀下去,你會發(fā)現(xiàn)自己會變成讓人驚訝的計(jì)算機(jī)癮君子典型代表。 

這本書里面大部分內(nèi)容都可以在Google上面搜索到,但是有時(shí)候我們也需要這樣一本很好的參考書。 

這本書是為數(shù)不多的適合于初學(xué)者和專家的書籍之一。不管是Unix新手還是有多年經(jīng)驗(yàn)的系統(tǒng)管理員都能從這本書獲益。 

便車旅行者指南終極收藏版:5部完整的小說和一個(gè)故事 

Douglas Adams著 

這不是一本技術(shù)書籍。但是如果你沒讀過這部便車旅行者三部曲,你就不可能摘掉計(jì)算機(jī)癮君子的帽子。它其實(shí)包含了5本書,《銀河便車指南》,《宇宙盡頭的旅館》,《生活,宇宙和一切》,《再見,謝謝那些魚》,《大部無害》,再加上一篇短篇小說《小柴法德謹(jǐn)慎行事》 

在發(fā)現(xiàn)對生活,宇宙和一切的答案中找到愉悅。學(xué)習(xí)如何制作Pan Galactic Gargle Blaster(這應(yīng)該是一種飲料,但是不知道怎么翻譯。出處在這兒:http://ywsl.com/bbs/bbsshow.aspx?id=42780 

The Hitch Hiker's Guide to the Galaxy also mentions alcohol. It says that the best drink in existence is the Pan Galactic Gargle Blaster.It says that the effect of a Pan Galactic Gargle Blaster is like having your brains smashed out by a slice of lemon wrapped round a large gold brick. 
),而這一切都是毫不痛苦的。 

這個(gè)版本有漂亮的黑色皮革封面,還有絲帶書簽。閱讀的時(shí)候就好像在讀一本很好的圣經(jīng),而且還更可信。(我要在某些喜歡爭辯的人發(fā)現(xiàn)我之前收回我的話,這只是一個(gè)玩笑而已啦) 
posted @ 2008-10-21 13:27 BeyondCN 閱讀(427) | 評論 (1)編輯 收藏
epoll是多路復(fù)用IO(I/O Multiplexing)中的一種方式,但是僅用于linux2.6以上內(nèi)核,在開始討論這個(gè)問題之前,先來解釋一下為什么需要多路復(fù)用IO.

以一個(gè)生活中的例子來解釋.

假設(shè)你在大學(xué)中讀書,要等待一個(gè)朋友來訪,而這個(gè)朋友只知道你在A號樓,但是不知道你具體住在哪里,于是你們約好了在A號樓門口見面.

如果你使用的阻塞IO模型來處理這個(gè)問題,那么你就只能一直守候在A號樓門口等待朋友的到來,在這段時(shí)間里你不能做別的事情,不難知道,這種方式的效率是低下的.

現(xiàn)在時(shí)代變化了,開始使用多路復(fù)用IO模型來處理這個(gè)問題.你告訴你的朋友來了A號樓找樓管大媽,讓她告訴你該怎么走.這里的樓管大媽扮演的就是多路復(fù)用IO的角色.

進(jìn)一步解釋select和epoll模型的差異.

select版大媽做的是如下的事情:比如同學(xué)甲的朋友來了,select版大媽比較笨,她帶著朋友挨個(gè)房間進(jìn)行查詢誰是同學(xué)甲,你等的朋友來了,于是在實(shí)際的代碼中,select版大媽做的是以下的事情:

int n = select(&readset,NULL,NULL,100);

for (int i = 0; n > 0++i)
{
   
if (FD_ISSET(fdarray[i], &readset))
   {
      do_something(fdarray[i]);
      --n;
   }
}

epoll版大媽就比較先進(jìn)了,她記下了同學(xué)甲的信息,比如說他的房間號,那么等同學(xué)甲的朋友到來時(shí),只需要告訴該朋友同學(xué)甲在哪個(gè)房間即可,不用自己親自帶著人滿大樓的找人了.于是epoll版大媽做的事情可以用如下的代碼表示:
n=epoll_wait(epfd,events,20,500);
    
for(i=0;i<n;++i)
{
    do_something(events[n]);
}

在epoll中,關(guān)鍵的數(shù)據(jù)結(jié)構(gòu)epoll_event定義如下:
typedef union epoll_data {
                
void *ptr;
                
int fd;
                __uint32_t u32;
                __uint64_t u64;
        } epoll_data_t;

        
struct epoll_event {
                __uint32_t events;      
/* Epoll events */
                epoll_data_t data;      
/* User data variable */
        }; 
可以看到,epoll_data是一個(gè)union結(jié)構(gòu)體,它就是epoll版大媽用于保存同學(xué)信息的結(jié)構(gòu)體,它可以保存很多類型的信息:fd,指針,等等.有了這個(gè)結(jié)構(gòu)體,epoll大媽可以不用吹灰之力就可以定位到同學(xué)甲.

別小看了這些效率的提高,在一個(gè)大規(guī)模并發(fā)的服務(wù)器中,輪詢IO是最耗時(shí)間的操作之一.再回到那個(gè)例子中,如果每到來一個(gè)朋友樓管大媽都要全樓的查詢同學(xué),那么處理的效率必然就低下了,過不久樓底就有不少的人了.

對比最早給出的阻塞IO的處理模型, 可以看到采用了多路復(fù)用IO之后, 程序可以自由的進(jìn)行自己除了IO操作之外的工作, 只有到IO狀態(tài)發(fā)生變化的時(shí)候由多路復(fù)用IO進(jìn)行通知, 然后再采取相應(yīng)的操作, 而不用一直阻塞等待IO狀態(tài)發(fā)生變化了.

從上面的分析也可以看出,epoll比select的提高實(shí)際上是一個(gè)用空間換時(shí)間思想的具體應(yīng)用

posted @ 2008-10-16 09:40 BeyondCN 閱讀(287) | 評論 (0)編輯 收藏
僅列出標(biāo)題
共2頁: 1 2 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            日韩一级在线| 国产亚洲福利社区一区| 欧美mv日韩mv国产网站app| 欧美日韩精品三区| 国产一区二区三区自拍| 日韩亚洲国产精品| 麻豆av福利av久久av| 99re热这里只有精品视频| 久久精品国产清高在天天线 | 在线观看国产精品网站| 正在播放亚洲| 久久久噜噜噜久久人人看| 最新精品在线| 午夜精品一区二区三区四区| 欧美成人a∨高清免费观看| 国产女同一区二区| 正在播放亚洲一区| 亚洲国产精品福利| 久久久久成人网| 国产嫩草影院久久久久| 国产精品高清在线观看| 亚洲国产欧美在线人成| 久久精品亚洲一区二区| 在线中文字幕一区| 免费试看一区| 激情综合色丁香一区二区| 亚洲伊人伊色伊影伊综合网| 欧美激情亚洲精品| 亚洲午夜激情免费视频| 亚洲特级片在线| 久久久久国产精品一区二区| 欧美岛国在线观看| 国产精品久久久久久久久久直播| 国产精品自拍在线| 亚洲一区二区影院| 亚洲成色精品| 老妇喷水一区二区三区| 国产欧美在线播放| 亚洲女性裸体视频| 亚洲精品永久免费| 免费中文日韩| 亚洲国产经典视频| 老司机午夜精品视频| 亚洲深夜影院| 免费日韩av电影| 久久久亚洲欧洲日产国码αv| 国产麻豆视频精品| 香港久久久电影| 亚洲一区二区三区在线视频| 国产精品成人免费精品自在线观看| 亚洲日本精品国产第一区| 久热爱精品视频线路一| 欧美亚洲日本一区| 国产日韩精品一区二区三区在线| 亚洲男人的天堂在线| 亚洲色图在线视频| 国产精品99一区二区| 亚洲图片欧美一区| 在线视频欧美精品| 国产精品嫩草久久久久| 性欧美8khd高清极品| 午夜精品三级视频福利| 国产精品亚洲不卡a| 欧美一区二区三区视频免费| 午夜视黄欧洲亚洲| 精品成人国产在线观看男人呻吟| 久久网站免费| 免费久久久一本精品久久区| 日韩视频在线观看免费| 在线亚洲+欧美+日本专区| 国产伦精品一区二区三| 久热精品视频在线| 欧美—级a级欧美特级ar全黄| 99av国产精品欲麻豆| 在线视频精品一| 国产一区二区久久久| 美女免费视频一区| 欧美成人69av| 亚洲一区免费| 久久aⅴ国产紧身牛仔裤| 亚洲国产毛片完整版| 亚洲人妖在线| 国产日韩欧美一区| 欧美激情精品久久久久久变态| 欧美日韩一区二区三区视频| 久久都是精品| 欧美日韩久久精品| 久久久免费av| 欧美日韩国产成人精品| 久久精品欧美日韩| 久久久五月天| 欧美日韩视频一区二区| 欧美亚洲免费在线| 欧美h视频在线| 欧美一区二区三区在线| 欧美777四色影视在线| 久久av一区二区三区| 欧美电影免费观看大全| 久久亚洲色图| 国产精品毛片高清在线完整版| 免费的成人av| 国产精品美女在线观看| 欧美激情亚洲综合一区| 国精产品99永久一区一区| 99精品视频一区| 亚洲黄色成人网| 久久电影一区| 夜夜嗨av一区二区三区免费区| 校园春色国产精品| 亚洲精品一区二区网址| 欧美一区二区高清在线观看| 亚洲伦理中文字幕| 久久激情网站| 久久久999精品免费| 国产精品人成在线观看免费 | 欧美一站二站| 欧美日韩一区二区三区免费| 麻豆精品在线观看| 国产区二精品视| 在线视频你懂得一区二区三区| 亚洲精品看片| 欧美va亚洲va国产综合| 麻豆av福利av久久av| 国产亚洲毛片在线| 亚洲女同精品视频| 午夜久久久久久| 国产精品一区二区三区免费观看| 一区二区三区高清不卡| 亚洲视频电影图片偷拍一区| 欧美女同视频| 99国产精品久久久久久久久久| 一区二区三区回区在观看免费视频 | 欧美1区2区视频| 久久久久久欧美| 国产精品v日韩精品v欧美精品网站| 欧美一区二区三区四区夜夜大片 | 国内精品美女在线观看| 羞羞漫画18久久大片| 久久精品论坛| 激情一区二区| 欧美精品三级| 一区二区成人精品| 香蕉成人伊视频在线观看| 国产精品一区在线观看| 欧美影院在线| 欧美国产在线电影| 夜夜嗨av一区二区三区四季av | 久久精品欧美日韩| 欧美成人免费全部| 亚洲精品欧美在线| 欧美午夜一区二区福利视频| 亚洲一区美女视频在线观看免费| 欧美一区二区三区四区在线观看地址 | 日韩视频在线免费观看| 午夜国产一区| 国模一区二区三区| 欧美~级网站不卡| 一区二区三区精密机械公司| 一区二区三区日韩欧美精品| 国产精品福利av| 久久精品99国产精品日本| 亚洲国产一二三| 欧美午夜在线观看| 久久av一区二区| 亚洲国产成人精品久久| 久久一二三区| 亚洲欧美在线免费| 亚洲校园激情| 欧美精品福利视频| 欧美影院成年免费版| 久久久噜噜噜久久中文字幕色伊伊| 午夜精品视频在线| 久久精品国产亚洲精品| 久久精品国产69国产精品亚洲| 久久精品国产91精品亚洲| 久久午夜视频| 欧美福利电影网| 欧美精品免费看| 国产精品一二三四| 国产一区日韩二区欧美三区| 激情亚洲成人| 亚洲最快最全在线视频| 午夜精品久久久久久久99黑人| 欧美中文在线视频| 免费成人在线视频网站| 亚洲大胆女人| 99精品欧美| 欧美中文字幕久久| 免费视频一区| 亚洲人www| 亚洲一区不卡| 久久精品亚洲国产奇米99| 免费在线亚洲欧美| 欧美日韩亚洲综合一区| 国产精品久久久久久久一区探花 | 久久精品国产第一区二区三区最新章节| 一本一本久久a久久精品综合妖精| 久久国产精品久久精品国产| 亚洲综合首页| 亚洲淫性视频|