语言的运行

C/C++语言

  • 使用编译器直接将它们编译成本地代码(机器指令),这是由开发人员在代码编写完成之后实施;
  • 用户只是使用这些编译好的本地代码,这些本地代码被系统的加载器加载执行,由操作系统调度CPU直接执行,无需其它额外的辅助虚拟机等;
  • 这一过程基本上是从源代码开始,然后抽象语法树,之后中间表示,最后到本地代码;

Python等脚本语言

  • 处理脚本语言通常的做法是开发者将写好的代码直接交给用户,用户使用脚本的解释器将脚本文件加载然后解释执行;
  • 当然,现在Python也可以支持将脚本编译生成中间表示;
  • 所以对于脚本语言,一般需要开发人员的编译过程;
  • 这主要因为使用场景不一样,它的目的不是高性能;
  • 这一过程是源代码,到抽象语法树,再到解释器解释执行;

Java语言

  • 其可以理解为比较明显的两个阶段:

    • 首先是像C++语言一样的编译器,但是,同C++编译器生成的本地代码结果不同,经过编译器编译之后的是字节码,字节码是平台无关的;
    • 在运行字节码阶段,Java的运行环境也就是Java虚拟机会加载字节码,使用解释执行这些字节码;
    • 同时现代Java虚拟机一般都引入了JIT技术,也就是前面说的将字节码转变成本地代码来提高执行效率;
  • 这主要两个阶段,第一阶段对时间要求不严格,第二阶段则对每个步骤所花费的时间非常敏感,时间越短越好;

JavaScript语言

  • 它是一种解释性脚本语言,但是随着众多工程师不断投入资源来提高它的速度,这使得它能够使用了Java虚拟机和C++编译器中众多的技术;
  • 同时它的工作方式也在演变:
    • 早期由解释器来解释它们即可,就是将源代码转变成抽象语法树,然后在抽象语法树上解释执行;
    • 随着将Java虚拟机的JIT技术引入,现在的做法是将抽象语法树转成中间表示(也就是字节码),然后通过JIT技术转成本地代码,这能够大大的提高了执行效率;
    • 当然也有些做法直接从抽象语法树生成本地代码的JIT技术,例如V8;
  • JavaScriptJava还是有以下一些区别:
    • JavaScript是无类型的语言,这使得对于对象的表示和属性的访问上比Java存在比较大的性能损失;
    • Java语言通常是将源代码编译成字节码,这个同执行阶段是分开的,也就是从源代码到抽象语法树到字节码这段时间的长短是无所谓的,主要是尽可能的生成高效的字节码即可;而对于JavaScript,这些都是在网页和JavaScript文件下载后同执行阶段一起在网页的加载和渲染过程中来实施的,所以对它们的处理时间也有着很高的要求;

JavaScript引擎主要包括

  • 编译器:主要工作是将源代码编译成抽象语法树,然后在某些引擎中还包含将抽象语法树转换成字节码;
  • 解释器:在某些引擎中,解释器主要是接受字节码,解释执行这个字节码,然后也依赖来及回收机制等;
  • JIT工具:一个能够能够JIT的工具,将字节码或者抽象语法树转换成本地代码;
  • 垃圾回收器和分析工具:负责垃圾回收和收集引擎中的信息,帮助改善引擎的性能和功效;

JavaScriptCore引擎和V8引擎

WebKit中的JavaScript引擎

  • WebKit项目中,最初只有JavaScriptCore引擎;在Blink还独立出来之前,为了支持不同的JavaScript引擎,WebKit设计了一套接口可以切换使用不同的JavaScript引擎(事实上,这一接口会降低性能),所以,WebKit当时可以支持两种类型的JavaScript引擎,那就是JavaScriptCore引擎和V8引擎;两者都是基于WebKit所提供的接口来同渲染引擎协同工作;

    JavaScriptCore引擎

  • JavaScriptCore引擎是WebKit中默认的引擎;
  • 在早期阶段,性能不是特别突出;特别是,它只有解释器来解释执行JavaScript代码,这一效率十分的低效;
  • 从2008年开始,JavaScriptCore引擎开始一个新的优化工作;
  • JavaScriptCore最简单的处理部分,主要是将源代码翻译成抽象语法树,之后是平台无关的字节码,在最初的版本中,字节码会被JavaScriptCore引擎解释执行;在后面的版本中,逐渐加入了JIT编译器,将热点函数生成本地代码;

