编程语言的表现力是什么意思?
当人们想强调一种语言比另一种语言更好时,我会看到很多“表现力”一词。 但我不明白他们的意思。
你怎么看待编程语言的表现力? 你能用一些代码表现出表现力吗?
与表现力和DSL有什么关系? 人们拿出DSL来获得表现力吗?
我个人认为,语言的“表现力”实际上取决于语言结构能够“表达”开发者的意图。
例如,我觉得C#(特别是通过C#3+的LINQ)变得更加富有表现力。 这个LINQ语句就是一个很好的例子:
var results = collection.Where(item => item > 5);
在不知道语言细节或正在使用的实现的情况下,开发人员的意图(在我看来)是非常清晰的。
我不认为语言的冗长性等于它的表现力,但是,有一些相关性。 如果一种语言需要大量代码才能表达抽象,那么它就不那么富有表现力。 这是两个相关但不同的概念。
权力也是如此 - 尽管这里语言的特征(即:权力)必须足够完整,以清楚地表达抽象。 没有这个,表现力就会受到影响。 也就是说,如果功能集很难理解,语言在功能方面可能非常“强大”,但不一定具有表现力。
“表现力”意味着只能说出你想做的事情的能力:
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
有助于表达的事物包括:
在某种程度上,任何语言的表现力都可以通过尽可能多地将子程序/对象推入子程序/对象来增加,以便剩下的大部分代码是“要做什么”。 在最抽象的代码中需要的“如何去做”代码的量是语言表达能力的一种度量:代码看起来像伪代码越多,程序员的意图就越具有表现力。
人们还可以思考一种语言的“元表现力”:在构建领域特定语言时语言的表达力如何?
我喜欢Matthias Felleisen的表达力的概念,这是比较的:
如果以下两种情况都是正确的,则语言A比语言B严格得多:
通常我们想通过查看某种语言的“基本核心”来进行这些比较 - 例如,我们可能只想考虑一种C的方言, while
不是同时for
和do...while
。 或者,也许我们想要考虑Perl的一种方言, if
只有形式,只有前缀, unless
形式。 但有时候,这些肤浅的句法区别正是我们所说的“表现力”。 对一些程序员来说,重要的是要说
die ("found no solutions") unless length(solutions) > 0;
代替
if (length(solutions) == 0) { die("found no solutions"); }
所以你必须确定你是否在询问表面语法的表达能力或更深的结构。
另一件我喜欢Felleisen的想法是,它承认两种语言的概念是完全不同的,但它们都不是比其他语言更有表现力。
您可以在他的论文“编程语言的表现力”前两页阅读更详细的论述。 之后出现了很多尖头理论:-)
链接地址: http://www.djcxy.com/p/20679.html上一篇: What do you mean by the expressiveness of a programming language?
下一篇: What programming language is most like natural language?