为什么没有一种能满足所有目的的“通用”编程语言?[关闭]


57

为什么不结合所有现有编程语言的最佳功能,使其适合通用编程语言?


23
“最佳”一词是主观的,因此您永远不会有一个普遍接受的最佳。当然,有相当多种语言适用于所有平台的广泛开发。C ++和Java是主要的两个。
GrandmasterB 2010年

5
@GrandmasterB您忘记了C#
Daniel Little

15
还有就是,这就是所谓的“C”
马丁·贝克特

9
我们作为一个物种具有天生的异议能力(由于我们的个性),因此我们永远不会就普遍需要的东西达成一致,因此将永远不会有一个(至少不是人类创造的一个!)
Nim

9
通用编程语言?您的意思是,类似于许多年前所有人都使用的通用人类语言
Kyralessa

Answers:


116

出于同样的原因,您不用瑞士军刀雕刻鸡...

http://upload.wikimedia.org/wikipedia/commons/thumb/4/48/My_swiss_army_knife.JPG/800px-My_swiss_army_knife.JPG

瑞士军刀通常具有刀片,以及各种工具,例如螺丝刀和开罐器等。这些附件通过枢轴点机构存放在刀柄内...

刀的设计及其灵活性都赢得了全世界的认可。


26
出于同样的原因,您不要将小型货车带入阻力赛。出于同样的原因,请勿将水枪进行决斗。
克里斯(Chris

19
@Chris如果是水枪决斗怎么办?
生锈

44
出于同样的原因,当死亡临近时,您永远不会与西西里人结伴。
生锈的2010年

6
如果您拥有瑞士军刀来完成建造房屋所需的全部工作,那么对他们当中的任何人有好处吗?
布拉德·梅斯

4
这个答案是一个可怕的比喻。也许如果您写过这样的话:因为法语与英语允许不同的表达保真度,所以我可能更喜欢类比。但是计算机语言不是“事物”,也不是人类语言。正确的答案是:我们不知道。在人类如何表达逻辑以及他们如何到达这一点上,将需要更多的见识。此外,某些语言是“元语言”,能够表达其他DSL。我们应该在您的问题中包括这些吗?
Dibbeke 2012年

80

因为

  1. 没有人愿意重写所有旧代码。
  2. 很难就所有目的达成共识
  3. 一旦您列出了完整的用途清单,它们就会在您构建它之前发生变化。
  4. 由于新的目的,有人会开始使用完全不同的语言。
  5. 微软
  6. 苹果
  7. 开源的
  8. 我们将如何处理所有通天鱼?
  9. 甚至无法使SQL通用。

你停下来了。我期待那些仅哈哈哈的“十佳”名单之一。
杰弗里·汉汀

4
+1至少在目前还不能阻止“拯救通天鱼”运动。该死的嬉皮士。
Rusty

2
至于通天鱼,做寿司!
Muad'Dib 2011年

1
关于第1点,所有旧代码最终都将不得不使用代码/库中的最新风尚重新编写否则将无法有效运行,而无需支付大量支持费用。
2014年

38

您在编程中所遇到的是一个非常大的问题领域。该域范围极广,范围很广。

这就是为什么嵌入式飞行控制器用C编写,而网站用PHP,Java,Rails,.NET和其他许多软件编写的原因。

对于嵌入式飞行控制器,我有大约128k的内存可以使用,最重要的是,如果我的代码遇到未处理的异常,飞机失事,有200人死亡,我被起诉要赔偿$ 1B,并且必须派工程师到每个在世界上的飞机场中维修飞机,使我的客户每天损失1000万美元。我必须使用非常紧密的语言,并且有少量活动部件可能会出错。

对于我的Web应用程序,我有几个GB的内存可以使用,但是网络速度受到限制(每天都有较小的程度,但这可能是Web的最大限制)。我将研究一种语言,该语言可以为我提供大量功能并产生可以尽快传输的输出。我不太在乎我的网站是否会崩溃,我可能会损失几笔销售额(100美元),并且必须修补被炸毁的用例,没什么大不了的。

网站已经有15年没有用C编写过了(有人在做cgi脚本吗?),据我所知,飞行控制器刚刚开始使用C ++,但即便如此,其使用方式仍然非常有限。


3
如果大多数站点确实经历了严重的宕机,他们实际上赚钱的站点将损失超过100美元。并不是说它可以与生死攸关的情况相提并论,但是,这仍然大大降低了风险。
亚伦诺特,2012年

3
您知道Facebook的个性吗?他们最近每隔37分钟发布一次推送代码。他们的网站经常以某种方式枯燥乏味,积压着一百万张门票。关键在于网络上没有人会死,您“可能”失去一些销售,但总的来说并没有太大的风险。您面临的大多数问题只会影响少数客户,而不会影响整个客户
Bill Leeper 2012年

24
  1. 去你的车库(或你父母的车库)。
  2. 打开工具箱。
  3. 如果您看到多种工具,请考虑如何将其应用于您的问题。

如果您没有工具箱,或者只有一把空心锤中带有螺丝起子的小锤子之一,那么我对您很同情。

说真的 如果您去汽车修理厂,机械师的工具箱中是否只有一个“全能”工具?他(或她)是专业人士,具有专门设计用于执行各种汽车维修任务的专业级工具。

同样,专业软件开发人员应拥有足够的工具集来执行其交易。如果您打开工具箱并仅看到飞利浦螺丝刀的[软件等效],那么您就不会认为自己是专业人士。

您可以使用开口扳手,套筒扳手,棘轮扳手或活动扳手转动螺栓。您甚至可以笨拙地用滑动钳轻而易举地拧紧螺栓,轻度甚至严重损坏。但是用大铁锤转动螺栓非常困难。


那是为了包括“父母的车库”。因为我没有车库,所以这确实使它更清晰。
丹·罗森斯塔克2011年

5
更好的类比是语言就像工具箱,而不是某些单独的工具。
汤姆·哈特芬

4
盒子里可能有20种不同的工具。但是我敢打赌,您只需要一种语言来描述它们。
ThomasX 2011年

2
如今,工具箱更像是可用于该语言的库。
2014年

18

对其他语言的另一种回答-我实际上认为一种语言有可能成为一种“通用”语言,它允许许多其他语言的功能和范例,尽管这也许不是您可能正在考虑的严格设计的语言。

上面的布雷特约翰逊的类比,每个编程语言都是盒子内(或瑞士军刀上)的工具的想法是每个人都在做的假设,但这确实是一个有缺陷的假设。

如果编程语言是工具箱,该怎么办?

我的意思是,如果您可以根据需要在语言中添加和删除功能,并拥有自己的工具箱以及所需的工具,即使这些工具具有不同的用途,该怎么办?

这个概念已经部分存在。例如,诸如Nemerle之类的语言允许您向该语言添加语法,因此,您也许可以采用“ X语言的最佳功能”,并将其添加至Nemerle(或您自己的)。这并不一定意味着始终都在编写自己的宏-每种语言(或范例)都可以在标准库的宏中定义-这样就可以了import Haskell; import Prolog;,然后就开始编写这两种语言,就好像它们是其中的一部分你的语言?

那么问题是-如何使不同语言/范例的功能相互配合?尽管我无法回答,但是.Net和JVM之类的框架提供了一些解决方案-由于它们的编译方式,这些语言至少部分兼容。例如,您可以采用任何用C#编写的代码,并在F#中使用它而不会有所抱怨。

当今解决方案的“问题”是,将这些语言一起使用要求您将它们创建为单独的项目,这些项目无法相互引用-您只能使用一种方法进行引用。语言上的障碍是,每个项目都将其所有文件分别编译为通用中间语言,然后其他任何项目才能访问它。

消除障碍的垫脚石将是允许不同语言的代码(例如C#和F#)在同一项目中进行编译。理论上,您可以分别编译每个文件(或成组-如果它们具有部分类型或循环引用),然后编译可以访问那些已编译(CIL)对象的其他语言的文件。您可能需要严格定义编译顺序才能使它起作用-但是对于F#,已经需要编译顺序。

无论如何,我并不是说“肯定可以有一种通用语言”。我建议当前存在的语言之间存在更好的互操作性的潜力。实际上,仅由于实现一种语言以及使用该语言所需的库,工具等大量工作而不可能很快改善它。


4
全世界不是一台PC。这个星球上的大多数处理器的总存储空间少于64K字节。这些处理器上可以使用的语言必须与该论坛上大多数人似乎都使用的语言相比,已经减少了很多,以至于您的通用语言最终将成为增强的汇编语言。我认为那将被称为“ C”。
uɐɪ

10

某些语言的最佳功能与其他语言的最佳功能冲突。

例如:类型感知反射是一个非常不错的功能,但是对于松散类型的语言来说,它并不是很值得,但是松散类型有时也可以带来真正的好处。

即使使用一种语言,也不能总是同时使用所有最佳功能,因为它们彼此冲突。


但是,例如,如果根据需要启用/禁用了此功能,则:您可以启用类型感知的反射,并禁用宽松类型的语言功能,等等……
killown

2
如果您尝试将一堆语言的功能组合成一种可以执行任何操作的语言,则会产生大量的冗余,混乱,使用各种不同功能组合的各种方式带来的错误,以及许多浪费精力在此行上指定要使用的范式。

killown是对的,但是通过使该语言具有超强可配置性来解决问题使该语言难以像fennic所描述的那样使用。我喜欢一种灵活的语言,即使在某些情况下也很危险,它也可以使事情发生,但是您需要结合一些概念来进行配置,这比仅使用低级C或用低级C语言编写解决方案或其他方式编写解决方案更为复杂。 。
比尔

1
为功能冲突而+1
Frank Shearar 2010年

我认为问题不仅在于语言功能冲突,还在于许多语言都采用了一个底层框架,该框架包含的功能会带来一定程度的开销,但允许某些操作得以简化。语言通常还具有与之关联的某些“典型使用模式”。选择应在框架中包括哪些功能以及应采用哪种编码模式的选择需要权衡;特征和模式的不同组合更适合不同的应用程序。
2012年

7

“万事通,无精打采。” 浮现在脑海。

有些程序需要速度,而另一些程序则需要大量内存或需要快速访问磁盘。有些语言擅长一种,而另一种则不好-我认为您不会获得一门很好的语言。

因此,尽管您几乎可以用任何语言编写任何程序,但并不能保证您所获得的是解决该问题的“最佳”程序。


4

有。没有工具是最好的一切,但有的像许多编程语言工具,服务于所有的目的,不是最好的所有。

您可以选择最适合工作的工具,但是有可以用于所有目的的编程语言,您可以选择它们。我不建议这样做,但有可能。


4

由于某种原因,我称其为“一般化/专业化悖论”,它可能有另一个名称,实际上不是悖论。

编程语言越通用,完成某件事所需的代码越多。语言越专业,您完成的语言就越少。


2
除了可以使用通用语言编写专门的库外,我同意您的看法。
dan_waterworth 2011年

@dan:同意,但前提是该语言仅致力于向图书馆作者提供功能。我最喜欢的两种语言是D和Python。两者都是相当通用的语言(尤其是D),但是对于图书馆编写者来说都有很多功能,因此您可以构建自己的图书馆来处理专门的东西。我鄙视像Matlab和R.超领域特定语言
dsimcha

4

语言决定着人们的思维方式。对于自然语言而言,这是正确的。如果孩子只懂一种语言,其数字为“一,二,许多”,则教导孩子数学是很困难的。(对不起,我没有链接)用英语我们谈论不同的时间,就好像它们是地方一样,因此可以想象时间旅行的概念。在其他一些语言中,讲时间的想法永远不会发生。

对于编程语言也是如此。

因此,如果我们只有一种编程语言,那么每个人都会完全相同地考虑所有计算任务。因此,我们将不会探索替代方法,而做某事的最佳方法仍将被发现。

与通用语言最接近的是C。C非常紧密地映射到底层硬件概念(实际上如何在硬件中完成事情),并且每种*语言的程序都可以转换为C。(请参阅CFront如何将C编译器用于汇编程序)任务)C的问题基本上是,从C程序员的角度来看,上述转换是没有意义的。

在C语言中始终可以使用“ Lambda”。语法已关闭,包括遍布整个项目/文件的代码,因此不是首选的解决方案。使用no-capture / upvalue / etc版本时,请在其他地方定义一个函数,然后将指针传递给该函数。(请参阅qsort())要使用具有捕获值的lambda,必须编写的代码数量和复杂性会大大提高-据我所知,没有人实际编写过使用C语言进行这种编程方法的代码。与lambda是语言的一部分并且基本上在所有地方都使用的语言相反。

C和C ++之间的主要区别在于,您可以如何要求C ++ 为您处理事务。但随后您仅从一行代码就看不到您真正要问多少。答案是:它取决于(取决于所有其他代码)。

某些编程语言非常适合特定任务,但是如果使用该语言编程,世界上大多数当前正在使用的程序根本就没有意义。就是说,如果该语言可以用来实施该程序,那不是给定的。


2
“在其他一些语言中,说话者永远不会想到时间旅行的想法。” 需要引用。Sapir-Whorf假说并未以其强大的形式被广泛接受。
Muhammad Alkarouri

4

拥有通用语言在技术上是否可行?那真是胡说八道。你可以具有涵盖所有基础的通用语言。问题主要是历史性的:发明了不同的语言来做不同的事情,并在不同的社区中使用。他们中的许多人陷入困境。再加上首选项(vi!emacs!等待,我的意思是Java!C#,等待我的意思是Microsoft,Open Source等。等等)以及历史事故的一般嵌入...在狭小的土地上看一下自然语言像一些欧洲国家一样的大众,看到这个话题变得多么疯狂。有些城镇有自己的骄傲和喜悦,只有他们会说一点方言。国家和编程社区没有什么不同,编程社区也没有更理性。如果是的话,我们所有人都会讲世界语,并用Universal编程。


1
问题比这更深。提供的选项越多,必须明确指定更多的选项,而不是成为该语言中工作的一种隐含方式。如果不是将Java与C#进行比较,而是将Java与Prolog进行比较,则问题将变得更加明显。在一种语言中同时具有这两种功能,会使复合语言的语法复杂化。更为合理的选择可能是将语法降至最低,并允许将任何功能实现为元编程库。Lisp基本上就是这么做的,尽管它的核心水平对于某些工作而言还不够低。
Steve314 2011年

4

认为“结合所有功能”将使语言更好是错误的。

您更有可能导致with肿,复杂,难以理解的混乱。

良好的语言设计需要选择和权衡。可以说,最好的/最具革命性的/最成功的语言是那些可以拿出东西并提供更好的替代方法而不是添加新东西的语言。例如

  • 结构化编程语言(C,Pascal)-取出“ goto”,替换为过程和结构化循环等。
  • Java-删除“手动内存管理”,替换为GC /托管内存
  • Haskell / Clojure-取出“不受控制的可变状态”
  • Lisp-删除大多数“语言语法”,替换为S表达式的灵活谐音树

Bob Martin叔叔在这上面有个很好的演讲-The Last Programming Language


“结构化编程语言(C,Pascal)-删除“ goto”,替换为过程和结构化循环等。” -抱歉,您在这里错了:C具有goto。但我喜欢其余的答案。C的主要作用是让您不必关心确切的时间什么时候在内存中什么地方以及什么时候在什么寄存器中,并且它隐藏程序计数器(再次根据它所在的确切地址。您可以移动它。使用goto几乎达到装配精度)。
Wyatt8740 '16

0

没有任何工具具有所有最佳功能。例如,Javascript和Scheme的一个不错的功能是它们很小,因此,如果您开始打包功能,那么您已经失去了这一功能。

眼镜蛇仍然有望在拥有其他语言的所有出色功能的方向上发展。:-)


0

因为如果创建这样的语言,它将是另一种新语言。您可能会拥有庞大的粉丝群,但所有其他语言仍将存在。

即使此后发明了许多新语言,C仍然存在。

您可以说python是一种通用语言,但是还有ruby。

语言很多的原因仅仅是因为有很多程序员,其中一些人喜欢创建新的语言。

没有所有人都同意的通用语言的原因是,作为手工艺品进行编程并不是由做出所有决定的机构所决定的。每个人都可以自由地做他们想做的事。

这是好事。


我还要指出,这既不是好事也不是坏事,而是一种事实,即软件工程甚至不到一百年的历史,并且与现有的其他任何一种工程相比都非常不成熟。
2014年

0

到目前为止,已经完成了所有工作,很难添加很多新的基本原理,但是我将列举其中一些。

  • 进化:不仅是生物系统被引入,变异和经历最适合生存的资源争夺战,还有一个称为自己的利基市场。竞争是好的,推动了事情的发展。

  • 成熟:我们从事计算机语言的开发可能已经不到一个世纪了。我们还没有答案,因为我们甚至都不知道所有问题。

  • 单独的创世记:不确定该词的正确性,但是在世界范围内,它们的书写系统起源于许多地理区域。想一想楔形文字,部分原因是雕刻成粘土片的要求。考虑一下梵语,希腊语,希伯来语,罗马语,阿拉伯语字母。象形文字,一种具有6000多个符号的中文优美书写方式,在许多东亚国家/地区都有使用。想想更多具有语音基础的现代混合字母,例如西里尔字母,片假名和平假名。我不是语言学家,所以请不要过分苛刻地指出不正确的地方,但是当世界各地的文化需要某些东西时,他们会根据需要创建并自己制造。当世界范围内进行大量交流时,计算机语言便应运而生,例如英制和公制系统,来自具有强大创意领导力的地方。但是编程语言服务于许多不同的文化(其中有些是企业文化),因此它们反映了创造它们的人。计算机语言伴随着文化遗产的发展,从而影响了它们的设计和使用。在OS内核文化中,由于Java和C ++允许本机代码生成,与硬件的紧密/有效耦合以创建硬件抽象层,并且具有相当大的安装基础,因此不太可能很快就弃用Java(或相反)。

  • 设计设计:编程语言使用不同的组织范例来实现。COBOL和Ada来自隶属于DOD的委员会,该委员会具有很高的层次结构。如果我没记错的话,C,C ++,Java以及其他许多人可能来自一个或少数几个设计师。弗雷德·布鲁克斯(Fred Brooks)在他的论文《设计设计》(http://www.youtube.com/watch?v=pC-DlX-PaF4)中将委员会的结果与基于远见的方法进行了比较。如果我们今天坐下来选择达芬奇或一个委员会来定义通用编程语言,我们是否知道应该采用哪种方法构造谁?


0

在这一切上可能有些不同:

什么是语言?简而言之,它是词汇,语法和语义。

使用编程语言要做的第一件事是什么?
您定义事物-类,变量,方法-扩展词汇和语义。

为什么?因此,现在您可以说出以前无法说的东西了。
不管喜欢与否,您已经制作了一种新的专用语言。

恕我直言,使用通用语言查找的东西是是否可以轻松创建专用语言。


0

除了swiss-army-knife的论点(有一点- 设计一种良好的广谱语言比特定领域的语言更困难 -但这并不意味着这样的语言不会兼而有之)可能和一个好主意),“组合最佳功能”存在一些问题:

  • 对于语言功能,“最佳”是主观的,或者至少(无限)可争论的。
  • 有些功能不兼容。将一种语言的一项好功能与另一种语言的一项好功能结合使用时,可能会爆炸。
  • 我们还没有提出新功能。

简而言之,语言设计比这更困难,更复杂。虽然,您可能想看看Scala



-2

有一种通用的编程语言。它被称为“机器语言”,任何其他计算机语言中的所有内容最终都会作为机器语言执行。

它是什么样子的?字符串0-9和AF。

但这是个a子。因此,艾伦发明了一种语言,可以将其翻译成机器语言,并且更适合于他想要做的事情。Bill为Bill想做的事情发明了另一种语言。不久之后,您就会拥有Cobol,Fortran,Lisp和Java。它们都是机器语言的简化版本,更容易编写某些类型的程序,但是更难或更不可能编写其他类型的程序。一种有利于核算,另一种有利于控制航天飞机。


6
机器语言不是通用的。差远了。每台机器都有自己的语言。
哈森

3
另外,它也不是0-9和AF的字符串。是1和0。
David Conrad

@hasen @David建议像@Andy那样,从一种观点来看,每种语言都是基于特定领域的语言而建立在其他语言之上的吗?
阿曼德

我说的是0-9和AF,因为这是您在按键打孔机上使用多打孔代码所必须知道的。如果将其作为数字,则看起来像0-1或0-15或0-255,具体取决于一次的大小。汉森是对的。每种类型的机器都有其自己的语言。如今,几乎所有PC都接受80386代码。甚至我的手机都可以!但是iPad不会。
安迪·坎菲尔德

@hasenj具有不同的特征。对6502进行编程所需的思维方式与对x86进行编程不同,而又与RISC芯片不同。远非普遍。

-2

只是因为

没有通用计算机。

不是通用平台。

不是通用程序员。

甚至没有通用客户。

:P

因此,简单地我们需要一个不同的人。;)


