为什么不结合所有现有编程语言的最佳功能,使其适合通用编程语言?
为什么不结合所有现有编程语言的最佳功能,使其适合通用编程语言?
Answers:
出于同样的原因,您不用瑞士军刀雕刻鸡...
瑞士军刀通常具有刀片,以及各种工具,例如螺丝刀和开罐器等。这些附件通过枢轴点机构存放在刀柄内...
刀的设计及其灵活性都赢得了全世界的认可。
因为
您在编程中所遇到的是一个非常大的问题领域。该域范围极广,范围很广。
这就是为什么嵌入式飞行控制器用C编写,而网站用PHP,Java,Rails,.NET和其他许多软件编写的原因。
对于嵌入式飞行控制器,我有大约128k的内存可以使用,最重要的是,如果我的代码遇到未处理的异常,飞机失事,有200人死亡,我被起诉要赔偿$ 1B,并且必须派工程师到每个在世界上的飞机场中维修飞机,使我的客户每天损失1000万美元。我必须使用非常紧密的语言,并且有少量活动部件可能会出错。
对于我的Web应用程序,我有几个GB的内存可以使用,但是网络速度受到限制(每天都有较小的程度,但这可能是Web的最大限制)。我将研究一种语言,该语言可以为我提供大量功能并产生可以尽快传输的输出。我不太在乎我的网站是否会崩溃,我可能会损失几笔销售额(100美元),并且必须修补被炸毁的用例,没什么大不了的。
网站已经有15年没有用C编写过了(有人在做cgi脚本吗?),据我所知,飞行控制器刚刚开始使用C ++,但即便如此,其使用方式仍然非常有限。
如果您没有工具箱,或者只有一把空心锤中带有螺丝起子的小锤子之一,那么我对您很同情。
说真的 如果您去汽车修理厂,机械师的工具箱中是否只有一个“全能”工具?他(或她)是专业人士,具有专门设计用于执行各种汽车维修任务的专业级工具。
同样,专业软件开发人员应拥有足够的工具集来执行其交易。如果您打开工具箱并仅看到飞利浦螺丝刀的[软件等效],那么您就不会认为自己是专业人士。
您可以使用开口扳手,套筒扳手,棘轮扳手或活动扳手转动螺栓。您甚至可以笨拙地用滑动钳轻而易举地拧紧螺栓,轻度甚至严重损坏。但是用大铁锤转动螺栓非常困难。
对其他语言的另一种回答-我实际上认为一种语言有可能成为一种“通用”语言,它允许许多其他语言的功能和范例,尽管这也许不是您可能正在考虑的严格设计的语言。
用上面的布雷特约翰逊的类比,每个编程语言都是盒子内(或瑞士军刀上)的工具的想法是每个人都在做的假设,但这确实是一个有缺陷的假设。
如果编程语言是工具箱,该怎么办?
我的意思是,如果您可以根据需要在语言中添加和删除功能,并拥有自己的工具箱以及所需的工具,即使这些工具具有不同的用途,该怎么办?
这个概念已经部分存在。例如,诸如Nemerle之类的语言允许您向该语言添加语法,因此,您也许可以采用“ X语言的最佳功能”,并将其添加至Nemerle(或您自己的)。这并不一定意味着始终都在编写自己的宏-每种语言(或范例)都可以在标准库的宏中定义-这样就可以了import Haskell; import Prolog;
,然后就开始编写这两种语言,就好像它们是其中的一部分你的语言?
那么问题是-如何使不同语言/范例的功能相互配合?尽管我无法回答,但是.Net和JVM之类的框架提供了一些解决方案-由于它们的编译方式,这些语言至少部分兼容。例如,您可以采用任何用C#编写的代码,并在F#中使用它而不会有所抱怨。
当今解决方案的“问题”是,将这些语言一起使用要求您将它们创建为单独的项目,这些项目无法相互引用-您只能使用一种方法进行引用。语言上的障碍是,每个项目都将其所有文件分别编译为通用中间语言,然后其他任何项目才能访问它。
消除障碍的垫脚石将是允许不同语言的代码(例如C#和F#)在同一项目中进行编译。理论上,您可以分别编译每个文件(或成组-如果它们具有部分类型或循环引用),然后编译可以访问那些已编译(CIL)对象的其他语言的文件。您可能需要严格定义编译顺序才能使它起作用-但是对于F#,已经需要编译顺序。
无论如何,我并不是说“肯定可以有一种通用语言”。我建议当前存在的语言之间存在更好的互操作性的潜力。实际上,仅由于实现一种语言以及使用该语言所需的库,工具等大量工作而不可能很快改善它。
某些语言的最佳功能与其他语言的最佳功能冲突。
例如:类型感知反射是一个非常不错的功能,但是对于松散类型的语言来说,它并不是很值得,但是松散类型有时也可以带来真正的好处。
即使使用一种语言,也不能总是同时使用所有最佳功能,因为它们彼此冲突。
由于某种原因,我称其为“一般化/专业化悖论”,它可能有另一个名称,实际上不是悖论。
编程语言越通用,完成某件事所需的代码越多。语言越专业,您完成的语言就越少。
语言决定着人们的思维方式。对于自然语言而言,这是正确的。如果孩子只懂一种语言,其数字为“一,二,许多”,则教导孩子数学是很困难的。(对不起,我没有链接)用英语我们谈论不同的时间,就好像它们是地方一样,因此可以想象时间旅行的概念。在其他一些语言中,讲时间的想法永远不会发生。
对于编程语言也是如此。
因此,如果我们只有一种编程语言,那么每个人都会完全相同地考虑所有计算任务。因此,我们将不会探索替代方法,而做某事的最佳方法仍将被发现。
与通用语言最接近的是C。C非常紧密地映射到底层硬件概念(实际上如何在硬件中完成事情),并且每种*语言的程序都可以转换为C。(请参阅CFront如何将C编译器用于汇编程序)任务)C的问题基本上是,从C程序员的角度来看,上述转换是没有意义的。
在C语言中始终可以使用“ Lambda”。语法已关闭,包括遍布整个项目/文件的代码,因此不是首选的解决方案。使用no-capture / upvalue / etc版本时,请在其他地方定义一个函数,然后将指针传递给该函数。(请参阅qsort())要使用具有捕获值的lambda,必须编写的代码数量和复杂性会大大提高-据我所知,没有人实际编写过使用C语言进行这种编程方法的代码。与lambda是语言的一部分并且基本上在所有地方都使用的语言相反。
C和C ++之间的主要区别在于,您可以如何要求C ++ 为您处理事务。但随后您仅从一行代码就看不到您真正要问多少。答案是:它取决于(取决于所有其他代码)。
某些编程语言非常适合特定任务,但是如果使用该语言编程,世界上大多数当前正在使用的程序根本就没有意义。就是说,如果该语言可以用来实施该程序,那不是给定的。
拥有通用语言在技术上是否可行?那真是胡说八道。你可以具有涵盖所有基础的通用语言。问题主要是历史性的:发明了不同的语言来做不同的事情,并在不同的社区中使用。他们中的许多人陷入困境。再加上首选项(vi!emacs!等待,我的意思是Java!C#,等待我的意思是Microsoft,Open Source等。等等)以及历史事故的一般嵌入...在狭小的土地上看一下自然语言像一些欧洲国家一样的大众,看到这个话题变得多么疯狂。有些城镇有自己的骄傲和喜悦,只有他们会说一点方言。国家和编程社区没有什么不同,编程社区也没有更理性。如果是的话,我们所有人都会讲世界语,并用Universal编程。
认为“结合所有功能”将使语言更好是错误的。
您更有可能导致with肿,复杂,难以理解的混乱。
良好的语言设计需要选择和权衡。可以说,最好的/最具革命性的/最成功的语言是那些可以拿出东西并提供更好的替代方法而不是添加新东西的语言。例如
Bob Martin叔叔在这上面有个很好的演讲-The Last Programming Language
goto
。但我喜欢其余的答案。C的主要作用是让您不必关心确切的时间什么时候在内存中什么地方以及什么时候在什么寄存器中,并且它隐藏程序计数器(再次根据它所在的确切地址。您可以移动它。使用goto几乎达到装配精度)。
到目前为止,已经完成了所有工作,很难添加很多新的基本原理,但是我将列举其中一些。
进化:不仅是生物系统被引入,变异和经历最适合生存的资源争夺战,还有一个称为自己的利基市场。竞争是好的,推动了事情的发展。
成熟:我们从事计算机语言的开发可能已经不到一个世纪了。我们还没有答案,因为我们甚至都不知道所有问题。
单独的创世记:不确定该词的正确性,但是在世界范围内,它们的书写系统起源于许多地理区域。想一想楔形文字,部分原因是雕刻成粘土片的要求。考虑一下梵语,希腊语,希伯来语,罗马语,阿拉伯语字母。象形文字,一种具有6000多个符号的中文优美书写方式,在许多东亚国家/地区都有使用。想想更多具有语音基础的现代混合字母,例如西里尔字母,片假名和平假名。我不是语言学家,所以请不要过分苛刻地指出不正确的地方,但是当世界各地的文化需要某些东西时,他们会根据需要创建并自己制造。当世界范围内进行大量交流时,计算机语言便应运而生,例如英制和公制系统,来自具有强大创意领导力的地方。但是编程语言服务于许多不同的文化(其中有些是企业文化),因此它们反映了创造它们的人。计算机语言伴随着文化遗产的发展,从而影响了它们的设计和使用。在OS内核文化中,由于Java和C ++允许本机代码生成,与硬件的紧密/有效耦合以创建硬件抽象层,并且具有相当大的安装基础,因此不太可能很快就弃用Java(或相反)。
设计设计:编程语言使用不同的组织范例来实现。COBOL和Ada来自隶属于DOD的委员会,该委员会具有很高的层次结构。如果我没记错的话,C,C ++,Java以及其他许多人可能来自一个或少数几个设计师。弗雷德·布鲁克斯(Fred Brooks)在他的论文《设计设计》(http://www.youtube.com/watch?v=pC-DlX-PaF4)中将委员会的结果与基于远见的方法进行了比较。如果我们今天坐下来选择达芬奇或一个委员会来定义通用编程语言,我们是否知道应该采用哪种方法构造谁?
Visual Batch是尝试使用可自定义的编程语言。下面的链接显示了该编程接口如何适应通用编程语言的需求。
http://sourceforge.net/apps/phpbb/visualbatch/viewtopic.php?f=4&t=4
有一种通用的编程语言。它被称为“机器语言”,任何其他计算机语言中的所有内容最终都会作为机器语言执行。
它是什么样子的?字符串0-9和AF。
但这是个a子。因此,艾伦发明了一种语言,可以将其翻译成机器语言,并且更适合于他想要做的事情。Bill为Bill想做的事情发明了另一种语言。不久之后,您就会拥有Cobol,Fortran,Lisp和Java。它们都是机器语言的简化版本,更容易编写某些类型的程序,但是更难或更不可能编写其他类型的程序。一种有利于核算,另一种有利于控制航天飞机。
这里的大多数答案都集中在针对每个问题使用最佳工具。我不认为这是一个足够好的理由。
如果您关注的是大型公司,那么通常该公司将倾向于使用一种(或少量)语言和技术,即使对于特定项目而言,也存在一些更好的语言。
这样做是因为改进的标准化,更容易的支持,代码共享等所带来的好处(大多数时候)大于特定语言的附加值。
我认为所有“因为您都不用铅笔雕刻雕像”的答案都没有抓住重点。
谁在这里,TRULY在每个新项目之前都选择一种语言?
事实是,我们只需要一些编程语言和编程世界会关闭该方式更好:人会专注于做的脚本语言更好,而不是被分散在蟒蛇/红宝石/的Perl / younameit例如。
C#是在Windows上/针对Windows编程的(好吧,有Mono,这里有人每天都在Mono应用下运行C#吗?),这使用户购买Windows7 / 8,并为Microsoft赚钱。
其他公司也这样做,然后开放源代码才更了解,然后才是天才先生……我们得到了许多相似的语言,这只是人类的自我中心性。