AlexiaChen / AlexiaChen.github.io

My Blog https://github.com/AlexiaChen/AlexiaChen.github.io/issues
88 stars 11 forks source link

编程语言为何如此众多? #54

Closed AlexiaChen closed 1 year ago

AlexiaChen commented 4 years ago

title: 编程语言为何如此众多 date: 2016-05-19 09:41:15 tags:

刚从大学毕业的人可能会说:学校老师说了,编程 = 算法 + 数据结构。多学习其它编程语言没意义,只需要学一种到精通就可以了。语言都是相通的,数据结构和算法才是灵魂。多年以后我才知道这句话的可笑。其实这话本身没有错,但是放在一些特定场景下是在回避问题,并没有正视。

前言

计算机软件领域为了解决一个语言不能解决的问题尝试发明了另一种语言,然后继续引入新的问题,然后继续发明语言,诸如CoffeeScript,TypeScript之于JavaScript,C#之于Java, Rust,Go之于C/C++。就这样在不断的制造问题和解决问题间徘徊,挣扎,反驳,批评和妥协使得语言的设计者和使用者为自己制造希望,同时又在希望的不确定性或是挫败感中找到前行的乐趣。

其实这样不同的创造语言本质是想解决一个语言带来的历史包袱,但是这样的包袱只要软件在不停的发展,那么它永远甩不掉,就像不可能把各种用C语言或Fortran写出来的基础软件设施推倒重新用拥有更先进的类型系统的Rust写一样,因为工程量巨大,推倒重写也不可能保证这些基础设施软件的正确性,耗资无法承受。想想世界上那么多科学计算库或底层的图形库,算法库,还有操作系统都是C/C++或者Fortran写的,这显然推倒重写是不可能完成的任务。想想Linux至今用了多少年,多少人力,写了多少行代码才发展到工业级别的操作系统?

上面说到的例子都是某语言想试图取代另一个语言,所以在大家看来,这些对立竞争的语言至少是平行的。但是还有一些语言的发明是试图用另一种思维角度来解决编程中遇到的问题,并没有形成竞争关系。所以就引出了编程范式(Programming Paradigm)一说。

编程范式

如今,编程语言百家争鸣,过程式编程语言,面向对象编程语言,函数式编程语言,甚至还有很多人接触很少听说的逻辑式编程语言,最后还有多范式融合的编程语言。过程式的经典语言是大名鼎鼎的C语言。面向对象的经典是Python,Java,C#。函数式的经典是LispHaskell。逻辑式语言的经典是Prolog(它能以另一种思维角度很方便的解决地图染色问题)。至于多范式融合的编程语言,C++可以算是,本来它的面向对象就不纯,至少与Java和Python相比是这样的。

当然,有心的人可能会发觉,现在很多主流的编程语言的发展演进都或多或少会借鉴其他范式的编程思想啊。答案,是的。比如啊,Java里面的匿名类,Lambda表达式都是从函数式思想里面继承过来的。现在的主流编程语言也慢慢从单一的范式过渡到多范式,这是好事,能向前看,不抱残守缺了:)

所以,面对这么多林林种种的语言,该如何学习?首先该学哪门语言?真像论坛上到处撕逼的那样:php是世界上最好的语言,Java才是王道,都是垃圾我Lisp语言才是各种语言的老祖宗?

那么,该怎么学嘛?我的认为是,取各个不同范式的经典语言学习,最后再选择一门主流编程语言学习做项目实战,这两步没有先后顺序,可以相辅相成。因为在我看来,至少会 OO, functional, imperative, logic 这四种 paradigm 的语言才叫“有基础”(这里的命令式编程语言就相当于冯诺依曼语言,也基本等同于通常所说的面向过程编程。),才有足够底气说“学一种语言就几个星期的事,语言都是相通的”。当然,如果不是跨范式的学习,确实能轻松不少,C++转Java和C#真的简单。

所以我从来不会笼统的说某个语言好或不好,而且建议多学习各种不同的编程范式,知道的越多,才能有可能对具体问题提出更好的解决方案。而且law of the instrument 中说:if all you have is a hammer, everything looks like a nail。另外有个观点大意是,语言(不管是人类还是编程)会限制思考。因为语言的设计和演化都被作者灌输了它自身的设计哲学(理念)。所以当你用某中语言来进行开发时,它(语言)本身就引导(改变)了你的思考方式。如果你不信我说的,去看看《七周七语言》,这本书是改变了我对编程语言和编程范式认知的第一本启蒙书:)

领域特定语言

领域特定语言(Domain-specific language,DSL)是在一些特定的专业领域里面处理专业问题而设计出来的语言,这些语言专门是为自身领域服务的,它们往往对自身领域的问题解决和表达更高效,比如Matlab,Mathematica这些软件的语言,Html/CSS也算一种网页的DSL。这种编程语言其实是最多的,编程语言有成千上万种,其中DSL占的比重很大,它们在各自的领域大放异彩,例如:专门处理气象数据和可视化的一种语言NCL等等。

参考

为什么现在会有这么多种编程语言