最开始的时候只有机器语言,即二进制,程序是由二进制语言编写的,然后cpu不断的读取二进制语言 然后执行命令,最后输出的也是二进制
后来出现了汇编语言,但是cpu不认识汇编语言,所以使用汇编语言编写的程序,最后会经过一道工序转换为机器语言(这应该算是最初的即时编译)
后来出现的C语言,因为汇编语言,只能完成简单的操作,像数据类型 内存操作等汇编语言并没有定义,而这是大型系统所必须的一些元素,用户使用C语言编写好程序之后,会经过编译器编译成cpu可以执行的机器语言文件,但是不同系统对于二进制的支持还不一样,所以你需要单独为linux和windows分别编译一下。
在后出现了C++,因为C语言虽然好,但是在做多人合作的大规模项目的时候,使用面向对象思想可以极高的提高生产力,所以C++在C语言基础上创造了类 命名空间 继承等概念,C++的编译和C语言一样
再后来出现了Java,因为在Java出现的时候 Java是希望在物联网行业有所建树的,但是物联网行业不同的物理设备所搭载的系统是不一样的,程序员不可能为每一个系统都编写一次程序,于是Java创造了jvm虚拟机,用户需要首先安装jvm虚拟机 然后才可以执行java程序,前面我们知道C和C++是编译型语言,那Java呢?Java是编译加解释型语言,因为Java在代码完成之后,需要先编译成.class文件,然后.class文件在运行的时候,还是被jvm不断的解释执行
在后面出现了C#语言,同样C#也需要一个类似JVM虚拟机的环境,即CLR,C#语言在代码编写完成之后,也会编译成一个中间语言,然后中间语言在执行的时候会被CLR解释成机器语言
然后出现了javaScript,javaScript一直生成自己是解释性语言,这是因为javaScript不需要编译,代码写好之后,直接在浏览器打开,然后浏览器里面的JS引擎会不断的将JS代码翻译成机器代码,但是现在的ES6浏览器是无法识别的,需要经过webpack babel等工具进行转化成ES5语言,那这一步算不算编译呢?
GO语言的出现号称要取代Java在服务器端的地位,因为它具有堪比C++的执行效率,Java的执行效率是不如C++的,因为Java是解释型的,而C++是编译型的,GO语言不仅具有C++的效率,还抛弃了C++复杂的语法,和Java一样简单。
这里再说一下V8引擎和Node.js:
V8引擎的出现使得JS的执行效率大大提高,因为之前JS代码在解释执行的时候是把jS代码转换为一种中间字节码,然后再把中间字节码转换为机器码,之所以多一步是因为在转换为字节码转化,可以在字节码层面对程序做很多优化,而V8引擎直接跳过字节码把JS直接转换为机器码虽然减少了时间但是也失去了优化的机会,但是这一步随时 V8引擎会用过其他措施来弥补,这就是V8引擎快速的原因。
Node.js建立在V8引擎之上,之所以用Node.js编写服务器端代码而不是Java编写服务器端代码的原因是,Node.js的单线程机制,因为JS本身是单线程的,这是由浏览器环境决定的,所以JS是使用事件机制来处理异步的,即JS在处理大批量操作的时候不会在此处等待,而是将回调函数挂起,然后继续执行,等到操作完成之后,回调函数会被放到时间队列中等待执行。这样做有一个好处是 服务器端不需要针对每一个请求都开辟一个内存去维护他,Java是会为每一个请求单独开一个内存来维护的,直到请求结束,这块内存不会被释放,试想 在面对高并发的时候,同样的并发数 也许Java被充爆了,但是Node.js依然运行良好,但是Node.js的本身的单线程机制决定了他无法利用多核的优势,这可以通过pm2的负载均衡来解决。