什么是“强大”的语言?


22

我经常看到人们为自己喜欢的语言比其他语言更“强大”而争论不休。在描述一种编程语言时,我可以理解什么是面向对象的语言或什么是动态语言,但是我仍然无法弄清楚到底什么是“强大”的语言。你怎么看?


5
语言与用户一样强大。
ysolik 2010年

6
@ysolik不一定正确。我可以给某人a脚的语言,看看他们能走多远。它只有一个操作,没有操作!=)
马克·坎拉斯

2
@Mark,如果我们在谈论极端,那你是对的。但是,如果考虑当今使用或多或少的语言,那么用户就是其中很大的一部分。
ysolik 2010年

1
PowerBASIC:没有比这更强大的功能了。^^
gablin

1
@ysolik:说“一种语言没有比它的用户强大的语言”会更准确。
邓肯·拜恩

Answers:


32

如果不先定义“强大”一词,就无法定义什么是“强大”语言。

功率的字面定义将是“效能”,我想我们都可以同意,绝大多数编译器-甚至许多图灵不完整的解释器-在使处理器执行其指令方面也表现出色。因此,就字面定义而言,问题的答案将是“几乎所有语言”。

实际上,我们真的应该到此为止。定义“强大的语言”有点像定义“好人”或“优质产品”。这些词绝对没有客观的定义可以让所有人甚至大多数专家都同意,而大多数定义最终只是在乞求这个问题。根据与您交谈的人的不同,权力可能来自以下任何一种:

  • 丰富的通用框架库,用于执行各种常见任务
  • 一种复杂的特定于域的语法,“做一件事情并做得很好”
  • 直接访问机器功能,即编写低级代码的能力
  • 抽象出机器级别的概念,即编写高级代码的能力
  • 一个非常丰富的类型系统,允许诸如反射,DI和静态分析之类的高级策略
  • 一个非常松散的类型系统,允许程序员将其完成(类型强制等)。
  • 将一切都视为对象的能力,提供概念验证
  • 可以将所有内容视为函数,提供数学验证
  • 自动内存和资源管理(GC,RAII)导致更少的错误
  • 手动内存和资源管理,可能导致性能优化
  • 语法噪声最小,从而提高了可读性
  • 更像英语的语法,提供了较浅的学习曲线
  • 编写非常简洁的代码的能力(即三元运算符,null合并,null扩展)
  • 不能给写潜在混淆代码(即没有三元员等)

大家都看到这里发生了什么吗?实际上,每个项目要点特征都可以解释为“力量”的标志,因此也可以完全相反!

某个地方的某人显然认为变量是一个了不起的主意,它将使该语言变得非常强大。我不会判断;我不是一个PHP家伙。

我建议我们都使用以下“真正简单的定义”来代替所有这些神圣的废话:

最强大的语言是使您能够在最短的时间内以最低的成本交付最高质量的产品的语言。

模糊?完全正确。这就是为什么任何想称呼自己为专业人员的人都必须了解编程概念项目领域的知识。这是唯一能够决定什么对您“强大”的方法。

否则,您可能只是带着一把大刀进行枪战。


1
+1这是唯一尝试包括语言能力所有各种概念的定义。我特别喜欢您如何证明相互矛盾的功能都可以视为强大功能。即使在语言选择方面,计算机科学也是一种权衡科学。
CodexArcanum 2010年

11

我可能有偏见,因为我是一名系统程序员。我认为一种用于所有内核,系统,服务器和应用程序编程的编程语言,或者支持多种编程范例,或者两者都可以称为“强大”。

C,C ++,D功能强大,但这显然只是我的拙见。


您会使用Java进行内核级编程,还是我误会了您?
戴维

@ Davy8,是的,根据我自己的定义,我不应该包含Java。
grokus 2010年

5

除图灵完整性外,还有一些关于功率的定义。马克引用了我倾向于认为的“保罗·格雷厄姆定义”。这是一个很好的定义,但有一个严重缺陷:这是错误的。从理论上讲,这是对语言能力的很好定义,但您知道他们对理论与实践之间的区别所说的话...

