作为JS系列的第一篇,内容当然是浏览器如何执行一段JS啦。

首先通过浏览器篇我们可以得知,JS是在渲染进程里的JS引擎线程执行的。在此之后还要了解几个概念,编译器(Compiler)、解释器(Interpreter)、抽象语法树(AST)、字节码(Bytecode)、即时编译(JIT)

编译器和解释器

之所以存在编译器和解释器,是因为机器不能直接理解我们所写的代码,所以在执行程序之前,需要将我们所写的代码“翻译”成机器能读懂的机器语言。按语言的执行流程,可以把语言划分为编译型语言和解释型语言。

编译型语言

编译型语言在程序执行之前,需要经过编译器的编译过程,并且编译之后会直接保留机器能读懂的二进制文件,这样每次运行程序时,都可以直接运行该二进制文件,而不需要再次重新编译了

解释型语言

在每次运行时都需要通过解释器对程序进行动态解释和执行。比如 Python、JavaScript 等都属于解释型语言。

编译器和解释器进行'翻译'的流程

V8执行代码流程

1.通过词法分析,语法分析生成抽象语法树(AST)和执行上下文

第一阶段是分词(tokenize),又称为词法分析,其作用是将一行行的源码拆解成一个个 token。所谓 token,指的是语法上不可能再分的、最小的单个字符或字符串。

第二阶段是解析(parse),又称为语法分析,其作用是将上一步生成的 token 数据,根据语法规则转为 AST。如果源码符合语法规则,这一步就会顺利完成。但如果源码存在语法错误,这一步就会终止,并抛出一个“语法错误”。

2.根据AST生成字节码

有了 AST 和执行上下文后,那接下来的第二步,解释器 Ignition 就登场了,它会根据 AST 生成字节码,并解释执行字节码。

字节码就是介于 AST 和机器码之间的一种代码。但是与特定类型的机器码无关,字节码需要通过解释器将其转换为机器码后才能执行。

3.执行代码

如果有一段第一次执行的字节码,解释器 Ignition 会逐条解释执行。解释器 Ignition 除了负责生成字节码之外,它还有另外一个作用,就是解释执行字节码。在 Ignition 执行字节码的过程中,如果发现有热点代码(HotSpot),比如一段代码被重复执行多次,这种就称为热点代码,那么后台的编译器 TurboFan 就会把该段热点的字节码编译为高效的机器码,然后当再次执行这段被优化的代码时,只需要执行编译后的机器码就可以了,这样就大大提升了代码的执行效率。

V8 的解释器和编译器的取名也很有意思。解释器 Ignition 是点火器的意思,编译器 TurboFan 是涡轮增压的意思,寓意着代码启动时通过点火器慢慢发动,一旦启动,涡轮增压介入,其执行效率随着执行时间越来越高效率,因为热点代码都被编译器 TurboFan 转换了机器码,直接执行机器码就省去了字节码“翻译”为机器码的过程。其实字节码配合解释器和编译器是最近一段时间很火的技术,比如 Java 和 Python 的虚拟机也都是基于这种技术实现的,我们把这种技术称为即时编译(JIT)

相关问题

为什么V8代码执行时间越久,执行效率越高?

因为即时编译(JIT)技术的存在,解释器执行字节码的过程中,如果发现有热点代码(HotSpot),那么后台的编译器 TurboFan 就会把该段热点的字节码编译为高效的机器码,然后当再次执行这段被优化的代码时,只需要执行编译后的机器码就可以了,这样就省去了省去了字节码“翻译”为机器码的过程大大提升了代码的执行效率。

参考:浏览器原理与实践

