欢迎光临个人 [QQ空间](http://user.qzone.qq.com/570926881/blog/1477487825) java
本人其实没有足够的资格谈论这个问题,其实真正用过的语言也就C/C++,PHP,JS。其余的不少语言也只停留在知道的阶段,固然用过的语言也不精通,只是想就这个一直堆积在本身内心的问题作一个总结,也算是给不枉这几年跟你们的讨论。如下观点仅仅是我的简介因为水平有限确定有不少疏漏,望见谅,欢迎交流,也会不记名提到一些同窗,没有任何恶意仅仅说明现象。node
### 语言不是程序的所有python
先从一个简单的事情提及。这一部份内容在计算机专业的同窗看来应该不是问题,你们应该不会这样想问题,可是其余人每每不这么看。程序员
记得三年前,在刚来到大学,认识计算机,认识编程这件事情的时候,就以为会一门语言是一种能力的体现,由于很明显,语言的使用场景大都是不一样的,你多会一门语言就意味着你能在一个新的领域作一些新的事情。由于当时仍是抱着“我会什么才能作什么”心态的。(我认为程序员对于本身程序设计技术最终可以完成的产品的能力有三种心态,一是“我会什么才能作什么”,二是“我能学会什么我就能作什么”,三是“我认识可能会什么的人,我就能作什么”,这种心态的发展也体现了程序员的“浪”和成长)算法
学着学着发现了编程语言的统一性,原来不一样语言只是语法不一样啊(后面会反驳这种观点),因而本身不多再去接触新的语言了,只是把不一样的语言当成工具在使用。可是某个假期你们一块儿出去玩,有个高中同窗问我“如今会多少编程语言”的时候我就有点愣了,想了想他应该不是讽刺我吧,可能不太了解状况吧。编程
编程语言虽然在每一个层面执行着不一样的任务,可是程序设计思想实际上是大于语言的。缘由我就很少解释了,你们应该也都清楚。数组
### 不一样语言不只是语法不一样babel
有些深刻研究某个领域的老师,或者其余专业接触编程语言较少的同窗可能持有这种观点,相信不少以工具心态使用编程语言并且不多开发大型工程的人应该也有这种体会。若是把条件、循环的结构换一下、API的名称了解事后两种语言的区别就不剩什么了。这样想也没有什么问题,由于这种想法写出的指令式的程序也能正常运行,每每还能下降学习成本,彻底不用在乎理解和实现的细节。闭包
经过语法能够把语言大概分红几类,标签式(VB,Matlab,...),缩进式(python)和{}式,我的比较喜欢{}这种c-like的语法,灵活清楚。架构
可是我认为,不一样的语言仍是有很大不一样的,其实这篇文章以后可能都要讨论这种不一样,每种语言的做者在发明这种语言的时候的思想就会潜移默化的影响你的程序设计行为,尤为是在构建大型工程的时候,每每每种语言为了实现大工程的“优雅”都有本身的一套写法,他们的运行机制也每每不一样,而理解这些应该是深刻认识一门语言的基础。
如何认识变量,如何处理内存,需不须要虚拟机,采起怎样的回收机制,这样实现对象,怎样实现异步其实都是语言须要考虑的不一样点。
### 语言的分类
若是把语言分为两类,你认为最重要的不一样点应该选哪一个?应该不会有太多人按照标签式、缩进式来分吧?若是回答过程、对象、函数式那么我以为也没啥问题,这也能够算是语言可以提供的一大区别了。可是本文就不讨论函数式相关的事情了,由于真的不懂。
我的认为语言能够按照对变量本质的认识上,这样能够吧语言分为两类,C/C++一类,JAVA,JS,Python,等等其余语言一类。C/C++认为变量指的是一块内存空间,修改变量是修改内存肯定地址中的内容因此在这种语言中 “=” 应该解释为复写内存之意,然而JAVA为表明的这类语言认为变量是一个符号,它跟数据(或者说常量)是分离的只是指向引用的关系,而数据是不会动的也是不能改的。
相信使用C语言的人若是不了解JS语言的机制,得知JS中字符串是常量应该也以为很惊讶吧,可能这种时候都不知道应该怎样处理JS中的字符串了,好想```a[0]='A'```赋值啊怎么办😥?
从C转到第二类语言的人也会在学习的时候也会常常问一个问题,python(或者JS)语言中的函数调用究竟是传值、传地址仍是传引用呢?每每老师会告诉“传引用”,虽然这么说不确切可是我还真听过有这样说的。其实传引用也不能说没有道理,只是与C++表现不一样罢了,若是你恰巧用这两种语言,那么你应该能看懂如下例子中函数对外层变量的做用是不一样的。
```
// C++
void foo(int &a) {
a = 1;
}
// js
function foo(a) {
a = 1;
}
```
其实传进来的都是地址,或者说引用吧,(传引用也是另外一个变量了,可是从JS的角度来看C++这种行为像是传名,固然这么说也不对),并非怎样传递致使的做用不一样,而是内部赋值语句的运行操做不一样了(一个复写,一个引用迁移)。
我的认为这个不一样是语言之间的根本区别,肯定了这个不一样以后,基本以后的是否须要使用虚拟机,是否须要回收内存,等等都可以大概肯定了,以后可能就是在回收内存究竟是jc仍是指针计数之类的问题上了。
另外说一句像C语言这样第一类语言,你编的程序就是最后运行的程序了,虽然你可能引用了不少库,但不影响这个特色,换句话说,若是全部的库都是你写的,你的程序只要编译就能够运行了,什么都不须要依赖。可是其余语言就没有这么单纯了,每每须要一个程序辅助运行来解释你程序的运行帮助你的程序来解决内存等问题,甚至须要一个虚拟机(你们每每这么作)。
### 做用域与闭包
C语言之中根本没有提过闭包这个概念,由于C语言设计机制简单,做用域判断也尽可能的简化,到最后只留下了静态链,把动态链去掉了(这是编译里的概念)。因而一个函数,一个过程就不能保有本身的变量(注意这里指的是函数闭包变量,是与函数同生命周期的,而不是与函数的执行同生命周期的参数变量和临时变量),如今的动态语言每每实现一个比C语言稍稍复杂,可是也不能算是完整的动态链的东西,用这个来解决新的闭包问题。
这从根源上来讲是由于动态语言想把函数(或者说类)做为他的第一成员致使的,若是函数是第一成员,他就不像其余数据成员那样单纯,由于C中只有数据成员,不存在两个数据成员的相对生命周期问题。在动态语言中这里还存在一个弱引用的问题,每每给人带来不少困扰,总的来讲设计有利有弊,这才是不一样语言的魅力,在了解了这种机制以后其实也好处理和转化,用起来到是方便。
### 语言暗示
语言的暗示比语言更加剧要!我一个很好的朋友跟我说过这么一个例子(来自《Java程序员 上班那点儿事》 - 3.2.5 也不要过于迷信C语言)以下,解释为何java运行比C++快。
```
int getXXX(int x, int y) { // java
return x+y;
}
```
```
int getXXX(int x, int y) { // C++
for(int i = 0; i < 10000000; i++){
string ss = "I am so slow";
}
return x+y;
}
```
在你们看来,这也许就是一个笑话。那么我再举一个例子,大三的时候咱们学编译,因为能力有限只能选择更好实现的JS来作大做业(一个阉割版pascal编译器),不少同窗选择使用C++(推荐)来实现这个编译器,我是很佩服用C++写编译器这些人的,由于我以为这东西C++写太难了。
然而这里我想说说效率问题,写过leetcode的同窗应该知道js一样算法平均是比c慢100倍的。而在这个编译器任务中我须要构造一个上千状态的自动机,这个状态机是自动构造的,其中每一个状态都须要各类调整和比较,相同的指导思想,我用js写的这个状态机是能够在5s以内构造的。相比之下C++写的状态机须要1分钟左右才能构造完成。
相同的指导思想,然而js快这么可能是为何呢,由于这之中存在大量赋值操做,类对象的大量转移、建立,在js之中使用的相同表达式在每一个状态中都是共享的,然而在C++中我想你们也不能作成这样,我大概猜一下,每一个状态类对象下的每一个表达式定义为了表达式对象数组,每一个表达式其实都是源表达式的拷贝,这样C++程序就花了大量时间在新建对象和拷贝对象上,可是第二类语言就很天然的绕开了这些操做,反而获得了更高的效率。
考虑这件事情的根源其实就是C++默认“=”深拷贝,而js是赋引用了。固然,若是C++全都合理的使用了引用和Hash(toJSON(self))方法进行比较和赋值,必定可以达到比js快100倍的效果的。我不是说全部状况js都比C++暗示的好,可是起码在这件事情上,一些C++程序员就被在不知情得状况下绑架起来写了10000000句的```string ss = "I am so slow";```吧。
语言对你的影响是潜移默化的,跳出语言想架构,跳入语言作实现可能可以减小大型失误,可是细节上仍是会有根深蒂固的影响。
### 类与对象
这里举一个例子吧,也是我最很差说清楚的例子了。前阵子看到一篇文章《function/bind的救赎(上)》(http://blog.csdn.net/myan/article/details/5928531)提到这个“怎样实现对象机制”的问题,里面解释了我一直以来有的疑惑,如今你们采用的面向类编程的机制可能彻底违背了“对象理论”的设计初衷。从这个角度其实能够把Smalltalk,OC分为一类,其余对象语言分为一类了,目前来看面向对象设计中Java的影响仍是很是大的,大型工程中可以活用以后动态脚本语言特性的仍是太少了。
### 关于异步
异步执行这件事情其实也是我接触JS以后才有这么大的体会的,固然以前为了可以更好地利用计算机的运算资源也是作了不少的尝试的,好比进程、线程、管程这个发展。到JS这里直接让程序之中的每个耗时操做都异步执行了,这样作确实对性能有不少提高,尤为是并发的状况,不用系统处理线程,切换线程了,也是对系统的一种释放。
可是这种修改致使JS的写法都和正常的语言不一样了,后来你们就开始研究如何解决这种诡异的Callback写法了,甚至搬出Promise来解决问题,这两天node发布7,也把async,await支持上了,版本迭代的过程当中,以前的库就不能支持,在本语言内部出现了一套各类feature的编译器(babel)打得火热。
总的来讲出现问题想解决办法仍是一件好事,可是我以为这事情作的愈来愈不优雅了。甚至我以为彻底能够从出发点想办法。可是想一想这种事情每每是这样的,好比被称为良好分层设计的计网,不也因为历史的缘由,有各类不正常的依赖、协议层出不穷么。
### 更多
关于语言这件事,程序员圈子里面就没有中止过争吵。这篇文字的强行堆砌可能不会有太多人看完再后面吵架了吧(仍是但愿你们可以多交流的)。想一想本身也没有什么资格谈论这个问题,算是对本身的思想有个解放,不在去想这个事情了,到这里总算是把大三以来关于语言的思考都差很少记下来了吧,怎么说也是用过世界最好语言和发展最快的语言的人啊。