V8引擎

  • 为了达到高性能的JavaScript代码执行效率从而获得更好的网页浏览效果,它甚至采用直接将JavaScript编译成本地代码的方式;
  • 首先它也是将源代码转变成抽象语法树的,这一点同JavaScriptCore引擎一样,之后两个引擎开始不同;
  • 不同于JavaScriptCore引擎,V8引擎并不将抽象语法树转变成字节码或者其它中间表示,而是通过JIT编译器的全代码生成器从抽象语法树直接生成本地代码,所以没有像Java一样的虚拟机或者字节码解释器;
  • 这样做,主要是因为减少这抽象语法树到字节码的转换时间,这一切都在网页加载时候完成,虽然可以提高优化的可能,但是这些分析可能带来巨大的时间浪费;当然,缺点也很明显,至少包括两点:
    • 第一是某些JavaScript使用场景其实使用解释器更为合适,因为没有必要生成本地代码;
    • 第二是因为没有中间表示,会减少优化的机会因为缺少一个中间表示层;
  • 在之后的版本中,V8工程师们引入了Crankshaft编译器,它能够对热点的JS函数进行生成的分析和优化后再生成本地代码,原因在于不是所有的JavaScript代码都合适做如此深层次的优化,因为优化本身也需要花费一定的时间;

Chromium网络栈

概述

  • 主要作用是使用网络来下载各种类型的资源,还需要支持最新的HTML5功能WebSockets ;
  • 为了高效的网络机制,Chromium使用了预DNS解析和资源预取等技术,极大的减少了用户等待时间;
  • Chromium又引入了SPDYQUIC等新网络协议,用于减少网络传输时间;

