我精通C / C ++,并且可以绕过各种脚本语言(awk / sed / perl)。我开始更多地使用python,因为它结合了C ++的一些漂亮方面和awk / sed / perl的脚本功能。
但是为什么会有这么多不同的编程语言呢?我猜所有这些语言都可以做同样的事情,那么为什么不只坚持一种语言并将其用于计算机编程呢?特别是,作为我的计算机程序员,我是否应该知道某种功能语言?
相关阅读:
我精通C / C ++,并且可以绕过各种脚本语言(awk / sed / perl)。我开始更多地使用python,因为它结合了C ++的一些漂亮方面和awk / sed / perl的脚本功能。
但是为什么会有这么多不同的编程语言呢?我猜所有这些语言都可以做同样的事情,那么为什么不只坚持一种语言并将其用于计算机编程呢?特别是,作为我的计算机程序员,我是否应该知道某种功能语言?
相关阅读:
Answers:
编程语言不断发展,并且随着时间的推移而不断改进(创新)。
人们从不同的语言中汲取灵感,并将其组合成新的语言。改进了某些功能(继承机制,类型系统),增加了某些功能(垃圾回收,异常处理),删除了某些功能(goto
语句,低级指针操作)。
程序员开始以某种不受任何语言构造支持的特定方式使用一种语言。语言设计师可以识别此类使用模式,并引入新的抽象/语言结构来支持此类使用模式。没有汇编语言的程序。C中没有类。(早期)C ++中没有异常处理。没有安全的方式来加载早期语言的新模块(在Java中简单)。没有内置线程(Java中的easy-peasy)。
研究人员考虑了表达计算的替代方法。这导致了Lisp和语言树的功能语言分支,Prolog和逻辑编程分支,Erlang和其他基于actor的编程模型等。
随着时间的流逝,语言设计师/研究人员开始更好地了解所有这些结构以及它们如何交互,并设计语言以包含许多流行的结构,所有这些结构都旨在无缝地协同工作。这样就产生了出色的语言,例如Scala,它具有对象和类(使用特征而不是单个或多个继承表示),功能编程功能,与类系统和模式匹配很好地集成的代数数据类型,以及基于参与者的并发。
相信静态类型系统的研究人员致力于提高其表达能力,允许使用Java中的类型化泛型类(以及Haskell中所有奇妙的东西)之类的东西,以便程序员在运行程序之前获得更多保证出错。静态类型系统通常会给程序员带来很大的负担(键入类型),因此已经开始研究减轻这种负担。诸如Haskell和ML之类的语言允许程序员省略所有类型注释(除非它们做一些棘手的事情)。Scala允许程序员省略方法体内的类型,以简化程序员的工作。编译器会推断所有缺少的类型,并将可能的错误通知程序员。
最后,某些语言旨在支持特定领域。示例包括SQL,R,Makefile,Graphviz输入语言,Mathmatica,LaTeX。将这些语言的功能(直接)集成到通用语言中将非常麻烦。这些语言基于特定于其特定领域的抽象。
如果没有编程语言设计的发展,我们所有人仍将使用汇编语言或C ++。
至于了解功能性编程语言:与使用其他编程语言相比,功能性语言允许您以不同的方式表示计算,通常更简洁。考虑一下C ++和Python之间的差异,然后将其乘以4。更严重的是,正如在另一个答案中已经提到的,函数式编程为您提供了一种不同的问题思考方式。这适用于所有其他范例;有些更适合某些问题,有些则不适合。这就是为什么多范式语言变得越来越流行的原因:如果需要,您可以使用来自不同范式的构造,而无需更改语言,而且更具挑战性的是,您可以在一个软件中混合使用范式。
tldr:没有灵丹妙药。
我希望他们不会起诉我,但这是斯坦福大学演讲中的一张照片。
当您决定选择一种语言时,只能选择这3种功能中的2种。
这就是为什么人们感到难过并想要发明一种覆盖所有三个语言的超级语言的原因。
实际上,有大量需求(您可以在其他答案中看到其中的一些需求),但是它们只是向核心功能添加了详细信息。此外,出于历史和政治原因,人们更喜欢一种语言。
这些因素的结合产生了一种新的语言。
(而且我听说每个优秀的程序员都应该编写自己的新语言;))
这个世界充满了许多不同的事物:文字处理器,汽车,家居设计,饮料,糖果,笔,铁锹等。我们之所以拥有如此之多,可以归结为以下几个原则:
走进任何办公用品商店,然后看看“书写工具”部分-数百种笔。它们都做大致相同的事情:将墨水输送到书写表面。但是您看到的每支出售的笔都在那儿,因为上面的三个原因之一。
笔的发展将继续,因为没有一种产品能够满足每个用户的需求。有些钢笔便宜又可弃,有些钢笔很贵,是用高质量的材料制成的。有些使用凝胶,有些使用墨水,有些使用颜料。有些带有可旋盖,有些根本没有盖;宽桶,窄桶,圆形桶,方桶;短长; 红色,白色,黑色,蓝色。等等
但是关于笔就足够了。
我们当前无数的编程语言可以追溯到最早的语言:1940年代早期计算机的数字机器代码。原始,难于使用且费力地进入计算机,但是他们做到了。不久之后,程序员将助记词(例如ADD,CALL,LOAD)分配给了机器代码,从而诞生了称为“汇编语言”的语言类别。
根据底层计算机的特定功能,不同的处理器体系结构需要不同的助记码。考虑到这些差异意味着发明了不同的汇编语言。
(也许现在您可以看到它的运行方向...)
程序员查看了他们的汇编语言程序并看到了模式:相同的指令序列将用于形成循环,条件,变量分配,函数调用等。因此,过程编程语言诞生了。这些语言使用“ if”,“ while”,“ let”等总括术语封装了指令组。
功能语言是对计算机编程的数学分析,它是一种全新的计算方式。没有更好,没有更糟,只是有所不同。
然后是面向对象,静态类型,动态类型,后期绑定,早期绑定,内存使用率低,内存使用率高,可并行化,特定用途的语言等等。
最终,我们拥有不同的编程语言,因为我们想要不同的编程语言。每个语言设计师对于他们的“梦想”语言的外观和操作方式都有自己的想法。多样性是一个很好的事情。
函数式编程语言通常基于不同的(但等效的)计算模型:lambda-calculus。有一些非类型化(具有类似Python的类型化)语言,例如LISP,Scheme(用于广泛认可的计算机程序书/课程的结构和解释)和静态类型化的语言,例如Haskell,ML,F#。
SICP使我进入函数式编程领域,但是其他人推荐John Hughes 撰写的这篇论文以及他的访谈。
例如,Microsoft正在推动函数式编程,例如在VS2010和11中包含F#(它们的.NET函数语言)。他们还在MSR,IIRC中雇用了一些Haskell开发人员。
请注意,还有一些非lambda演算功能的编程语言,例如Refal,它基于模式匹配和重写。
由于功能语言中的抽象级别不同,因此当您使用功能编程技术时,您解决问题的态度就会改变。有人说,它可以使您总体上成为一个更好的程序员。
特别是,作为我的计算机程序员,我是否应该知道某种功能语言?
是。因为haskell改变了我的思维方式。它也可能会改变您的思考方式。
故事:我曾经认为我一天可以学习任何编程语言。有一天,我开始了Haskell。我花了半天完成了单子之前的所有工作。从那天起已经一年了,我仍然无可奈何地呆在Monads。
读:
但是为什么会有这么多不同的编程语言呢?
符号是思考的工具。我们需要不同的量身定制的符号来舒适地处理不同的想法。因此,我们创建了新的语言。
另外,请阅读。;-)
几乎没有一个程序员在某个时候没有因为他们使用的语言的限制而感到沮丧并决定挠痒痒的。因此,诞生了一种新的语言-或一种现有的方言。
Abadi和Cardelli在“对象理论”中从面向对象的基础开发了整个编程语言家族。他们证明函数式编程是OO的特例,而不是相反。
发明新事物很有趣,这就是为什么人们更愿意创造另一种语言而不是为使现有语言变得更好做出贡献。当然,有些语言的保管人不欢迎他们改变看法。最好的例子是Common Lisp和Scheme支持者之间的鸿沟。
由于其他人已经对这个问题给出了很好的答案,所以我只引用艾伦·佩利斯。
当心图尔焦油坑,那里一切皆有可能,但没有任何有趣的事情容易发生。
另外, http://weblog.raganwald.com/2004/10/beware-of-turing-tar-pit.html也是一本不错的书。
为什么世界上有那么多国家?如果我们只有5或6个超级大国,甚至只有一个世界大国,这会变得容易吗?很容易争论为什么它不会更好-从一开始,不同国家的竞争可能会导致进步,而从民主,人权等角度来看,许多国家可能比一个国家更好- -但这不能解释为什么我们有许多国家。它仅说明了为什么许多国家会变得更好。
同样,您可以问,为什么有那么多不同的人类语言?波兰语,阿拉伯语,普通话...如果只有一种语言,会不会更容易?您可以争论任何一种方式,但是那将是为什么如果生活是一种方式或另一种方式会更好的原因。它无法解释人类语言如此之多的原因。
问题是,地球上有很多人,我们都在做我们的事情,我们都有自己的见解,我们都想负责并拥有自己的国家或编程语言,而且我们常常认为我们更了解比其他人,或至少不理会其他人所提供的东西。
阅读这篇很有启发性的博客文章,“ 为什么有那么多Python Web框架?显然,Python 中大约有50个 Web框架。这真是荒谬。没有绝对的理性理由。但是该帖子的作者回答:有太多的Python Web框架,因为创建它是如此容易。您不需要合理的理由就可以拥有更多的python Web框架或更多的编程语言。人们会继续创造新事物,因为他们不知道已有的东西,或者因为他们希望自己能赚钱,或者仅仅是因为创造新事物很有趣!
让我描述一个个人的例子。大约10年前,我正在为一家芬兰公司编写一些C ++代码。您知道,在芬兰,他们有那么大的卡车,它们可以长途旅行,并且可以将很多东西从一个地方运送到另一个地方。我敢肯定,美国也有这样的卡车。因此,典型的问题是要确保所有24个左右的轮胎都完好无损。当然,有经过时间考验的技术:可以监视压力和温度,而剧烈的变化将表明出现了问题。当然,所有这些技术都是专有的,具有专利的,并且具有所有含义。(请记住:专利应该促进创新!)因此,这家芬兰公司希望通过...声音来检测轮胎的状态。我的想法是安装麦克风来监听所有轮胎发出的声音,并对这些声音进行某种信号处理魔术,以查看其中一个轮胎是否存在某种问题,我正在制作一个原型。这种疯狂。(他们甚至有专门的实验室来记录样本声音;一旦给我发送了一段特殊情况的令人印象深刻的视频记录,当他们在承受5或10吨压力并将其加热到一个荒谬的温度后设法将样本轮胎爆炸时, 。)显然,再次证明,这一发展没有特殊的理性原因,只是它很有趣并且有些人想赚钱。因此也要理解,为什么有人会开始开发一种新的编程语言,有很多原因。没有必要甚至没有机会学习所有这些。(他们甚至有专门的实验室来记录样本声音;一旦给我发送了一段特殊情况的令人印象深刻的视频记录,当他们在承受5或10吨压力并将其加热到一个荒谬的温度后设法将样本轮胎爆炸时, 。)显然,再次证明,这一发展没有特殊的理性原因,只是它很有趣并且有些人想赚钱。因此也要理解,为什么有人会开始开发一种新的编程语言,有很多原因。没有必要甚至没有机会学习所有这些。(他们甚至有专门的实验室来记录样本声音;一旦给我发送了一段特殊情况的令人印象深刻的视频记录,当他们在承受5或10吨压力并将其加热到一个荒谬的温度后设法将样本轮胎爆炸时, 。)显然,再次证明,这一发展没有特殊的理性原因,只是它很有趣并且有些人想赚钱。因此也要理解,为什么有人会开始开发一种新的编程语言,有很多原因。没有必要甚至没有机会学习所有这些。一次,当他们给我发送了一段令人印象深刻的录像带时,他们在承受5或10吨压力并将其加热到一个可笑的温度后设法将一个示例轮胎炸裂了。)显然,又没有一个特别合理的理由。进行这项开发的原因,除了娱乐性和某些人想赚钱。因此也要理解,为什么有人会开始开发一种新的编程语言,有很多原因。没有必要甚至没有机会学习所有这些。一次,当他们给我发送了一段令人印象深刻的录像带时,他们在承受5或10吨压力并将其加热到一个可笑的温度后设法将一个示例轮胎炸裂了。)显然,又没有一个特别合理的理由。进行这项开发的原因,除了娱乐性和某些人想赚钱。因此也要理解,为什么有人会开始开发一种新的编程语言,有很多原因。没有必要甚至没有机会学习所有这些。
当然,所有这些仅在您相信进化的情况下适用。如果您相信某种形式的智能设计,并且上帝也创造了所有编程语言,那么您将不得不在众多背后找到目的。也许上帝想促进不同编程语言之间的竞争,以使软件开发的艺术达到最高境界。
总之,有很多人,很多国家,很多编程语言。这只是生活的本质!让我们对此表示感谢:这仅意味着编程/计算机科学领域非常活跃并且蓬勃发展。
为什么会有这么多不同的编程语言?
因为可以选择:
幸运的是,最后两个是无关紧要的二分法,也就是说,可以将这两种选择都放在一种编程语言中。但是,前三个二分法产生了8个组合。因此,即使在理想的世界中,也将至少有8种编程语言。当您进行深入研究时,在特定范例中会有更多细微的设计选择。例如,如果决定使用基于类的静态类型语言,则可以使用不同的方法来设计类型系统。尚无规范的方法可以做到这一点。如果决定使用一种并发编程语言,则有多种表示并发的方法:信号量,条件关键区域,监视器,消息传递(同步与异步)。在同步消息传递中,
我们在编程语言理论中所做的部分研究致力于解决这些二分法。例如,我在一篇名为“ 应用语言的赋值 ”的论文中解决了命令式和功能性编程之间的二分法,Haskell现在采用了我们的方法,使它既是功能性语言,也是命令式语言。这并不意味着二分法已完全解决。Haskell程序员仍然面临选择从功能上还是命令上解决他的问题的选择。Luca Cardelli致力于解决静态与动态类型二分法。保罗·利维(Paul Levy)致力于解决“按值致电”与“按名称致电”二分法。并非所有这些结果都已在现实的编程语言中实现。
如果所有这些语言都可以做同样的事情,为什么不只坚持一种语言并将其用于计算机编程呢?
因为对于现实世界中的程序员来说,仅仅做某事是不够的。如何完成也很重要。正确完成后,问题域将在程序中如实地表示,保留问题的模块化,并且程序变得易于理解,修改和维护。所有这些都会影响程序开发和维护的成本。它们还会影响软件的可靠性和安全性。
例如,许多人使用名为“ Quicken ” 的程序来处理财务帐户。原始程序是使用某些内部版本的Visual Basic开发的,并且相当不错。但是,很难对其进行扩展和维护。多年来,随着该公司尝试将其扩展为更新的功能,该程序变得越来越容易出错,到处都有数百万不满意的客户。他们可能会受益于以强类型的面向对象编程语言对软件进行重新设计。
特别是,作为我的计算机程序员,我是否应该知道某种功能语言?
历史上,Godel,Kleene和Church遵循标准的数学惯例发明了“函数式编程”,Turing发明了“命令式编程”以限定机械计算的概念。在图灵之前,没有证据表明数学曾经分析过命令式编程思想。(虽然所有传统的数学算法都以“命令式”表示,但是它们的基本内容仍然起作用。)因此,命令式编程对于人类文明来说是非常新的事物,其数学仍然不是很了解。每个人都应该了解某种功能编程的第一原因是要了解编程如何数学化。(我不承认命令式编程是非数学的,这就是功能程序员希望您相信的。但是我同意,就目前的技术水平而言,我们还不知道如何在数学上进行命令式编程。我们中的许多人正致力于解决这个问题。)
您可能将其视为进化。
最初,计算机完全是用二进制代码编程的。在此之后,引入了助记符并引入了汇编语言,这在很大程度上取决于所使用的CPU。
在引入更高级别的语言(第3级)之后(Pascal,C,ADA,Cobol),一些非常通用的语言(如C),有些更适合数据处理(Cobol),有些则适合计算(Fortran)。
在那之后出现了4级语言,例如逻辑语言(例如Prolog)。最通用的语言是第三级语言的后继语言。其中一些是Java,C#。
我们还会看到特定于Internet / Web的语言,例如ASP.NET,PHP。
以及特定领域(DSL)的语言,它们通常与通用语言一起使用。
然后还有供孩子学习编程的语言,例如LOGO。
还有用于快速编写代码的语言,例如Python,Ruby等,以及用于处理XML(XSLT)的语言。
而且我可能已经忘记了很多语言,甚至是各种语言。
其他答案很好,将会增加一些新角度。DC编写语言的发展就像人类的真实语言一样!他们像真正的人类语言一样再次相互借鉴概念和语法。换句话说,对计算机语言的词源也有相当真实的研究。
这也意味着悠久的历史和时间表主要是在1930年代左右开始的λ演算。
在理论和应用程序编程语言之间有很强的相互作用/协同作用/共生关系。发明了新的应用,这导致了新的理论,反之亦然。编程语言在许多方面都是理论与应用之间的桥梁。
历史上一个有趣的案例研究是Fortran。它不是众所周知的,但是Fortran的早期版本(通常在Fortran77之前)语法不明确。这意味着编译器可以合法地 “解释” /编译同一命令,因为存在多种有效的“解释”(这与“解释”语言的技术意义不同)。
因此,有关形式语法的理论是在发明Fortran的同时发展起来的,当发现语言歧义性问题时,这是一个小危机。重新设计了Fortan语法以避免这种歧义,后来的语言在设计中对语法歧义更加敏感。OOP还是编程语言中理论概念/进阶的非常重要/最重要的示例,可以将“冲击”或“涟漪”转换为许多现有语言,并将其转化。
其他案例研究是新技术的发明。例如,关系数据库的发明对计算机语言产生了巨大的影响,例如具有SQL和与之相关的计算机语言接口(例如,在Java,“ JDBC”中)。同样,互联网的影响更大。在网络繁荣时期似乎出现了一种语言的爆炸式增长,这在很大程度上与WWW的早期增长相吻合,可以与进化式爆炸相比较。
摩尔定律的处理能力呈指数级增长,与此同时,新的编程语言似乎也出现了长期的增长趋势,有人认为这可能正在放缓。
当前编程语言的长期趋势似乎是向大数据和并行化迈进,例如使用MapReduce。对闭包也有当前的兴趣。
语言的另一个关键方面是它们代表着越来越高的抽象水平。它们基于较低级别的抽象来创建较高级别的抽象(类似于金字塔)。通过这种方式,计算机语言的发展可能是无止境的,而且我们可以相对肯定的是,很重要的新语言将在很长的将来继续被发明出来。这可能类似于心理学中类似的概念,即所谓的“ 分块”(chunking)。粗略地说,是从较低级别的构建块中构建较高级别的心理概念。
任何学习过多种计算机语言的人都必须承认,可以观察到一种羊群的心态,从而使它们的某些方面成为过分炒作的风尚,即不像所提倡的那么关键,甚至随着时间的流逝而消亡(使用)!一些核心思想/变化仍然存在,但(过度)炒作逐渐消失。从这个意义上讲,编程语言也流行与落后。我认为,在过去的十年中,有两个确实有用但被夸大了的案例:
越来越多的人可以在许多主要语言中观察到自相似性,因此它们都趋向于以自己的方式实现许多相似的功能,例如,使用产品比较表“检查”网格中的许多功能。
它们不是,这只是一种营销头-如果您将该语言有点像“ C”,那么这将降低明显的进入门槛。
完全没有C影响的一些代码:SQL,Pascal,Delphi,FORTRAN,COBOL,Ada,PowerBuilder,HyperTalk,Lisp,Simula,FOCAL,BASIC,PL / I,Algol,Algol-68,SNOBOL,Modula,Visual BASIC,导师,徽标,Forth,DIBOL,Helix,AppleScript,Python,Erlang,Ruby,Pick,英语,RPG,PL / SQL,ASP,Prolog,SmallTalk,Perl,bash,Wand BASIC,REXX,DOS批处理语言。
那些看起来很像C的代码,却几乎没有什么共同点:JavaScript,Java,C#,(可以说)Objective-C。
都是市场营销,Java,C ++和JavaScript有点像C,但在幕后几乎没有什么不同。