编程语言的performance力是什么意思?
当人们想强调一种语言比另一种语言更好时,我看到很多“performance力”一词。 但是我不明白他们的意思。
- 是冗长/简洁吗? 我的意思是,如果一种语言可以写下比另一种语言短的东西,那么这是否意味着expression性? 请参考我的其他问题 – 关于代码密度作为衡量编程语言能力的措施的文章
- 这是语言的力量吗? 保罗·格雷厄姆(Paul Graham)认为,一种语言比另一种语言更强大,因为一种语言可以做另一种语言无法做到的事情(例如,LISP可以使用其他语言无法做到的macros)。
- 这只是让生活更轻松吗? 正则expression式可以是其中一个例子。
- 这是解决同一个问题的另一种方式:像SQL解决search问题?
你怎么看待编程语言的performance力? 你能用一些代码来performance出performance力吗?
与performance力和DSL有什么关系? 人们拿出DSL来获得performance力吗?
就我个人而言,我觉得语言的“performance力”实际上取决于语言结构如何能够“expression”开发者的意图。
例如,我觉得C#(特别是通过C#3+的LINQ)变得更有performance力。 这个LINQ语句就是一个很好的例子:
var results = collection.Where(item => item > 5);
在不知道语言细节或者实现的细节的情况下,开发人员的意图(在我看来)是非常清楚的。
我不认为语言的冗长与expression性是相等的,但是有一些相关性。 如果一种语言需要大量的代码来expression抽象,那么它就不那么富有performance力。 这是两个相关但不同的概念。
权力也是如此 – 虽然在这里语言的特征(即:权力)必须足够完整地expression抽象。 没有这个,performance力就会受到影响。 也就是说,如果特征集很难理解,那么语言在特征方面可能非常“强大”,但不一定是expression性的。
“performance力”意味着只能说出你想做的事情的能力:
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
有助于expression的事物包括:
- 缺less所需的语法糖
- 一stream的function
- 垃圾收集
- dynamictypes或types推断
- 语言核心不是奴隶般的简约
- 标准库中的良好function
在某种程度上,任何语言的performance力都可以通过将“如何做到”尽可能地推到子程序/对象中来增加,以便剩下的大部分代码是“做什么”。 在最抽象的代码中所需要的“怎么做”代码的量是语言expression的一个尺度:代码看起来像伪代码越多,程序员的意图就越具有performance力。
人们也可以思考一种语言的“元performance力”:构build领域特定语言的语言如何expression?
我喜欢Matthias Felleisen的performance力的概念,这是比较的 :
-
如果以下两种情况都是正确的,则语言A比语言B严格得多:
- 用B语言编写的任何程序都可以用A语言重写,同时保持程序的基本结构不变。
- 一些用A语言编写的程序必须进行剧烈的重组,以便用B语言编写。
通常我们要通过查看某种语言的“基本核心”来进行这些比较,例如,也许我们只想考虑一个C的方言, while
不是do...while
。 或者,也许我们想考虑Perl的一个方言, if
只有forms,只有前缀, unless
forms。 但有时这些肤浅的句法区别正是我们所说的“performance力”。 对一些程序员来说,重要的是要说
die ("found no solutions") unless length(solutions) > 0;
代替
if (length(solutions) == 0) { die("found no solutions"); }
所以你必须确定你是否在问表面语法的expression能力还是更深层次的结构。
另一件我喜欢Felleisen的想法是,它承认两种语言的概念是绝对不同的,但都不是比其他语言更有performance力。
您可以在他的论文“编程语言的performance力”的前两页阅读更详细的论述。 之后出现了很多尖头的理论:-)
如果你想要一个有点理论性但比大多数更为严格的答案,你可能想要看看Matthias Felleisen的“ 关于编程语言的performance力” 。 我很确定,看看networking上的一些东西会翻起来至less几个副本。
如果你想要一个更实际的答案,大多数人真正的意思,当他们说,坦率地说,相当不同。 通常,至less在我的经验中,一个“expression”的语言意味着:“我喜欢语言,但不能引用任何客观的支持。” 相反,“不expression”或“不expression”的意思是“我不喜欢这种语言,但不能引用任何客观的支持”。
“不performance”往往类似于一个政客指责另一个“法西斯” – 显然是贬义的,但没有任何有意义的定义,认为是错误的。
其中一个重大问题来自于根本的意见分歧。 人们似乎至less有两个根本不同的总体思想:expression性:
- expression各种各样的想法的能力。
- 清楚(通常简洁)地expression一些具体想法的能力。
为了考虑一些极端的例子,汇编语言可以通过第一个标准具有高度的expression能力 – 在汇编语言中,你可以用更高级的语言来做本质上的任何事情,并且你可以用汇编语言做一些你不能做的事情基本上任何更高级的语言。
显然,汇编语言在第二个方面看起来并不是那么好 – 通常需要相当大量的非常不透明的代码来完成任何事情。 这个措施将倾向于像Haskell或APL这样的语言,只给出几个例子。
“expression”意味着什么这两个概念经常接近完全相反。 第一种倾向于倾向于“最低”的语言水平,而第二种倾向于倾向于“最高”的水平。 通过将两者结合起来,select一个“certificate”你select的语言是最有performance力的定义是相当简单的。
维基百科有一些关于这个概念。 我自己认为一个语言可以用更less的成本(维基百科文章中所谓的“非正式用法”)来完成。
我认为JavaScript是富有performance力的(尽pipe这可能是因为道格拉斯·克罗克福德(Douglas Crockford)把这个想法钻进我的头脑中),因为它只需要几个关键字就可以做到这一点。 例如, function
关键字是一个函数,以及一个方法,一个类和一个lambda。
一些代码插图(在简洁中略去一些细节)在JavaScript中。 这是我写的一个事件类:
SJJS.util.Event = (function() { var _listeners = []; var _listenerReturns = []; return { addDomListener: function(element, eventName, listener) { }, trigger: function(element, eventName) { }, removeListener: function(eventlistener) { } } })();
随着function
, var
,和一些花括号和括号,我做了一个静态类的方法和私有variables。
对于我来说,语言必须通过代码来清晰地expression我的逻辑和观点,这样一来,阅读我所写的代码的人就可以很容易地理解我在做什么时所思考的内容。
我总是认为它大致相当于一个语言的高级水平。 如果你想试图量化performance力,那么这些单位就像“ 每个语言的机器代码指令 ”
一个更具performance力的语言可能会擅长于做很多工作,而无需编写大量的代码。 但是,这可能是更具体的领域,一些任务稍慢于一个不太performance的任务。
以LINQ为例。 它允许你使用函数式编程 。
函数式编程强调函数的应用,与强调状态变化的命令式编程风格形成鲜明对比。
LINQ允许你expression你想做什么,而不是如何做。 这是一个明确的例子expression性。
一般而言,使用完整的编程语言,您可以完成另一个完整的语言所能做的任何事情。 这就是说,有些人可以比其他人做得更好。
我expression的意思是说你可以轻易说出多less,多么清楚可以说。 简洁的能力就是其中的一部分(一个非常强大和简洁的语言就像J )。 一般而言,我发现简洁是expression的好标志。 如果这种语言能够以一种简单的方式expression一个复杂的操作,它就会朝着正确的方向前进。
至于权力,performance力并不是一种语言的力量。 虽然它可能是其中的一部分,但速度,安全性,稳定性以及所有这些因素都是其中的一个因素。
例如:使用循环操作符在Common lisp中列表的总和是简洁和富有performance力的
(loop for x in list sum x)
精确,简洁和可读性是performance力的主要组成部分。
维基百科 : 在计算机科学中,语言的expression能力(也称为performance力或performance力)是可以用该语言expression和传达的思想的广度。 语言越具有performance力,它可以用来表示的想法的种类和数量就越多。
所以,我同意。 “多么容易,全面和可组合的语言,你expression你的意图。” :我相信,这是expression性的尺度。
问题:是冗长/简洁吗? 我的意思是,如果一种语言可以写下比另一种语言短的东西,那么这是否意味着expression性?
例如, Brainfuck语言expression的是? 我不这么认为。 在Brainfuck看一个Hello World的例子:
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
或者: hq9plus语言。 Hello World代码:
H
问题:这是语言的力量吗? 保罗·格雷厄姆(Paul Graham)认为,一种语言比另一种语言更强大,因为一种语言可以做另一种语言无法做到的事情(例如,LISP可以使用其他语言无法做到的macros)。
我不同意保罗。 正如你在上面的例子中看到的,hq9plus语言正在用Hello World
做一个字母: H
。 而其他大多数语言都会用更多的字母来完成。 但是,您可以使用其他语言创build可组合且易于阅读的代码。 如果hq9plus和H
一起做Hello World
,这是否意味着强大? 我相信不。
问:这只是让生活更轻松的一点吗? 正则expression式可以是其中一个例子。
正则expression式很好,但有时却失去了expression力。 有时候,这取决于程序员。
问题:解决同样问题的方法是不同的:像SQL一样解决search问题?
一半是的。 SQL是一种声明性和非常expression的语言。 因为底层的引擎和技术可以提前和改变,而无需更改SQL查询。 这使得它非常有performance力。 数十年来,许多查询工作都在进行,数据库的基础技术发生了变化。 但是,您的查询不需要。 我认为这是由于其performance力的力量。
我也相信function语言非常有performance力。 因为,你只描述你的意图,而不是你的意思,底层技术总是可以改变和优化,但是,它不会伤害你的expression代码。
例:
// 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)
上面的程序是expression性的,它expression了你的意图。 而且,当潜在的机制发生变化时,它很可能不会改变。