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

What do you mean by the expressiveness of a programming language?

当人们想强调一种语言比另一种语言更好时,我看到了很多"表达力"这个词。但我不明白他们的意思。

  • 这是言语/简洁吗?我的意思是,如果一种语言能写下比另一种语言短的东西,这是否意味着表达能力?请参阅我的另一篇关于代码密度的问题文章,作为编程语言能力的度量。
  • 它是语言的力量吗?Paul Graham说一种语言比另一种语言更强大,从某种意义上说,一种语言可以做到另一种语言不能做到的事情(例如,Lisp可以用另一种语言不能做到的宏做一些事情)。
  • 只是让生活更轻松的事情吗?正则表达式可以是其中一个例子。
  • 它是否是解决同一个问题的不同方法:像SQL这样的解决搜索问题的方法?

你认为编程语言的表现力如何?你能用一些代码来表达吗?

表现力和DSL有什么关系?人们想出DSL来获得表达能力吗?


就我个人而言,我觉得语言的"表现力"实际上取决于语言构造如何清晰地"表达"开发人员的意图。

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

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

在不知道所用语言或实现的细节的情况下,开发人员的意图(在我看来)在上面的语句中非常清楚。

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

权力也是如此——尽管在这里,语言的特性(即:权力)必须足够完整,才能清楚地表达抽象。没有这一点,表达力就会受到影响。也就是说,一种语言在特性方面可能非常"强大",但如果特性集难以理解,则不一定具有表现力。


"表达能力"是指只说你想做的事情的能力:

1
bad_event = events.find(&:bad)

而不是你想怎么做:

1
2
3
4
5
6
7
8
9
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

有助于表达的因素包括:

  • 缺乏必要的句法结构
  • 第一类函数
  • 垃圾收集
  • 动态类型或类型推断
  • 语言的核心不是奴性的极简主义
  • 标准库中的良好功能

在某种程度上,任何语言的表达能力都可以通过尽可能多地将"如何做"推到子例程/对象中来提高,这样剩下的大部分代码就是"要做什么"。最抽象的代码中所需的"如何做"代码的数量是衡量语言表达能力的一个指标:代码看起来越像伪代码。越能表达程序员的意图。

我们还可以考虑一种语言的"元表达能力":在构建特定于领域的语言时,该语言的表达能力如何?


我喜欢马蒂亚斯·费雷森的表现力的概念,这是比较的:

  • 如果以下两种情况都是正确的,那么语言A比语言B更具表现力:

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

通常我们想通过观察某种语言的"本质核心"来进行这些比较,例如,我们可能想考虑一种C语言的方言,它只有while,而不是fordo...while。或者我们想考虑一种Perl方言,它只有一个前缀if形式,没有unless形式。但有时这些表面的句法区别正是我们所说的"表达能力";对一些程序员来说,重要的是

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

而不是

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

所以你必须确定你是在问表面语法的表达能力还是更深层的结构。

我喜欢费雷森的另一个观点,那就是它承认两种语言的概念是完全不同的,但两者都没有比另一种语言更具表现力。

在他关于编程语言表达能力的论文的前两页中,您可以阅读更详细的论述。在那之后,出现了许多尖头理论:—)


如果你想得到一个比大多数人更为理论化但更为严谨的答案,你可以四处看看马蒂亚斯·费雷森关于编程语言表达能力的文章。我敢肯定,在网上随便看看,至少能找到几本。

如果你想要一个更实际的答案来回答大多数人说这句话的真正含义,坦率地说,那是相当不同的。通常,至少在我的经验中,"表达性"语言的意思是:"我喜欢这种语言,但不能举出任何客观的支持。"相反,"表达性差"或"不表达性"的意思是:"我不喜欢这种语言[也一样],但不能举出任何客观的支持。"

"不具表现力"通常类似于一个政客指责另一个"法西斯主义者"——显然是贬义的,但对所谓的错误没有任何有意义的定义。

