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

pro*_*eek 48 language-agnostic programming-languages

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

  • 这是冗长/简洁吗?我的意思是,如果一种语言可以写下比另一种语言更短的内容,那是否意味着表现力?请参阅我的另一个问题 - 关于代码密度作为编程语言能力度量的文章
  • 这是语言的力量吗?Paul Graham说,一种语言比另一种语言更强大,因为一种语言可以做到另一种语言无法做到的事情(例如,LISP可以用宏执行其他语言不能做的事情).
  • 这只是让生活更轻松的事吗?正则表达式可以是其中一个示例.
  • 它是解决同一问题的另一种方式:像SQL一样解决搜索问题?

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

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

Ree*_*sey 30

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

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

var results = collection.Where(item => item > 5);
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • @TrueWill:不,不一定.但是,我认为声明性编程本质上更具表现力 - 它更多的是程序员的意图是否基于所编写的代码而明确......至少对我而言. (3认同)

Way*_*rad 27

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

bad_event = events.find(&:bad)
Run Code Online (Sandbox Code Playgroud)

而不是你想要它做什么:

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
Run Code Online (Sandbox Code Playgroud)

有助于表达的事物包括:

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

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

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


Nor*_*sey 25

我喜欢Matthias Felleisen的表现力量概念,这是比较性的:

  • 如果以下两种情况都成立,语言A的表达严格程度高于语言B:

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

通常我们希望通过观察某种语言,例如"基本核心",使这些比较,也许我们要考虑℃的话,只有while不也fordo...while.或许我们想要考虑Perl的方言,只有前缀if形式而没有unless形式.但有时这些表面的句法区别正是我们所说的"表达能力"; 对一些程序员来说,重要的是要说

die ("found no solutions") unless length(solutions) > 0;
Run Code Online (Sandbox Code Playgroud)

代替

if (length(solutions) == 0) { die("found no solutions"); }
Run Code Online (Sandbox Code Playgroud)

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

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

您可以在他的论文"编程语言的表达能力"的前两页中阅读更详细的说明.之后出现了许多尖头理论:-)


Jer*_*fin 7

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

如果你想要一个更实际的回答来解释大多数人在说出来时的真正含义,坦率地说,这是相当不同的.通常,至少在我的经验中,"表达"语言意味着:"我喜欢这种语言,但不能引用任何客观的支持." 相反,"表现力较弱"或"没有表现力"之类的东西通常意味着:"我不喜欢这种语言,但不能引用任何客观支持."

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

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

  1. 能够表达各种各样的想法.
  2. 清楚地(通常是简洁地)表达某些特定想法的能力.

考虑一些极端的例子,汇编语言符合第一个标准的高度表达 - 你可以用汇编语言完成任何你可以用更高级语言做的事情,你可以用汇编语言做一些你不能做的事情.基本上任何更高级别的语言.

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

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


And*_*res 5

对我来说,它是语言通过代码清楚地表达我的逻辑和想法的能力,这样其他阅读代码的人就可以很容易地弄清楚我写代码时的想法。