Programming languages 什么是;富有表现力的;指的是编程语言?

Programming languages 什么是;富有表现力的;指的是编程语言?,programming-languages,Programming Languages,我经常在“javascript是一种非常有表现力的语言”这样的句子中听到这个词。这仅仅意味着没有太多的规则,还是“表达性”有更具体的含义?我认为这意味着它能够以易于阅读和简洁的方式表达想法/算法/任务 通常我会把一种语言的表达性与句法上的糖分联系起来,尽管情况并非总是如此。在C#中,它具有表现力的例子如下: foreach(而不是显式编写迭代) 使用语句的(而不是显式编写try/finally) 查询表达式(用于编写LINQ查询的更简单语法) 扩展方法(允许方法调用链接,同样主要用于LINQ)

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

我认为这意味着它能够以易于阅读和简洁的方式表达想法/算法/任务

通常我会把一种语言的表达性与句法上的糖分联系起来,尽管情况并非总是如此。在C#中,它具有表现力的例子如下:

  • foreach
    (而不是显式编写迭代)
  • 使用语句的
    (而不是显式编写try/finally)
  • 查询表达式(用于编写LINQ查询的更简单语法)
  • 扩展方法(允许方法调用链接,同样主要用于LINQ)
  • 匿名方法和lambda表达式(允许更轻松地构造委托和表达式树)
另一个例子是泛型:在C#得到泛型之前,您无法在代码中表达“仅包含字符串的
ArrayList
”的思想。(当然,你可以把它记录下来,也可以自己写
StringList
类型,但这不完全一样。)

在这个主题上引用一段很好的话

在我看来,如果一种语言结构能让你写作,它就是有表现力的 (和使用)没有构造就无法编写(和使用)的API

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

也许这个网站可以帮助你

简而言之,他说:在我看来,如果一个语言构造能够让你编写(和使用)一个没有构造就无法编写(和使用)的API,那么它就是表达性的。在Java提议的语言扩展闭包的上下文中,控制抽象API似乎不受竞争方案的支持。

这是一个困难的问题

对我来说,这与你表达意图的轻松程度有关。这在不同的语言中是不同的,并且在很大程度上取决于您想要做什么,所以这是一个普遍使用泛化的领域。当然,这也是主观和个人的

人们很容易认为更高级的语言总是更具表现力,但我不认为这是真的。这取决于您试图表达的内容,即问题域


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

“Expressive”意味着很容易编写易于理解的代码,无论是对于编译器还是对于人类读者

形成表现力的两个因素:

  • 直观可读的结构
  • 缺少样板代码
将这种表现力较强的Groovy与表现力较弱的Java eqivalent进行比较:

3.times {
   println 'Hip hip hooray'
}
vs


for(int i=0;i这里是一个非常有争议的比较:

那么,根据这些标准,什么是最好的语言呢

如果你根据中位数和IQR排名选出前10名,那么 以它们的交叉点为例,这里是剩下的。中间值和IQR 紧跟在名称后面的是:

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

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

eC(75,75):Ecere C,一个具有对象定向的C导数

CoffeeScript(100,23):一种更高级的语言,可以将组件转换为JavaScript

Clojure(101,51):用于函数式并发编程的Lisp方言

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

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


好的,谢谢你的回答。似乎这是一个狡猾的词!我会避免使用它,并坚持使用那些我确信我能理解的词。我和OP一样感到惊讶。奇怪的是,人们在技术文献中使用这个词时有多么自信,好像它有一个确切的含义。你说的“精确”是什么意思在您的两个示例中?Groovy假设哪种Java使您更具体?(注意:Java中使用
int
循环变量是Java的产物;它本质上没有意义,也没有比Groovy的
3.times
更“精确”,所以不是这样)@AndresF.从技术上讲,Groovy假设您正在编写标准输出,而Java强制您显式地声明这一点。我认为Groovy方面这是一个完全100%好的假设,但确实如此。但我认为OP的观点与我最初的反应一样是错误的。进一步思考后,我认为这一点是正确的并不是说代码背后的核心功能不够精确,而是“如何”不够精确。在Groovy中,我们不知道循环是如何在幕后执行的。而在Java中,循环根本不是幕后执行的。因此,表达性。新的《牛津美国词典》将“表达性”定义为“有效地传达思想或感觉”。我想这就是“易于理解”的意思;代码可以有效地传达其意图,而不需要文档来用人类语言解释。我还想知道符号
表达性
。虽然我通常得到了非常直观的想法,但我很高兴是否有一些“形式定义”语言表达能力,如果是的话,衡量表达能力的“量化指标”是什么?我没有发现那篇文章是计算机编程中表达能力的一个明确例子(OP正在寻找的)。它是
for(int i=0; i<3; i++) {
    System.out.println("Hip hip hooray");
}