维基百科将表现力定义为:
让我们重新阅读该页面。首先要注意的是它说的是“语言”,而不是“编程语言”,并且它的大多数示例不是编程语言,例如,给出的第一个示例是OWL2 EL和OWL2 RL的比较,两者都是本体语言。
可以将这一概念应用于编程语言,也可以应用于模式匹配语言,标记语言,查询语言,视觉样式表语言,正则表达式(以及它们所引用的所有常规语言)等等。甚至可以提到自然语言(如英语)的表达能力,这通常是非常非正式的,但是在考虑与自然语言处理相关的问题时会更加认真。
“想法”是否指我们可以与机器通信的事物(操作,结构,算法等?)?还是它指的是可以被捕获并与其他人交流的“人类”概念?
它指的是可以用该语言表达的内容,纯粹被视为事物本身。
例如,(在我的示例中,我将始终使用javascript,因为您的问题表明它是您所知道的一种语言)考虑使用javascript语句:
var x = 3 + 4;
这表示已计算3和4的值之和,并且该值与标签相关联 x
给定名称空间范围内的。
如果我们销毁了世界上所有的计算机,并将这些代码写在一张纸上,那么在javascript中,它仍然具有相同的含义。我们将无法在任何东西上运行这样的代码,但是语言的抽象定义仍然是我们可以谈论的话题。
这似乎有些古怪,但实际上,语言是可以抽象地推理而不考虑真实计算机的事物,这一点实际上非常重要。一方面,人们对计算机语言在实践中尚不可行的理论要点进行推理,这是使我们走到今天的现状之一。计算机需要计算机科学,但是计算机科学不需要计算机,仅需要计算概念。
当然,我们确实在现实世界中使用计算机,而如今,有很多人在实践中使用计算机,而不是一些专家在理论上讨论它们。您链接到的页面显示:
术语表达能力可以在一定范围内使用。它可能意味着可以用该语言表达的想法的度量:
第一种意义在涉及语言及其含义的形式描述的数学和逻辑领域中占主导地位,例如形式语言理论,数学逻辑和过程代数。
在非正式讨论中,该术语通常是指第二种意义,或两者兼有。讨论编程语言时通常是这种情况。已努力将这些术语的非正式使用形式化
在该术语的这两种用法中,第一种的实际影响仅与与可以传达给计算机的内容有关。
第二个方面在阅读和书写方面都与人类的理解有关,尽管这样做的程度在使用之间存在很大差异,因为它们是非正式的,因此没有严格定义。
例如,如果我们采用JavaScript之类的语言,并对变量名称施加了怪异的限制,例如变量必须是一个8位数字,并带有下划线,match /^_[0-9]{8}$/
,我们会失去表达能力吗?
根据正式定义,我们没有丧失表达能力:我们只能使用1亿个变量,但是如果确实需要,我们可以通过创建对象以在新创建的命名空间中容纳更多变量来解决这个问题。因此,今天用javascript编写的任何程序都可以以这种新形式重写,因此它们具有同等的表达力。
根据非正式的定义,我们已经失去了一些,但是多少取决于我们的非正式程度,这将有所不同,因为您再也无法说出信息使用的“规则”是什么。我们可能会说我们损失了很少的钱,因为在同一个命名空间中具有超过1亿个变量的程序必须重写,而不仅仅是简单的替换。更加非正式的用法将再次指代这种笨拙的变量名称对人类全面性的精神影响。
还值得注意的是,人们会非正式地考虑根本不属于该语言的事物。考虑从创建到现在的Javascript更改。
按照最正式的定义,表达能力几乎没有变化。毕竟,图灵完全是完整的。
通过更非正式的定义,它在某些事情(例如数组操作,异常处理以及正则表达式的包含(也许是最重要的))中已变得更具表达性。尽管它们通常可以在几行之内完成一秒钟的执行时间,但它们并没有执行以前用javascript无法完成的任何工作,这需要数千字节的代码才能用javascript1.0编写,而且运行时间很长。
再次根据非正式的定义,它与javascript在浏览器中的首次使用(可以更改表单输入的值, document.write
而页面首先被解析并移动到新位置或在历史记录中来回或前进,到今天为止(几乎可以更改页面上的任何内容,包括基于服务器调用中的数据),这绝对是巨大的,尽管其中大多数与javascript不相关,但与对象模型和API有关而不是语言(例如IE中的vbscript同样从这些更改中受益)。
在我看来,最后的使用是非正式的,以至于不能真正正确,但这就是非正式定义的问题。
按照正式的定义,它实际上并没有变得更具表现力。