如果每个人都能够始终如一地编写完美的代码,不仅完全没有错误,而且完全能够面向未来,那么Paul Graham的定义将是正确的。但这显然不是事实。在现实世界中,投入软件工程的大部分时间和精力不是最初创建产品所花费的,而是随后的维护。根据您所听的统计信息(项目之间的差异可能很大),维护可占计划总工作量的60%至90%。

维护通常是由最初编写代码的人以外的人员执行的,并且通常在最初编写代码后的几个月甚至几年内执行维护工作,这意味着即使对于原始编码人员而言,维护也可能是“其他人的代码”点。如果要在维护过程中提高工作效率,则需要能够通过阅读来快速确定代码的原始意图。

因此,一种更强大的语言是使代码更易于快速阅读的语言,而不是使代码更易于快速编写的语言。两者之间往往有相当多的重叠,但是这些概念也常常是互用的,因为简洁的语法通常会忽略细节,即编译器/解释器比维护程序员更容易推断出细节。

编辑:在描述语言的力量时,还有一个重要的要点:您能够表达的概念范围以及如何轻松地达到目标的两端。保罗·格雷厄姆(Paul Graham)喜欢评估您可以达到的抽象水平的高低,但这只是其中的一半。任何施加抽象下限的语言都会被削弱,因为在某种程度上您无法在必要时使用它,因为被抽象掉的细节是有原因的。这就是易读的玩具语言(如COBOL)和易读的强大语言之间的区别:COBOL没有指针,也无法访问内联汇编,在其中您可以表达任何计算,甚至是COBOL不适合的计算。

COBOL也不擅长达到抽象范围的高端。根据Wikipedia的说法,它“没有用户定义的类型,也没有用户定义的功能”,这使得创建算法和数据结构非常困难。


1
我的问题是,它似乎指向COBOL作为一种非常强大的语言。
David Thornley,2010年

2
我认为你不了解Lisp吗?:)
dash-tom-bang 2010年

1
@Matt:就是这样。什么是语言用于由什么语言的限制,可以使用,而且也少了很多,你可以使用Python做的比用未抽象掉内存相关的详细信息的语言。
梅森惠勒

3
-1由于隐含的观念,即较短,更具表现力的代码难以维护。您已经掌握了语言能力的两种常见含义(表达性与开放性),并将它们混为一谈,只有一半表达了两种原始思想中的一种。
CodexArcanum 2010年

1
@JörgW Mittag:没错,但是我认为我引用的那句话指的是对硬件资源(例如内存)的直接控制:C ++为您提供了更多控制权。当然,如果实现虚拟机,则可以完全控制,但是我认为Mason Wheeler提到可以控制真实计算机。
Giorgio

4

对此进行了长时间的反复辩论(例如,在comp.lang.lisp上已多次讨论)。我认为没有人会提出“正确”的答案,但是很多人都提出了使我感到明显错误的答案。

在这里看到的答案中,让我选择梅森·惠勒的答案。一方面,他所涵盖的问题重要-但另一方面,我完全无法想象将其称为“权力”。这有点像他在说他的本田微型厢式货车比顶级燃料的Dragster更强大,因为它更安全,更安静,操控性更好,乘客空间更大,乘坐舒适性更高。所有这些都是绝对正确的,而且非常重要。这些因素(除其他因素外)使小型货车对大多数人来说更加实用和合理-但它们并没有改变小型货车的发动机仅产生约250马力而大型货车的发动机约产生8000马力的事实。

当然,问题在于车辆对“动力”的构成有一个明确的定义。对于编程语言,在我看来,讨论最终等同于将操纵性,舒适性,速度,载货量和巡航范围视为“动力”的一部分。结果往往是螺纹不断延伸,产生的热量比光大得多。出现的大多数问题基本上都取决于您对完全不相关且正交的功能的重视程度,例如,使用汇编语言对MMU进行编程的能力比创建更高级别功能的能力“或多或少”“强大”在Haskell?至少IMO,没有比较有意义的方法来比较两者,也没有有意义的答案是“