python利用浏览器执行js_浏览器如何执行JS相关推荐

  1. python利用selenium和safari浏览器驱动实现新浪微博自动点赞 Demo

    import time from selenium import webdriverbrowser = webdriver.Safari() browser.get('http://weibo.com ...

  2. python 利用pyinstaller 编译.exe文件过程中编写完的.exe文件执行过程中闪退

    问题描述: python 利用pyinstaller 编译.exe文件过程中编写完的.exe文件执行过程中闪退,并提示no module named 'pyproj.datadir' 解决方法: 闪退 ...

  3. python 利用火狐浏览器爬取内容

    python 利用火狐浏览器抓取 from selenium import webdriver from selenium.webdriver.firefox.firefox_binary impor ...

  4. python 模拟用户点击浏览器_python爬虫之selenium模拟浏览器

    1.前言 之前在异步加载(AJAX)网页爬虫的时候提到过,爬取这种ajax技术的网页有两种办法:一种就是通过浏览器审查元素找到包含所需信息网页的真实地址,另一种就是通过selenium模拟浏览器的方法 ...

  5. python代替javascript_Pyjamas - 用python代替javascript编写基于浏览器的应用

    如果能用python代替Javascript编写基于浏览器的应用,该有多好啊.但是,Javascript是唯一一种能在浏览器里执行的语言(Flash或Silverlight除外).换个思路,先用Pyt ...

  6. python 模拟浏览器selenium_浅谈python爬虫使用Selenium模拟浏览器行为

    前几天有位微信读者问我一个爬虫的问题,就是在爬去百度贴吧首页的热门动态下面的图片的时候,爬取的图片总是爬取不完整,比首页看到的少.原因他也大概分析了下,就是后面的图片是动态加载的.他的问题就是这部分动 ...

  7. python+selenium环境配置及浏览器调用

    最近在学习python自动化,从项目角度和技术基础角度出发,我选择了python+selenium+appium的模式开始我的自动化测试之旅: 一.python安装 二.python IDE使用简介 ...

  8. python使用selenium打开chrome浏览器时带用户登录信息

    导读 我们在使用selenium打开google浏览器的时候,默认打开的是一个新的浏览器窗口,而且里面不带有任何的浏览器缓存信息.当我们想要爬取某个网站信息或者做某些操作的时候就需要自己再去模拟登陆 ...

  9. [Python爬虫]使用Selenium操作浏览器订购火车票

    这个专题主要说的是Python在爬虫方面的应用,包括爬取和处理部分 [Python爬虫]使用Python爬取动态网页-腾讯动漫(Selenium) [Python爬虫]使用Python爬取静态网页-斗 ...

最新文章

  1. SecureCRT的快捷键
  2. ORACLE--PMON SMON MMNL MMAN MMON
  3. navicat怎么安装mysql数据库_【20170825】从零开始学SQL数据库 安装mysql与navicat,开始练习...
  4. Microsoft将在UWP上支持React Native,同时为VS Code添加工具软件
  5. sql 一列中平均应发工资_劳动者的工资标准,应如何认定?
  6. citrix xendesktop edition
  7. 一维树桩数组区间更新、区间查询
  8. Python字符串等于
  9. 邮票面值设计java_邮票面值设计
  10. dplayer安装php_Dplayer播放器集成p2p加速源码分享
  11. 数学基础(1)线性代数总结
  12. 进入Tokio的异步世界
  13. Quick BI企业报表制作
  14. 硬盘提示设备未就绪要如何办啊
  15. 通过wifi对手机进行adb连接debug调试 adb connect ip_address:5555
  16. 全球最大的3D数据集公开了!标记好的10800张全景图 | 附论文
  17. 全球与中国纳米压印光刻系统市场发展调研及投资价值报告2022-2028年版
  18. ComposeUI——日历控件(CalendarComponent)
  19. mysql中sql插入时间_mysql中使用sql语句插入日期时间类型的写法
  20. 网站站内优化怎么做,SEO站内优化技巧...

热门文章

  1. 我慌了!我妈从床底掏出了我珍藏多年的小本本-----JAVA_Lambda表达式(笔记)
  2. 台式计算机的配置清单表格,电脑配置清单表格,为你分别介绍不同价位的三种配置清单...
  3. H5canvas(保存图片,globalCompositeOperation)
  4. mysql免安装版linux_Linux下配置免安装版的MySQL
  5. 服务器防火墙关闭开机自启解决方案
  6. USB出现“can‘t set config #1, error -12”问题的探索
  7. 计算机更新后启动不了,win10系统更新显卡之后开不了机如何解决
  8. 体验卓越品质 新贵Whql认证鼠标
  9. Python实现SMMS图床
  10. Kaggle -Linear Regression with Time Series