it-swarm.cn

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

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

60
killown

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

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

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

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

116
David_001

因为

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

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

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

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

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

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

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

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

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

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

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

24
brettmjohnson

对其他语言的另一种回答-我实际上认为一种语言有可能成为一种“通用”语言,从而允许一种语言的功能和范式许多其他语言,尽管可能不是您可能想到的严格设计的语言。

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

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

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

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

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

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

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

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

20
Mark H

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

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

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

10
Bill

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

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

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

7
ChrisF

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

对于编程语言也是如此。

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

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

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

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

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

5
MaHuJa

有。没有一种工具对所有事物都是最好的,但是有些工具如许多编程语言serve出于所有目的,而不是best出于所有目的。

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

4
Maniero

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

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

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

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

Bob Martin叔叔在这上面有个很棒的演讲- 最后的编程语言

4
mikera

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

4
Dan Rosenstark

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

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

4
Homde

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

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

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

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

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

0
DeveloperDon

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

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

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

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

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

0
Mike Dunlavey

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

仍然 Cobra 在拥有其他语言的所有Nice功能方面看起来很有希望。 :-)

0
Andrea

除了swiss-army-knife参数(有一点-设计一种好的广谱语言比特定于领域的语言更困难),但这并不意味着这样。语言是不可能的,也不是一个好主意),“结合最佳功能”存在一些问题:

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

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

0
comingstorm

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

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

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

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

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

这是好事。

0
hasen