因此,我讨厌我不得不说的是,在这种情况下,唯一有意义的答案基本上是相对论的-一种强大的语言是您发现可以帮助您完成想要的事情的一种语言。人民目标的差异使大多数“绝对”的权力衡量充其量是毫无意义的。


3

简洁与灵活的完美平衡。

好问题。鉴于许多语言都在“完善”中,因此我们可以在理论上将它们置于平等的基础上。但是我们不这样做,因为语言显然彼此不同。有什么区别?

区别在于能够用很少的钱说出很多不同的事情的能力。如果我们可以跳到最极端,那么我可以选择一种语言,它是仅使用一个字符'c'自动初始化内容管理系统的最佳语言。但是那是什么意思呢?当然,从简短的角度来说,它很强大,但并不灵活。您想要的是一种语言,它可以让您说出许多不同的复杂事物而不会太冗长。无需像组装一样,能够在阳光下进行所有操作,具有无限的灵活性,但极其冗长。

强大的语言是一种允许您以尽可能短的长度说出许多不同的东西的语言。


1
-1。抱歉,这不仅是一个误解,而且是一个危险的事情,因为它会严重影响生产效率。
梅森惠勒

@梅森惠勒:你能详细说明吗?
乔伊·亚当斯

@Joey:看看我对这个问题的回答。
梅森惠勒

1

一旦您选择了图灵完备语言(一种语言很容易做到),那么“力量”就没有多大意义,因为您可以用一种图灵完备语言说的任何东西都可以用另一种语言讲。马克·坎拉斯(Mark Canlas)的回答明确:简洁和灵活性与众不同。

话虽如此,马蒂亚斯·费莱森(Matthias Felleisen)的论文《编程语言的表现力》令人感兴趣。在其中,他试图形式化语言中的表现力概念。


顺便说一句,事实并非如此。我见过图灵完整的语言,但没有其他语言强大。一个简单的例子:考虑一种仅具有整数和字符串作为其数据类型的语言,无法在它们之间进行转换,对整数进行任意计算,并且仅对字符串进行字符串连接和比较。(我使用过这种语言。)它是Turing完整的,但是它不能在字符串上表达任意函数,因此添加更多功能将增加其计算能力。
reinierpost 2011年

@reinerpost-说图灵完备的语言仍然可以计算字符串上的任意函数,只需要用不同的方式表示它们即可。图灵完整性几乎与您可以使用哪些数据类型的问题正交。例如,某些图灵完整的语言没有数据类型,只能用函数表示所有内容-并且必须求助于Church Encoding之类的算法。
mikera'2

1

在什么构成语言能力方面似乎存在很多分歧。是简洁,易读,适应性强,还是仅仅是图灵的完整?我认为所有这些因素都可以发挥作用,因此最好的观察方法是统计数据。是的,我在这里说的是纸和纸RPG。

这个想法是,每种语言都有(大约)相同数量的“点”,可以在多个类别中任意分布。为了讨论的目的,说的唯一因素是简洁,易读和灵活。这样一门语言可能会非常简洁和灵活,但因此很难阅读。或清晰易读,但非常冗长。

(可以说,一种语言必须分配的点数是由设计者和实现者的技能定义的,但让我们假设所有语言设计者都同样擅长于他们的工作。)

当语言设计师决定增加一种类别的语言强度时,他们在逻辑上会从其他类别中夺走一部分潜在强度。这就是为什么经常说编程语言设计是权衡取舍的原因。从这个角度来看,语言的整体功能仍然不确定,我们必须恢复到基于语言的相对优势对语言进行分类的可靠方法。不满意吗?太糟糕了。