-2

这里的大多数答案都集中在针对每个问题使用最佳工具。我不认为这是一个足够好的理由。

如果您关注的是大型公司,那么通常该公司将倾向于使用一种(或少量)语言和技术,即使对于特定项目而言,也存在一些更好的语言。

这样做是因为改进的标准化,更容易的支持,代码共享等所带来的好处(大多数时候)大于特定语言的附加值。


1
我从未见过任何使用少于4种不同语言的不错的公司项目。而且我不相信选择不合适的工具所带来的任何“好处”。它永远都行不通。
SK-logic

-3

我认为所有“因为您都不用铅笔雕刻雕像”的答案都没有抓住重点。

谁在这里,TRULY在每个新项目之前都选择一种语言?

事实是,我们只需要一些编程语言和编程世界会关闭该方式更好:人会专注于做脚本语言更好,而不是被分散在蟒蛇/红宝石/的Perl / younameit例如。

C#是在Windows上/针对Windows编程的(好吧,有Mono,这里有人每天都在Mono应用下运行C#吗?),这使用户购买Windows7 / 8,并为Microsoft赚钱。
其他公司也这样做,然后开放源代码才更了解,然后才是天才先生……我们得到了许多相似的语言,这只是人类的自我中心性。


同意-我们大多只真正需要高级“安全”语言,低级“不安全”系统编程语言,所有汇编语言(每个CPU不可避免,但都隐藏了一种),以及一些特殊用途(特定于域)语言(例如SQL)。真正的问题是,任何人都不可能声明一种“已弃用”的语言(即使语言设计者试图这样做也是如此,例如Python 2 vs. Python 3)。每年有更多的新语言,并且没有废旧的语言,这意味着最终使用的语言将比程序员使用的语言更多。;-)
布伦丹

-5

我们必须依靠经济学来回答这个问题。如果它节省了只使用一种语言的业务成本,我们将拥有。他们将对此进行标准化,并要求每个人都使用它。其他语言将在尘土飞扬的学术建筑和野心勃勃的爱好者的地下室中折。这还没有发生,所以他们必须不是通用编程语言中的利润诱因,否则到现在自然就会发展。


1
(尽管会计师尽了最大的努力)“省钱”是生命周期中一个模糊且含糊的概念。正如机械师甚至无法在单个扳手尺寸上进行标准化,不要在意整个工具包一样,软件工程也未能进行标准化,因为选择工具(语言)甚至处理器/操作系统/环境的标准太多了
Andrew
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.