在《程序员》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用一个错误的例子来证明自己的观点,给我留下了很大的问号。希望下次能看到他用真正有说服力的论据来阐明对正交性的看法。

计算机语言的正交性,【zt】程序设计语言正交特性的一点思考相关推荐

  1. 程序设计语言正交特性的一点思考

    在<程序员>2003年第12期的一篇访谈录中,Ruby的发明人Matz较详细地阐述了Ruby的设计思想及遵循的原则,其中大部分我都深以为然,特别是他高度重视语言设计过程中人的因素则更是让人 ...

  2. 浅谈计算机程序设计语言,探讨计算机程序设计语言教学

    [文章摘要] 随着社会不断的发展与进步,计算机作为现代先进产物的代表,已经很快的进入到社会中的各行各业.而程序设计作为计算机的核心内容,也同样引起了大家的重视,同时计算机程序设计也是高校开设的一门重要 ...

  3. 数学模型转化为计算机语言,程序设计语言类课程教学选题方法探讨

    <程序设计语言类课程教学选题方法探讨>由会员分享,可在线阅读,更多相关<程序设计语言类课程教学选题方法探讨(6页珍藏版)>请在人人文库网上搜索. 1.程序设计语言类课程教学选题 ...

  4. 第四代语言计算机语言,第四代程序设计语言是什么程序语言

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. 第四代语言是非过程化的程序设计语言,用户只说明要求做什么,而把具体的执行步骤交由软件自动执行. 程序设计语言是用于书写计算机程序的 ...

  5. 设计一种计算机语言控制系统,可编程控制器程序设计语言有哪几种?

    可编程控制器程序设计语言有哪几种?各程序设计语言的含义和特点? 在可编程控制器中有多种程序设计语言,它们是梯形图语言.布尔助记符语言.功能表图语言.功能模块图语言及结构化语句描述语言等.梯形图语言和布 ...

  6. 如何选择程序设计语言

    程序设计语言是人和计算机通信的最基本的工具,会影响人的思维和解题方式,影响人和计算机通信的方式和质量,影响其他人阅读和理解程序的难易程度. 选择适宜的程序设计语言的原因: 1.根据设计去完成编码时,困 ...

  7. Ada 程序设计语言(The Ada Programming Language)[第一集]

    Ada 程序设计语言(The Ada Programming Language)[第一集]- - 版权(Copyright) <Ada 程序设计语言>的版权隶属于网站 VenusIC,允许 ...

  8. 《类型和程序设计语言》

    目录 <类型和程序设计语言> 百科 λ演算 归约策略 并行与并发 图灵机 停机问题 非确定图灵机 新浪博客:Lambda Calculus -- 叙述通俗朴素 我的最爱Lambda演算-- ...

  9. 计算机基础(05)程序与程序设计语言

    5 程序设计基础 5.1 程序与程序设计语言 5.1.1 程序设计语言 @1 程序设计语言:用于编写计算机程序的语言,语言的机制是一组记号和规则 @2 程序设计语言的基本成分: 数据成分:描述程序所需 ...

最新文章

  1. Python基础(7)——for循环
  2. 用友BQ商业智能设计模式——概述
  3. Docker: 解决Centos 7中Permission Denied的问题
  4. 管道符、shell变量、环境变量配置文件
  5. 中国在线直播教育行业发展形势与竞争策略研究报告2022-2028年
  6. JDK的OutputStream为什么方法write(int b)的入参类型是int呢?
  7. 12亿行代码,阿里巴巴这一年的技术报告和梦想报告
  8. Eclipse安装Rust插件 (Ubuntu)
  9. 联发科(MediaTek)Pentonic 电视芯片将率先支持杜比视界 IQ 精准细节功能
  10. 关于SVN提交注释的问题
  11. Win32汇编——过程控制(环境变量、命令行参数、可执行文件执行)
  12. centos中,tomcat项目创建文件的权限研究
  13. 嵌入式大神:教你如何从零开始学习路线解析
  14. C语言-Switch 语句
  15. 转行学java被辞退_不是所有行业都是“跳槽穷半年,转行穷三年”,至少转行学Java不是!...
  16. libgdx开发记录
  17. 波兰计算机专业大学排名,波兰留学大学排名
  18. VBA编程之操作单元格
  19. 【并行计算】OpenMP编程和MPI编程简单教程
  20. WTL CCheckListViewCtrl详解及示例

热门文章

  1. 潇洒郎: git配置、拉取、提交代码
  2. 使用build_opener 自定义 opener
  3. WordPress果果代码高亮插件
  4. 2840 WIKIOI——评测
  5. 6.2.4 SparkSQL《Action》《Trans,类似RDD,存储,Slc,Whr,gBy,oBy,JOIN,集合,控制,窗口,内建》《语句,文件,UDF,HIVE》《原理》JOIN,解析过程
  6. 北京大学肖臻老师《区块链技术与应用》公开课 03-BTC-数据结构
  7. qt信号与槽连接的书写规范
  8. 数据存为CSV格式遇到的问题
  9. GUI 应用程序架构的十年变迁:MVC、MVP、MVVM、Unidirectional、Clean
  10. pmd java规则_PMD执行Java代码分析的原理