您可以用两种方法争论:一种功能强大的语言是一种具有相对均匀的点分布(所有交易的插孔,没有主宰的语言),或者在一个区域中具有尽可能多的点而没有其他人无人值守的语言(专家)。没有“文艺复兴时期的人”这样的语言,在许多领域都具有完美的掌握。如果那是您对最强大的语言的定义,那么您就很走运了。

如要进一步了解,这篇文章(巧合的是也是由保罗·格雷厄姆,谁似乎有不同的意见)触及的想法是,尽管有困难可能是要确定如何,编程语言的力量的确有所不同。他颇具说服力地指出,很容易看到一种语言不如您所喜欢的语言强大的功能-它缺少功能X-但很难看到一种实际上更强大的语言实际上-基本上等同于语言X,但是还有很多其他东西。我给你引述那篇论文的话:

通过归纳法,唯一能够看到各种语言之间功能差异的程序员就是那些理解能力最强的程序员。(这可能就是Eric Raymond所说的Lisp,使您成为一个更好的程序员的意思。)由于Blub悖论,您不能相信其他人的意见:他们对碰巧使用的任何语言都很满意,因为它决定了语言的正确性。他们对程序的思考方式。

我不同意您的模型,即所有语言在分布中都必须有相等数量的点。让我们以brainf * ck的极端示例为例,我们可以轻松地说它与任何现代语言都不具有可比性,即使仅以总点数而言也是如此。即,它不是编程语言中的零和游戏-语言不是以x点开头并分配它们,而是以0开头并根据功能获得分数。当然,需要采取一些折衷措施是很自然的,但是所有选择都不尽相同(至少我是这样认为的)。
n1ckp 2010年

我并不是说所有语言都必须具有相同的分数。我说过,正在考虑的所有语言(即为实际使用而设计的语言)的数量大致相同。神秘的语言是一种病态的情况,因为它们最初并不是设计成有用的。为了简化起见,我进行了简化,因为如果实际上特征是可数的,尝试基于纯粹的“特征数量”来区分语言是没有用的。
乔恩·普迪

抱歉,我重新阅读了您的文章,我必须同意我读得太快了..但是我仍然不同意每种(主流)语言都有大致相同的观点。让我们以Java和c ++为例,因为它们是我所知道的语言。我可以肯定的是,我可以肯定C ++比Java更强大,只是因为C ++基本上可以完成Java所做的一切(gc除外-但Java也不提供手动内存管理)以及更多功能(实际模板FTW)。我想说的是什么意思,我想:不,并不是所有的语言在编写童话世界时都大致相等,甚至
n1ckp 2010年

仅比较主流语言时。
n1ckp 2010年

0

编程语言是工具-仅此而已。一些工具非常专业,非常适合特定目的。其他的则被概括和简化到几乎无用的地步。

我认为最“强大”的语言是一种使您以最少的时间,精力和其他精力投入实现目标的语言。即提供最大投资回报率的语言。在某些情况下,它可能是C。在其他方面,Java;还有其他人,Haskell。

最好的办法是使自己熟悉各种语言以及它们的用处。然后,当需要开始一个新项目时,您可以就哪个最合适做出明智的决定。


-1

关于编程语言的讨论-IMHO-就像一些Linux新闻组中有关邮件客户端的讨论一样:它们往往是一场烈火战。我记得VB6流行的时代。甚至有人争论说这根本不是编程语言,而其他人则用它创造了令人惊叹的应用程序。

我认为编程语言在概念上已经有所不同,因为创建者在创建/设计语言时会想到不同的东西。因此,适合一个目的的语言(在这种情况下功能强大)可能不适合另一个目的。因此,将语言命名为功能强大与否,纯粹是主观的。就是说,我认为没有可以应用的指标。


+1以应对无法解释的降票,因为我通常对此表示赞同。为设计任务使用语言。不要用C语言编写复杂的GUI,不要用VB6语言编写复杂的算法或操作系统
Gerry

-1

