提及编程语言时,“表达性”是什么意思?


74

我在“ JavaScript是一种非常有表现力的语言”之类的句子中听到很多这个词。这仅仅是意味着没有很多规则,还是“表达”具有更具体的含义?


好的,谢谢您的答复。似乎是个滑字!我会避免使用它,并坚持使用那些我确定会理解的东西。
morgancodes

我对OP感到惊讶。人们如何自信地在技术文献中使用该词,就好像它具有确切的含义一样,这很奇怪。
Sridhar Sarnobat,2015年

Answers:


64

“富有表现力”意味着对于编译器和人类读者而言,编写易于理解的代码都很容易。

表现力的两个因素:

  • 直观可读的结构
  • 缺乏样板代码

将这种具有表现力的Groovy与具有较低表现力的Java等效进行比较:

3.times {
   println 'Hip hip hooray'
}

for(int i=0; i<3; i++) {
    System.out.println("Hip hip hooray");
}

有时,您会为了表达性而牺牲精度-Groovy示例之所以有效,是因为它假定Java使您可以明确指定。


2
在您的两个示例中,“精度”是什么意思?Groovy假定哪种Java使您更具特色?(注意:int在Java中使用循环变量是Java的产物;它本质上是没有意义的,并且比Groovy的精确度更高3.times,所以不是)
Andres F.

6
@AndresF。从技术上讲,Groovy假定您正在写标准输出,而Java则迫使您明确声明这一点。我认为对于Groovy而言,这完全是100%好的假设,但是确实如此。但是我认为OP的观点被误认为是我最初对您的反应。经过进一步的思考,我认为重点不是代码背后的核心功能不够精确,而是如何不太精确。在Groovy中,我们不知道后台如何执行循环。而循环根本不在Java中。因此,表现力。
李·李

1
《新牛津美国词典》将“表达性”定义为“有效传达思想或情感”。我认为这就是“易于理解”的含义;该代码可以有效地传达其意图,而无需文档来用人类语言进行解释。
杰弗里·富尔顿

我也想知道这种表示法expressiveness。虽然我通常有一个非常直观的想法,但我很高兴是否存在某种语言表达能力的“形式定义”,如果是,那么用来衡量表达能力的“量化指标”是什么?
lllllllllllll

17

我的意思是说它能够以一种易于阅读和简洁的方式表达想法/算法/任务。

通常我将一种表达语言与语法糖联系起来,尽管并非总是如此。C#中具有表现力的示例如下:

  • foreach (而不是显式地编写迭代)
  • using声明(而不是明确地写在try /终于)
  • 查询表达式(用于编写LINQ查询的简单语法)
  • 扩展方法(允许链接方法调用,同样主要用于LINQ)
  • 匿名方法和lambda表达式(允许更轻松的委托和表达式树构造)

一个不同的例子是泛型:在C#获得泛型之前,您无法ArrayList在代码中表达“仅包含字符串”的想法。(当然,您可以记录下来,也可以编写自己的StringList类型,但这并不完全相同。)


11

尼尔·格里夫特(Neal Grafter)的博客对此主题做了很好的引用。

在我看来,如果语言构造使您能够编写(和使用)没有该构造就无法编写(和使用)的API,那么它就具有表达力。

我想说,这意味着您可以更自然地用代码表达您的想法。


6

那是一个艰难的过程。

对我而言,这与您表达意图的难易程度有关。这在不同的语言中有所不同,并且在很大程度上取决于您要执行的操作,因此这是泛化的领域。当然,它也是主观的和个人的。

容易想到,高级语言总是更具表现力,但我认为那不是真的。这取决于您要表达的内容,即问题域。

例如,如果要打印具有二进制模式的浮点数0xdeadbeef,则在C中比在Bash中容易得多。但是,与C相比,Bash是一种超高级语言。另一方面,如果您要运行一个程序并将其输出收集到一个文本文件中,则是如此简单,它在Bash中几乎是不可见的,但至少需要使用C语言的一页代码(假定为POSIX环境)。


2

3
我没有发现该文章是计算机编程(OP所寻找的)表达能力的清晰示例。它不是很富有表现力。同样根据其主要定义,Assembly和C#将具有同等的表现力,因为它们可以表示相同的想法,即使它们显然比另一个更具有表现力。其他答案可以帮助我理解,这是表达想法的“轻松”之处,这些想法与众不同。
Despertar

2

在这里,一个非常有争议的比较:

http://redmonk.com/dberkholz/2013/03/25/programming-languages-ranked-by-expressiveness/

那么,根据这些指标,最好的语言是什么?

如果您根据中位数和IQR的排名选择前10名,然后将它们的交集取整,这就是剩下的内容。中位数和IQR在名称后立即列出:

Augeas(48、28):配置文件的特定于域的语言

Puppet(52,65):用于配置REBOL的另一种DSL(57,47):一种用于分布式计算的语言

eC(75,75):Ecere C,面向对象的C导数

CoffeeScript(100,23):一种可转换为JavaScript的高级语言

Clojure(101,51):一种Lisp方言,用于功能性并发编程

Vala(123,61):GNOME使用的一种面向对象的语言

Haskell(127,71):具有强静态类型的纯函数式编译语言


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.