最开始的时候只有机器语言,即二进制,程序是由二进制语言编写的,而后cpu不断的读取二进制语言 而后执行命令,最后输出的也是二进制java
后来出现了汇编语言,可是cpu不认识汇编语言,因此使用汇编语言编写的程序,最后会通过一道工序转换为机器语言(这应该算是最初的即时编译)linux
后来出现的C语言,由于汇编语言,只能完成简单的操做,像数据类型 内存操做等汇编语言并无定义,而这是大型系统所必须的一些元素,用户使用C语言编写好程序以后,会通过编译器编译成cpu能够执行的机器语言文件,可是不一样系统对于二进制的支持还不同,因此你须要单独为linux和windows分别编译一下。webpack
在后出现了C++,由于C语言虽然好,可是在作多人合做的大规模项目的时候,使用面向对象思想能够极高的提升生产力,因此C++在C语言基础上创造了类 命名空间 继承等概念,C++的编译和C语言同样程序员
再后来出现了Java,由于在Java出现的时候 Java是但愿在物联网行业有所建树的,可是物联网行业不一样的物理设备所搭载的系统是不同的,程序员不可能为每个系统都编写一次程序,因而Java创造了jvm虚拟机,用户须要首先安装jvm虚拟机 而后才能够执行java程序,前面咱们知道C和C++是编译型语言,那Java呢?Java是编译加解释型语言,由于Java在代码完成以后,须要先编译成.class文件,而后.class文件在运行的时候,仍是被jvm不断的解释执行web
在后面出现了C#语言,一样C#也须要一个相似JVM虚拟机的环境,即CLR,C#语言在代码编写完成以后,也会编译成一个中间语言,而后中间语言在执行的时候会被CLR解释成机器语言windows
而后出现了javaScript,javaScript一直生成本身是解释性语言,这是由于javaScript不须要编译,代码写好以后,直接在浏览器打开,而后浏览器里面的JS引擎会不断的将JS代码翻译成机器代码,可是如今的ES6浏览器是没法识别的,须要通过webpack babel等工具进行转化成ES5语言,那这一步算不算编译呢?浏览器
GO语言的出现号称要取代Java在服务器端的地位,由于它具备堪比C++的执行效率,Java的执行效率是不如C++的,由于Java是解释型的,而C++是编译型的,GO语言不只具备C++的效率,还抛弃了C++复杂的语法,和Java同样简单。服务器
这里再说一下V8引擎和Node.js:babel
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的负载均衡来解决。