程序設計語言正交特性的一點思考

程序設計語言正交特性的一點思考


程序設計語言正交特性的一點思考

作者:佚名 文章來源:不詳 點擊數: 更新時間:2007-7-1


在《程序員》2003年第12期的一篇訪談錄中,Ruby的發明人Matz較詳細地闡述了Ruby的設計思想及遵循的原則,其中大部分我都深以爲然,特別是他高度重視語言設計過程中人的因素則更是讓人激賞。

不過他對正交特性的看法卻讓我頗爲迷惑。
正交(orthogonal)本來是一個幾何概念,表示的是垂直相交,後來又被擴展到線性代數中,表示內積爲零的兩個向量之間的關係。線性空間中一組兩兩正交的非零向量被稱爲正交向量組,而在n維線性空間中,n個向量組成的正交向量組一定線性無關,因而也就一定是該空間的基。這意味着什麼呢?這意味着該空間中的任意向量都可以由這一組正交向量經線性組合(linear combination)得出,因此我們可以通過這n個向量表達整個線性空間。
在計算機科學領域,正交這個詞通常表示基本元素之間互相獨立與良好隔離,並且它們具備組合出一個完整"空間"的能力,而缺少其中任何一個都會喪失這種能力。如果把全面的邏輯運算想象成一種"運算空間"的話,那麼not、and、or就是三個互不影響、互相不可替代的正交操作。由它們出發可以完成任意複雜的邏輯運算,但是無論少了誰,我們都會遇到某些無法完成的邏輯任務。再比如unix/linux系統提供了許多基本工具,其中每種工具都只專注於完成一種基本任務,並且基本任務也不互相重疊,所以工具的接口之間是正交關係,而用戶則能通過管道等機制組合使用這些工具以完成各種複雜的任務。
一門程序語言的功能可以看作是一個"功能空間",語言只需擁有一組數量合適的正交特性(這些特性各自提供了互相獨立的基本功能)便可以通過組合它們來實現"功能空間"中的任何功能。很明顯,這種設計是在不損失語言能力的前提下的最簡方案。不過最簡是否意味着最優則仁者見仁智者見智了。在這點上Matz認爲:正交性是設計的工具,而不是設計的主要目標。但是接下來Matz用來證明他觀點的例子則似乎有些問題。
Matz舉的例子是C++的缺省參數和函數重載。他認爲這兩種特性是正交的,可以同時使用,但是混合使用有時卻會導致問題,這就需要人腦去猜測編譯器的處理規則,而這種規則往往並不顯然,所以這是一個有關正交性的反例。我同意同時提供缺省參數和函數重載並不是個好主意,尤其對初學者來說。比如下面的代碼就會產生一個有些晦澀的編譯錯誤:
void foo(int a = 2005)
{
//do something using a
...
}
void foo()
{
// do something
...
}
int main()
{
foo(3); //OK
foo(); //compile error:
//ambiguous call to overloaded function
return 0;
}
但是這兩個特性是正交特性嗎?實際上缺省參數功能可以非常容易地由函數重載特性來實現:
void foo(int a)
{
// do something using a
...
}
void foo()
{
foo(2005);
}

int main()
{
foo(3); //OK
foo(); //OK,就好象調用一個缺省參數值爲2005的foo函數
return 0;
}
由此可以看出,缺省參數這個特性在功能上是冗餘的,與函數重載不可能是正交關係。這個例子恰恰演示了某些不遵循正交性的設計會帶來什麼樣的不良後果。不過能夠做一樣事情和能方便地做一樣事情是有區別的,人們常常會爲了現實的好處而犧牲理論的優美,個人認爲這也是爲什麼C++會提供缺省參數這麼一種語法糖衣(syntactic sugar)。
Matz用一個錯誤的例子來證明自己的觀點,給我留下了很大的問號。希望下次能看到他用真正有說服力的論據來闡明對正交性的看法
文章錄入:admin 責任編輯:admin


  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章