调用栈

  • HTTP协议为例,在建立TCPsocket连接过程中涉及的类;
  • 首先是URLRequest被上层调用启动请求的时候,它会根据URLscheme来决定需要创建什么类型的请求,例如http://file://;还可以是自定义的scheme,例如Android系统的file://assets/;
    • URLRequest创建的是一个URLRequestJob子类的一个对象,为了支持自定义的scheme处理方式,它是利用工厂模式;基本的思路是,用户可以在该类中注册多个工厂,当有URLRequest请求时候,先有工厂检查它是否需要处理该scheme,如果没有,继续交由下一个工厂类;最后,如果没有任何工厂能够处理的话,则交给内置的工厂来检查和处理是否是http://ftp://或者file://等;
  • 其次,当URLRequestHttpJob被创建后,它首先从Cookie管理器中获取跟该URL相关联的信息;之后,同样借助于HttpTransactionFactory创建一个HttpTransaction类的对象来表示开启一个HTTP连接的事务(不同于数据库中的事务概念;
    • HttpCache类使用本地磁盘缓存机制,如果该请求对应的回复已经在磁盘缓存中,那么无需再建立HttpTransaction来发起连接,直接从磁盘中获取;
    • 如果磁盘中没有,同时如果目前该URL请求对应的HttpTransaction已经建立,那么只要等待它的回复即可;
    • 这些条件都不满足后,实际上才会真正创建HttpTransaction;
  • 然后,HttpNetworkTransaction使用HttpNetworkSession来管理连接会话;
    • HttpNetworkSession通过它的成员HttpStreamFactory来建立TCP Socket连接;
    • 之后创建HttpStream对象;HttpStreamFactory将和网络之间的数据读写交给自己新创建的一个HttpStream对象来处理;
  • 最后,是套接字的建立;Chromium中的跟服务器建立连接的套接字是StreamSocket,它是一个抽象类;同时,为了支持SSL机制,它还有一个子类就是SSLSocket;

SPDY

  • 为了解决HTTP管线化技术的网络延迟和安全性问题;
  • 使用SPDY协议的服务器和客户端可以将网络加载的时间减少64%;在HTTP2.0的草案中引入SPDY协议作为基础来编写;
  • SPDY协议是一种新的会话层协议,它定义在HTTP协议和TCP协议之间;
  • 协议的核心思想是多路复用,仅使用一个连接来传输一个网页中的众多资源;
    • 它本上并没有改变HTTP协议,只是将HTTP协议头通过SPDY来封装和传输;
    • 其传输方式也没有发生变化,然后使用TCP/IP协议;
    • 所以,它相对比较容易的布置,服务器只需要插入SPDY协议的解释层,从SPDY的消息头中获取各个资源的HTTP头即可;
    • SPDY协议必须建立在SSL层之上,这是一个比较大的限制,因为有很多网站不一定希望支持HTTPS;
  • SPDY的工作方式有以下四个特征:
    • 利用一个TCP连接来传输不限个数的资源请求的读写流,这与之前的为每个资源请求都建立一个TCP连接大大不同,这明显提高了TCP连接的利用率,减少TCP连接的维护成本;
    • 根据资源请求的特性和优先级,SPDY可以调整它们的请求这些资源的优先级,例如对JavaScript资源的优先级很高,服务器优先传输回复该类型的请求;
    • 对这些请求使用压缩技术,大大减少需要传送的字节数;这一思想已广泛应用于各种浏览器中;
    • 当用户需要浏览某个网页的时候,支持SPDY协议的服务器在发送网页内容时候可以尝试发送一些信息给浏览器,告诉后面可能需要哪些资源,浏览器可以提前知道并决定是否需要下载;更极端的情况是,服务器可以主动发送资源;

浏览器-09 javascript引擎和Chromium网络栈的更多相关文章

  1. 理解WebKit和Chromium: Chromium网络栈

    转载请注明原文地址:http://blog.csdn.net/milado_nju ## 概述 前面讲到Chromium的资源加载机制,在调用栈上,提到URLRequest之后就戛然而止,在这之下就是 ...

  2. 识别浏览器的JavaScript引擎的方法

    答案来自StackOverflow,打开这个网页http://jsbin.com/opuvas即可,这个网页也是答题者自己写的. 二维码是这个网址.网页内有统计访问量,作者想知道对多少人有用,建议尊重 ...

  3. V8 javascript 引擎

    V8是一个由丹麦Google开发的开源java script引擎,用于Google Chrome中.[2]Lars Bak是这个项目的组长.[3]   V8在执行之前将java script编译成了机 ...

  4. ECMA262,JavaScript引擎,浏览器

    相关阅读:https://www.cnblogs.com/970119449blog/p/8080133.html 相关阅读:https://www.jb51.net/article/75888.ht ...

  5. 简介浏览器内核与JavaScript引擎

    本文介绍了常用浏览器内核与JavaScript引擎 一.浏览器内核 Rending Engine, 顾名思义,称之为渲染网页内容的,将网页的代码转换为你看得见的页面,因为是排版,所以排版,所以肯定会有 ...

  6. 关于浏览器内核与javascript引擎的一些小知识

    浏览器是我们每天几乎都必须使用的软件产品,可是对于自己每天都接触的浏览器,很多同学其实对其一无所知.今天异次元就跟大家说说关于浏览器内核的一些事儿吧,好让你了解多一点稍微内在的东西. 在下面的文章中主 ...

  7. 《浏览器工作原理与实践》<10>作用域链和闭包 :代码中出现相同的变量,JavaScript引擎是如何选择的?

    在上一篇文章中我们讲到了什么是作用域,以及 ES6 是如何通过变量环境和词法环境来同时支持变量提升和块级作用域,在最后我们也提到了如何通过词法环境和变量环境来查找变量,这其中就涉及到作用域链的概念. ...

  8. 理解WebKit和Chromium: JavaScript引擎简介

    转载请注明原文地址:http://blog.csdn.net/milado_nju 1. 什么是JavaScript引擎 什么是JavaScript引擎?简单来讲,就是能够提供执行JavaScript ...

  9. 【转】理解WebKit和Chromium: JavaScript引擎简介

    转载请注明原文地址:http://blog.csdn.net/milado_nju1. 什么是JavaScript引擎什么是JavaScript引擎?简单来讲,就是能够提供执行JavaScript代码 ...

随机推荐

  1. JVM内存模型、指令重排、内存屏障概念解析

    在高并发模型中,无是面对物理机SMP系统模型,还是面对像JVM的虚拟机多线程并发内存模型,指令重排(编译器.运行时)和内存屏障都是非常重要的概念,因此,搞清楚这些概念和原理很重要.否则,你很难搞清楚哪 ...

  2. Google Maps API V3 之 图层

    Google官方教程: Google 地图 API V3 使用入门 Google 地图 API V3 针对移动设备进行开发 Google 地图 API V3 之事件 Google 地图 API V3 ...

  3. [Unity3d]调试问题之UI/Image不显示

    问题描述 在项目中添加的UI/Image资源,在PC和通过Unity Remove测试都没有问题: PC上的效果 手机上Unity Remove测试结果 可真正发布到手机上运行则如下显示,说明imag ...

  4. Django基础,Day9 - 静态文件目录与路径设置说明(eg. images, JavaScript, CSS)

    静态文件路径设置官方说明 1. Make sure that django.contrib.staticfiles is included in your INSTALLED_APPS. 2. In ...

  5. javascript数据结构与算法---检索算法

    查找数据有2种方式,顺序查找和二分查找.顺序查找适用于元素随机排列的列表.二分查找适用于元素已排序的列表.二分查找效率更高,但是必须是已经排好序的列表元素集合. 一:顺序查找 顺序查找是从列表的第一个 ...

  6. Express知识整理

    开发实例 Express开发实例(1) —— Hello,world! Express开发实例(2) —— Jade模板引擎

  7. oracle分区表知识

    在F5中查看执行计划的时候总是看到很多信息: range分区 执行计划中出现的: 分区表,按 n1 ,n2 分区 partition range single:访问单个分区 partition ran ...

  8. HDU 5686 斐波那契数列、Java求大数

    原题:http://acm.hdu.edu.cn/showproblem.php?pid=5686 当我们要求f[n]时,可以考虑为前n-1个1的情况有加了一个1. 此时有两种情况:当不适用第n个1进 ...

  9. springmvc 表单提交

    Spring MVC自带的表单标签比较简单,很多时候需要借助EL和JSTL来完成. 下面是一个比较简单的表单提交页面功能: 1.User model package com.my.controller ...

  10. 关于CDN的认识

    传统的未加缓存服务的访问过程: 用户提交域名→浏览器对域名进行解释→得到目的主机的IP地址→根据IP地址访问发出请求→得到请求数据并回复 由上可见,用户访问未使用CDN缓存网站的过程为: 1).用户向 ...