其中一个大问题源于根本的意见分歧。对于表达能力,人们似乎至少有两种基本上不同的一般观点:

  • 表达各种观点的能力。
  • 清晰地表达某些特定想法的能力(通常是简明扼要的)。
  • 考虑一些极端的例子,根据第一个标准,汇编语言可以被定义为高度表达的语言——在汇编语言中基本上可以做在更高级别语言中可以做的任何事情,在汇编语言中也可以做一些在本质上任何更高级别语言中都不能做的事情。

    显然,用第二种方法来说,汇编语言看起来并不那么好——它通常需要大量相当不透明的代码来完成大部分工作。这种方法倾向于使用像haskell或apl这样的语言,只给出几个例子。

    "表达"的意思的这两个概念经常是截然相反的。第一种倾向于使用"最低"级别的语言,而第二种倾向于使用"最高"级别的语言。通过将两者结合起来,选择一个"证明"你所选择的语言是最具表现力的定义是非常简单的。


    对我来说,语言必须能够通过代码清晰地表达我的逻辑和想法,这样其他人阅读我编写的代码就可以很容易地了解我在做代码时的想法。


    维基百科对这个概念有点了解。我自己认为这意味着一种语言可以用更少的时间完成更多的工作(维基百科文章中所谓的"非正式用法")。

    我认为Javascript很有表现力(尽管这可能是因为道格拉斯·克罗克福德在我的Noggin中钻了这个想法),因为它只需要几个关键字就可以做很多事情。例如,function关键字是一个函数、一个方法、一个类和一个lambda。

    一些代码说明(为了简洁起见省略了一些细节)。这是我写的一个事件类:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SJJS.util.Event = (function() {
        var _listeners = [];
        var _listenerReturns = [];

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

    仅使用functionvar和一些大括号和圆括号,我就用方法和私有变量创建了一个静态类。


    以Linq为例。它允许您使用函数式编程。

    与强调状态变化的命令式编程风格不同,函数式编程强调功能的应用。

    Linq允许你表达你想做什么,而不是怎么做。这是一个表现力很明显的例子。


    我一直认为它大致相当于一门语言的高级程度。如果您想尝试量化表达能力,那么这些单位就类似于"每种语言语句的机器代码指令"。

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


    From Wikipedia: In computer science, the expressive power (also called expressiveness or expressivity) of a language is the breadth of ideas that can be represented and communicated in that language. The more expressive a language is, the greater the variety and quantity of ideas it can be used to represent.

    所以,我同意。"你表达意图的语言是多么容易、全面和可组合。":我相信,这是表达能力的衡量标准。

    问题:这是言语/简洁吗?我的意思是,如果一种语言能写下比另一种语言短的东西,这是否意味着表达能力?

    不,比如说,脑浆语言有表达力吗?我不这么认为。看看Brainfuck中的Hello World例子:

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

    或:HQ9PLUS语言。你好,世界代码:

    1
    H

    问题:这是语言的力量吗?Paul Graham说一种语言比另一种语言更强大,从某种意义上说,一种语言可以做到另一种语言不能做到的事情(例如,Lisp可以用另一种语言不能做到的宏做一些事情)。

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

    问题:这只是让生活更容易的事情吗?正则表达式可以是其中一个例子。

    正则表达式很好,但有时它们会失去表达能力。有时,这取决于程序员。

    问题:这是解决同一个问题的不同方法吗:像SQL这样的解决搜索问题的方法?

    一半是的。SQL是一种声明性的、非常有表现力的语言。因为底层引擎和技术可以在不更改SQL查询的情况下前进和更改。这使得它很有表现力。有许多查询已经工作了几十年,数据库的底层技术也发生了变化。但是,您的查询不需要。我认为这是因为它的表现力。

    我也相信功能语言是很有表现力的。因为,您只描述您的意图,而不是您的方法,并且底层技术总是可以更改和优化,但是,它不会损害您的表达代码。

    例子:

    1
    2
    3
    4
    5
    6
    // 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)

    上面的程序很有表现力,它传达了你的意图。而且,最可能的情况是,当基础机制发生变化时,它不会发生变化。


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


    一般来说,使用图灵完备的编程语言,您可以做其他图灵完备语言可以做的任何事情。也就是说,有些人比其他人做得更好。

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

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

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

    (loop for x in list sum x)