编程语言
编程语言(programming language)可以简单的理解为一种计算机和人都能识别的语言。一种计算机语言让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。
编程语言,本质上仅仅是一种形式语言,其是人类定义的一种公式化的人工语言,其是为了便于人类使用计算机而被开发出来的。并且,计算机技术是不断发展的,因此编程语言以及相关技术同样是处于发展变化之中的。到目前为止,已经出现了许许多多的编程语言,对于这些不同编程语言,其具有着不同的语言特性,那么我们应该如何去统一评价这些编程语言呢?
目前为止,有许多评价编程语言的标准,以下为一些常用的标准:
可读性
评价一种程序设计语言最重要的标准之一就是写出的程序是否易于阅读和理解,在1970年之前,人们认为软件开发主要就是写代码,因此,此时代的出现的程序设计语言最重要的优点是效率和机器可读性。语言结构的设计更多是从计算机角度考虑,而不是计算机用户的角度。然而在20 世纪70年代,出现了软件生命周期的概念,其认为写代码只涉及很少的部分,维护才是周期中最主要的部分,特别是从成本角度来看.因为易维护性主要由程序的可读性决定,所以可读性成为衡量程序质量和程序设计语言的重要指标。这是程序设计语言演进过程中一个重要的转折点,关注焦点明显地从面向机器转变为面向人。
可读性必须要放在问题领域的背景中进行考虑,例如,如果一段说明计算过程的程序不是用专门说明计算的编程语言写成的,程序的表达就会不自然地绕弯子,导致读起来特别困难。因此,这要求我们需要按需选择合适的编程语言进行实际的开发。
影响程序可读性的重要因素是编程语言的特性。
第一,程序设计语言的整体简单性极大地影响它的可读性。一种有大量基本结构的语言比结构少的语言学起来更难,那些必须要使用大规模语言的程序员,通常只学该语言的一个子集而忽略语言的其他特性。这种学习模式有时被语言设计者用来解释为什么设计那么多语言结构。但这种说法没有道理,因为只要写程序的人所学的子集与读程序的人所熟悉的子集不一样,可读性问题就会出现。当然,语言的简单性也不能过分.例如,大多数汇编语言语句的形式与意义都是简单性的典型体现。但是这种简单性使得汇编语言可读性较差。由于缺乏更复杂的控制语句,程序结构不清晰;由于语句简单,与髙级语言相比,同样的程序需要多得多的语句。因此,如果髙级语言的控制结构和数据结构不适当,也会导致上述问题的产生。
第二,程序设计语言具有特性多样性,即能够用不止一种方法来实现特定操作。
第三,部分编程语言允许运算符重载,即一个运算符有多种意义虽然这很有用,但是如果允许使用者创建他们自己的重载,并且不是按常规重载的话,会降低可读性。例如,重载“+” 用于整数和浮点数的加法显然是可取的。事实上,这一重载减少了运算符数目,从而简化了语言。但是假设程序员定义“+”用于两个一维数组,表示求两个数组中所有元素的和,那么由于它不同于通常的矢置求和,将会使写程序的人与读程序的人对这个程序都难以理解。使程序难以理解的一个更极端的例子是定义"+” 用于两个矢量 t 表示求各自第一个元素的差。
第四,程序设计语言的正交性。程序设计语言的正交性意味着相对较小的基本结构集合,能够以相对较少的组合方式来构成语言的控制结构和数据结构.而且基本结构的任一种可能组合都是合法且有意义的。
一个语言特性是正交的,意味着它独立于程序中出现位置的上下文( 正交这一名称来自于正交向量这一数学概念,即正交向量相互独立)。正交性与简单性直接相关,即语言设计越正交,语言规则需要的特例就越少,特例越少意味着设计的规范程度越髙,这使得语言更容易学习、阅读和理解。
但是,过多的正交也会产生问题。有正交性的程序设计语言的基本结构的任一种可能组合都是合法且有意义的,这种自由组合可以产生极其复杂的结构。例如,只要结果是一个地址,一个条件语句就可以与声明语句及其他各类语句一起出现在赋值的左边。
这种极端的正交形式导致了不必要的复杂性。由于语言需要大量基本结构,高度的正交性将产生爆炸性的组合方式。因此,即使组合方式很简单,它们的整体数量也会导致语言的复杂。
由此可见,语言的简单性至少部分归因于相对少量的基本结构的组合, 以及正交原理的有限应用
可写性
可写性是衡量在指定问题领域内用语言创建程序有多容易的一个标准。与可读性一样,可写性也必须在语言针对的问题领域中来考虑。当在一个特定应用领域中比较两种语言的可写性时,发现其中一个是为该应用设计的,另一个不是,这显然不合理。当然,过多的正交有损于可写性。当几乎任何基本结构的组合都合理时,程序中的错误会难以检测,从而导致代码中的谬误无法被编译器发现。
影响可写性的最重要一方面是程序设计语言的抽象性。抽象是当代程序设计语言设计的关键性概念,这是抽象在现代程序设计方法学中扮演中心角色的反映。简而言之,抽象就是以允许忽略许多细节的方式来定义和使用复杂结构和操作的能力。因此,程序设计语言所允许的抽象程度以及表达抽象的自然程度,对语言的可写性非常重要。
目前,程序设计语言支持两类不同的抽象:过程抽象和数据抽象。过程抽象的一个简单例子,是使用子程序来实现程序中多处需要的排序算法。如果没有子程序,排序的代码将不得不重复出现在所有需要的地方,这会使程序写起来冗长而乏味。也许更重要的是,如果不使用子程序,使用排序子程序的代码会与排序算法的细节混在一起,严重地掩盖代码流程和整体意图。数据抽象的一个简单例子,是用类表示的一颗完全二叉树,其将二叉树完全抽象为一些操作和行为,而忽略了其内部的具体实现,这自然要比使用一维数组表示一颗完全二叉树方便。因