编程语言有不少种流派和思想,有一些编程语言同时支持多种编程范式。前端
采用静态类型编程范式的编程语言,其变量须要明确指定类型。表明语言:C,C++,Pascal,Objective-C,Java,C#,VB.NET,Swif,Golang。程序员
一、编译器能够在编译时就能找出类型错误。算法
二、编译器编译时知道类型信息,就能够提升性能。编程
这种范式认为,程序员确定知道变量的类型,你丫要是不知道变量的类型,那你就别混了!编译时,程序会报错。数据结构
Swift和Go语言都是静态类型编程语言,但它们都不须要明确指定类型,而是能够经过推断由编译器自动肯定其类型。闭包
采用静态类型编程范式的编程语言,其变量不须要明确指定类型。任意变量,能够指向任意类型的对象。表明语言:Python,Ruby,JavaScript。并发
动态类型的哲学能够用鸭子类型(英语:ducktyping)这个概念来归纳。JamesWhitcombRiley提出的鸭子测试能够这样表述:“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就能够被称为鸭子。”框架
这种范式认为,程序员确定知道变量的类型和它支持的方法和属性,你丫要是不知道变量的类型,那你就别混了!运行时程序会崩溃!程序崩溃怨谁?怨你本身呗,你不是合格的程序员!编程语言
不须要明肯定义接口和抽象类型。只要一个类型支持须要的方法和属性,那么就OK。程序会至关灵活和简单。C++,Java,C#视之为命脉的接口/基类,在动态语言这里都视如无物!模块化
一、若是类型不对,编译器也没法找到错误,而是运行时程序崩溃。
二、由于编译器不知道变量的类型,所以没法优化性能。
面向对象编程范式,从上世纪70年代末开始兴起。它支持类和类的实例做为封装代码的模块。表明语言:Smalltalk,C++,Objective-C,Java,C#,VB.NET,Swift,Go,Python,Ruby,ActionScritp,OCaml.
早期编程语言都是面向过程的。就是顺序,条件,循环,构成一个个函数。随着代码规模的增大,人们发现有必要对代码进行模块化。一个概念对应的代码放在一个文件中,这样便于并发开发和进行代码管理。
人们还发现了“程序=数据结构+算法”的规律。所以,一个概念对应的数据结构和函数应该放在一个文件中。这就是类的概念。
面向对象编程范式,确实极大地提升了生产效率,所以获得了普遍的应用,所以在语言层面支持面向对象编程范式的语言是极多的。
C语言尽管在语言层面上并不支持面向对象编程范式,但现代的C语言开发都会应用面向对象的模块化思想,把同一类的数据结构和函数放在一个文件中,采用相似的命名方式。
毕竟C语言没有在语言层面上支持面向对象,所以就有不少程序员想给C语言添加面向对象支持。其中的表明是C++和Objective-C。
C++是一种新的语言,但大部分语言元素是和C兼容的。
Objective-C是彻底兼容的C的。Objective-C是给C添加了薄薄的一层语法糖以支持接口(就是其余语言的类)和协议(就是其余语言的接口)。甚至,Objective-C一开始的实现,就是一个C语言的预编译器。Objective-C坦白讲,除了添加的语法不太符合C流外,实际上其面向对象系统设计是至关精妙的。乔布斯早年慧眼识珠,把Objective-C收人囊中,由于封闭于Apple/NextStep系统内,所以少有人知。随着iOs系统的普及,Objective-C近几年才名满天下。
函数式编程范式,是一些数学家发明的编程语言,他们认为程序就是数学函数嘛。表明语言:Lisp,Erlang,JavaScript,OCaml,Prog。
有不少大牛极力鼓吹过函数式编程语言,认为其极具革命性。但我认为他们太高估计了函数式编程范式的威力,我并不认为函数式编程范式相对于面向对象编程范式有何高明之处。
函数式编程语言,核心就是函数,它们没有Class类的概念。但它的函数又不是传统面向过程语言的函数,它的函数支持“闭包”的概念。
在我看来,函数式编程语言的函数,也就是“闭包”,说白了,其实就是“类”。编程语言发展到今天,就是须要模块化,就是须要把“数据结构”和“算法”结合起来。不论何种语言,不把它们结合起来的编程方式,都是没有出路的。
面向对象编程语言,用类把“数据结构”和“算法”结合起来。类的核心是“数据结构”,也就是其“属性”,而不是“算法”,其“函数”。在类中,是函数依附于属性。
而函数式编程语言,用闭包把“数据结构”和“算法”结合起来。是函数可以抓取外部的字段。是“属性”依附于“函数”。
“类”本质上和“闭包”是等价的。如今不少面向对象编程语言都加上了对闭包的支持。观察其代码,咱们能够发现,它们实际上都是用“类”来实现“闭包”的。
“类”和“闭包”谁更易用?明显是“类”。
而“闭包”更简洁一些,所以“闭包”在面向对象编程语言中经常使用来替换匿名类。只有一个函数的类,写成一个类太麻烦,不如写成闭包,更加简洁。
吐槽一下OCaml语言,其前身Caml语言自己是一种挺好的函数式语言,硬生生添加了一套完整的面向对象机制,同时支持面向对象和函数式编程范式,很容易像C++同样脑裂的。
也有不少面向对象语言控看着JavaScript嫌烦,老是想把面向对象支持添加到JavaScript上。ActionScript就是其中一种尝试。我用过,真的是和Java没多少区别了。
再吐槽一下ExtJS。当初选型Web前端开发框架时比较了ExtJS和JQuery。
ExtJS明显是Java高手开发的,硬生生用JavaScript模拟Swing的设计思想,搞了一套UI库。
JQuery开发者明显是领悟了JavaScript的函数式编程范式,依据JavaScript的动态函数式编程语言的特色打造了一套UI库,马上秒杀ExtJS。
由ExtJS和JQuery的故事,咱们能够看到多语言编程能力是多么的重要。ExtJS的做者精通并喜好Java,所以他把手术刀JavaScript当作锤子Java使,一通乱敲,费力不讨好。
函数式编程语言,还有尾递归等一些小技巧。尾递归能够不用栈,防止递归调用时栈溢出。
模板编程,就是把类型做为参数,一套函数能够支持任意多种类型。表明语言:C++。
模板编程的需求,是在C++开发容器库的时候发明的。由于容器须要保存任意类型的对象,所以就有了泛型的需求。
C++的模板编程,是在编译时,根据源码中的使用状况,建立对应类型的代码。除了C++这种方式,Java,C#也有相似的机制,叫作“泛型”,但它们的实现方式和C++的模板很不一样。它们的编译器不会生成新的代码,而是使用强制类型转换的方式实现。
在没有模板/泛型的编程语言中,怎样在容器中存放对象呢?存取公共基类类型(Java,C#)的对象,或者void*指针(C)便可,取出时本身强制类型转换为实际类型。动态类型语言,不关心类型,更是无所谓了,随便什么对象直接往容器里扔进去,取出来直接用便可。
一些C++高手又在模板的基础上搞出了“模板元编程”。由于模板编程,就是C++的编译器搞定的嘛,模板元编程就是让编译器运算,编译完结果也就算出来了。我不知道除了研究和炫技,这玩意有啥用?
一门语言是否值得学 习,我认为有几个标准:
一、是否要用,要用就得学,这么没有疑问的。毕竟咱们都要吃饭的嘛。
二、其语言特性是否给你耳目一新的感受。若是是,那就值回票价了。如Go语言废掉了异常,改用返回多值。我深觉得然。我其实已经主动不用异常好多年了。由于,我以为既然C不支持异常也活得很好,为何须要异常呢?出错了,返回错误码。没法挽回的错误,直接Abort程序就能够嘛!并且,异常其实是违反面向过程编程原则的。一个函数应该只有一个入口一个出口。抛出异常就多了出口了。
三、是否擅长某一个领域。若是你手里只有一把锤子,那么你就只能把全部任务都当作钉子猛锤一通。但若是工具箱里有多种工具,那面对不一样的任务就驾轻就熟多了。