编程语言的表现力是什么意思?

时间:2010-03-11 18:14:00

标签: language-agnostic programming-languages

当人们想强调一种语言比另一种语言更好时,我会看到很多“表达能力”这个词。但我并不确切地看出它们的含义。

  • 这是冗长/简洁吗?我的意思是,如果一种语言可以写下比另一种语言更短的内容,那是否意味着表现力?请参阅我的其他问题 - Article about code density as a measure of programming language power
  • 这是语言的力量吗? Paul Graham说,一种语言比另一种语言更强大,因为一种语言可以做到另一种语言无法做到的事情(例如,LISP可以用宏执行其他语言不能做的事情)。 / LI>
  • 这只是让生活更轻松的事吗?正则表达式可以是其中一个示例。
  • 这是解决同一问题的另一种方式:像解决搜索问题的SQL一样吗?

您如何看待编程语言的表现力?你能用一些代码表现出表现力吗?

与表现力和DSL的关系是什么?人们想出DSL来获得表现力吗?

11 个答案:

答案 0 :(得分:30)

就个人而言,我觉得语言的“表现力”实际上归结为语言结构能够“明确”表达开发者的意图。

例如,我觉得C#(尤其是通过C#3+的LINQ)变得更具表现力。这个LINQ语句就是一个很好的例子:

var results = collection.Where(item => item > 5);

在不知道语言或正在使用的实现的细节的情况下,开发人员的意图(在我看来)在上述陈述中非常明确。

我不认为语言的冗长等同于它的表现力,但是,存在一些相关性。如果一种语言需要大量代码来表达抽象,那么它就不那么具有表现力了。这是两个相关但不同的概念。

权力也是如此 - 虽然这里语言的特征(即:权力)必须足够完整,以便清楚地表达抽象。没有这个,表现力就会受到影响。话虽如此,如果功能集很难理解,语言在功能方面可能非常“强大”,但不一定具有表现力。

答案 1 :(得分:26)

“表达能力”意味着只能说出你想做的事情:

bad_event = events.find(&:bad)

而不是您希望如何完成:

i = 0
bad_event = nil
while i < events.size && bad_event.nil?
  event = events[i]
  if event.bad?
    bad_event = event
  end
  i += 1
end

有助于表达的事物包括:

  • 缺乏必需的语法糖
  • 一流的功能
  • 垃圾收集
  • 动态类型或类型推断
  • 语言核心不是奴隶般的简约
  • 标准库中的良好功能

在某种程度上,任何语言的表现力都可以通过尽可能多地将“如何操作”推到子程序/对象中来增加,以便剩下的大部分代码都是“做什么”。最抽象的代码中所需的“如何做”代码的数量是语言表达能力的一种衡量标准:代码看起来越像伪代码,程序员的意图就越有表现力。

还可以考虑一种语言的“元表达性”:构建领域特定语言时语言的表达能力如何?

答案 2 :(得分:25)

我喜欢Matthias Felleisen的表现力量概念,即比较

  • 如果以下两种情况属实,语言A的表达方式比语言B更严格:

    • 用语言B编写的任何程序都可以用语言A重写,同时保持程序基本结构的完整。
    • 一些用A语言编写的程序必须进行剧烈重组才能用B语言编写。

通常我们希望通过查看某种语言的某种“基本核心”来进行这些比较 - 例如,我们可能只想考虑只有while而不是for的C语言。 }和do...while。或许我们想要考虑Perl的方言,只有前缀if形式而没有unless形式。但有时这些表面的句法区别正是我们所说的“表达能力”;对于一些程序员来说,重要的是要说

die ("found no solutions") unless length(solutions) > 0;

而不是

if (length(solutions) == 0) { die("found no solutions"); }

所以你必须确定你是否在询问表面语法或更深层结构的表现力。

我喜欢Felleisen的另一个想法是,它承认两种语言的概念肯定是不同的,但两种语言都没有比另一种更具表现力。

您可以在论文的前两页On the Expressive Power of Programming Languages中阅读更详细的说明。之后出现了许多尖头理论: - )

答案 3 :(得分:7)

如果你想要一个理论上但比大多数人更严谨的答案,你可能想要四处寻找Matthias Felleisen的关于编程语言的表达能力。我很确定在网络上看一下会至少出现几个副本。