它们都是您工具箱中的工具。锤子有力,但如果您需要扳手,则无能为力。如果您是系统程序员,则C / C ++很好,但是Adobe Flash可能更适合您要构建的游戏网站。


-1

强大的编程语言是解决以下线性编程问题的语言

最大化

      开发速度
    +易于阅读代码
    +易于调试
    +表达简洁/简短
    +易于学习/教学
    -CPU使用率
    -内存需求

受制于

  • 它必须是图灵完成的。
  • 它必须是多范例的:功能,面向对象,逻辑程序设计,约束程序设计,并发,分布式计算等。
  • 它必须是通用的,允许创建命令行界面,组件库,服务器,GUI和Web应用程序。
  • 它必须是便携式的,即,易于移植并在跨平台设置中进行维护。
  • 它必须具有适应性,即具有变化的开放性,并能够随着新硬件(量子芯片),新范例和技术上其他创新的出现而发展。
  • 它必须鼓励图书馆(如CPAN,CTAN和CRAN)的发展。
  • 它必须是免费开源的

(是的,我知道,我已经发布了一个完全矛盾的答案。这是因为我是辩证人。)


-2

这是针对自然语言编写的,但我认为它也适用于编程语言:

人们普遍认为某些语言在本质上要优于其他语言,但这在语言事实上没有依据。当然,在特定的历史时期,某些语言比其他语言更有用或更有声望,但这是由于当时的讲者占主导地位,而不是由于任何固有的语言特征。
-戴维·克里斯特(David Crystal)。剑桥语言百科全书2 / e(1997)。第7页

“权力”根本不属于一种语言,而是另一种语言。说“汉语比朝鲜语更强大”是很愚蠢的。同样,说“ APL比COBOL更强大”是很愚蠢的。

已经进行了几次尝试,以某种客观的方法来等同于语言能力。我相信这些尝试都会失败:

  • 如果您说美国英语比说毛利人,在美国找工作可能要容易得多。同样,毫无疑问,获得工作编程Java或C而不是LISP或J容易。但是这种经济优势肯定不能反映该语言的某种先天力量。它与语言使用者的力量有关。
  • “ Hi”并不比“ ni hao”或“ shalom”好,因为它较短。同样,尽管在APL中比在COBOL中更简洁地表达函数,但这也不能反映语言的某种先天力量。

我的观点是,“一种语言对另一种语言的力量”的讨论是说话者相对于其他群体的优越感的蒙蔽表达。简而言之,它的偏见和成见。当然,那些确实有偏见的人真的非常相信自己的刻板印象,而且不太可能说服他们改变主意。


我不同意。举一个简单的例子,我认为除了理论上说它已经完成(我认为)之外,没有人会说比Brainf * ck(说)更强大的语言。关键是“强大”是某种品质,与它们都是“完整”无关。我同意这可能有点主观,但要说所有语言在“力量充沛”方面都是平等的,这似乎是不可取的。
n1ckp 2010年

1
@ n1ck:您是说Power = Readability吗?和:。BF缺乏可读性是否意味着它缺乏能力?APL和J的可读性也很低,但是它们非常有用且简洁(尽管我当然也没有将有用性或简洁性等同于功能)。相反,COBOL可读性强。彻头彻尾的冗长;但是,这再一次使其比APL或BF更强大。高炉很有趣。它具有娱乐的力量;但这不是Power qua Power。问题在于,似乎没有人拥有良好的权力理论,而他们却无法达成共识。
其他

1
不,我不是说能力=可读性。我只是不同意您的观点,即所有语言都是平等的,并且我们无法在“功能强大”方面对语言进行比较,但是您可以对其进行定义。我认为,要使语言具有任何功能,就必须具备可读性的基本知识,但这并不是真正的问题。如果我们想真正回答这个问题,我们当然需要首先定义功能,但是我认为这与“在每种情况下都最好”不同,您的回答似乎暗示我您是这样解释的(即,没有最好的选择)语言适用于一切,我也同意)。
n1ckp 2010年
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.