如果你想要一个更实际的回答,大多数人真正意味着什么,当他们说出来时,坦率地说,这是相当不同的。通常,至少在我的经验中,“表达”语言意味着:“我喜欢这种语言,但不能引用任何客观的支持。”相反,诸如“表现力较弱”或“没有表现力”之类的事情通常意味着:“我不喜欢这种语言[但也不能引用任何客观的支持。”

“没有表现力”通常类似于政治家指责另一个人是“法西斯主义者” - 显然是贬义,但没有任何有意义的定义错误。

其中一个重大问题源于意见的根本区别。人们似乎对表现力至少有两种根本不同的一般观点:

  1. 能够表达各种各样的想法。
  2. 能够清楚地(通常是简洁地)表达某些特定想法。
  3. 考虑一些极端的例子,汇编语言符合第一个标准的高度表达性 - 你可以用汇编语言完成任何你可以用更高级语言做的事情,你可以用汇编语言做一些事情。基本上不能用任何更高级别的语言。

    显然,第二种方法看,汇编语言看起来并不那么好 - 它通常需要相当多的相当不透明的代码来完成任何事情。这个措施倾向于支持像Haskell或APL这样的语言,只给出几个例子。

    这两个“表达”意味着什么的概念经常接近截然相反。第一种倾向于支持“最低”级语言,而第二种倾向于倾向于“最高”级别。通过将两者结合起来,选择一个“证明”您选择的语言最具表现力的定义是非常简单的。

答案 4 :(得分:3)

Wikipedia has a bit about the concept.我自己认为语言可以用更少的东西完成更多(维基百科文章中所谓的“非正式用法”)。

我认为JavaScript具有表现力(尽管这可能是因为道格拉斯·克罗克福德将这个想法付诸实践,因为只需几个关键词就可以做到这一点)。例如,function关键字是一个函数,以及方法,类和lambda。

JavaScript中的一些代码示例(为简洁起见省略一些细节)。这是我写的一个事件类:

SJJS.util.Event = (function() {
    var _listeners = [];
    var _listenerReturns = [];

    return {
        addDomListener: function(element, eventName, listener) {
        },
        trigger: function(element, eventName) {
        },
        removeListener: function(eventlistener) {
        }
    }
})();

只有functionvar以及一些花括号和圆括号,我使用方法和私有变量创建了一个静态类。

答案 5 :(得分:3)

对我来说,语言必须能够通过代码清楚地表达我的逻辑和想法,其他人阅读我编写的代码时可以很容易地弄清楚当我这样做时我在想什么。 / p>

答案 6 :(得分:1)

我总是把它大致相当于语言的高级程度。如果你想尝试量化表现力,单位将是“每种语言的机器代码说明

在没有编写大量代码的情况下,更具表现力的语言可能非常擅长做大量的工作。但是,对于某些任务而言,它可能会更具特定领域,而且速度要慢一些。

答案 7 :(得分:1)

以LINQ为例。它允许您使用functional programming

功能编程强调功能的应用,与强调状态变化的命令式编程风格形成对比。

LINQ允许您表达您想要的内容而不是如何操作。这是表达性的一个明显例子。

答案 8 :(得分:0)

一般来说,使用完全语言的编程语言,您可以执行另一种图灵完整语言可以执行的操作。话虽这么说,有些人可以比其他人做得更好。

我表达意味着你可以轻易说出多少,以及可以说得多清楚/清楚。简洁的能力是其中的一部分(一种非常强大而简洁的语言就像J)。一般来说,我发现简洁是表达的一个很好的标志。如果语言能够以简单的方式表达复杂的操作,那么它就会朝着正确的方向发展。

至于权力,表达力并不是语言的全部力量。虽然它可能是其中的一部分,速度,安全性,稳定性,但所有这些因素都会受到影响。

示例:使用循环运算符对Common lisp中的列表求和是简洁而富有表现力的

(loop for x in list sum x)

答案 9 :(得分:0)

精确,简洁和可读性是表现力的主要组成部分。

答案 10 :(得分:0)

  

From Wikipedia在计算机科学中,语言的表达能力(也称为表现力或表现力)是可以用该语言表达和传达的思想的广度。语言表达能力越强,可以用来表示的想法的种类和数量就越多。

所以,我同意。 &#34;表达意图的语言是多么简单,全面和可组合。&#34; :我相信,这是表达能力的衡量标准。

问题:这是冗长/简洁吗?我的意思是,如果一种语言可以写下比另一种语言更短的内容,那是否意味着表达能力?

没有。例如,Brainfuck语言是否表达?我不这么认为。看看Brainfuck中的Hello World示例:

++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.

或者:hq9plus语言。 Hello World代码:

H

问题:这是语言的力量吗? Paul Graham说,一种语言比另一种语言更强大,因为一种语言可以做到另一种语言无法做到的事情(例如,LISP可以用宏做某事,而另一种语言可以做到这一点)做)。

我不同意保罗。正如您在上面的示例中所看到的,hq9plus语言正在使用Hello World进行一个字母:H。然而,大多数其他语言会用更多的字母来做。但是,您可以使用其他语言创建可组合且易于阅读的代码。如果hq9plus正在使用Hello World进行H,那么它是否意味着功能强大?我相信没有。

问题:这只是让生活更轻松的事吗?正则表达式可以是其中一个示例。

正则表达很棒,但有时会失去表现力。有时,这取决于程序员。

问题:这是解决同一问题的另一种方式:像解决搜索问题的SQL一样吗?

一半是的。 SQL是一种声明性且非常富有表现力的语言。因为底层引擎和技术可以在不改变SQL查询的情况下推进和更改。这使它非常富有表现力。有许多查询已经工作了数十年,数据库的基础技术发生了变化。但是,您的查询并不需要。我认为这是由于其表现力的强大。

我也相信功能语言非常具有表现力。因为,您只描述了您的意图,而不是 hows ,并且底层技术可以随时更改和优化,但是,它不会伤害您的富有表现力的代码。< / p>

示例:

// top 10 products with rating higher than 5
return products
  .sort(p => p.rating)
  .filter(p => p.rating > 5)
  .map(p => p.title)
  .take(10)

以上程序具有表现力,它传达了你的意图。并且,很可能它在基础机制发生变化时不会发生变化。