首页 > 其他分享 >浏览器中的编译器和解释器

浏览器中的编译器和解释器

时间:2023-12-14 16:32:45浏览次数:29  
标签:解释器 浏览器 字节 AST 编译 编译器 执行

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

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

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

浏览器中的编译器和解释器_编译器

从图中你可以看出这二者的执行流程,大致可阐述为如下:

  1. 在编译型语言的编译过程中,编译器首先会依次对源代码进行词法分析、语法分析,生成抽象语法树(AST),然后是优化代码,最后再生成处理器能够理解的机器码。如果编译成功,将会生成一个可执行的文件。但如果编译过程发生了语法或者其他的错误,那么编译器就会抛出异常,最后的二进制文件也不会生成成功。
  2. 在解释型语言的解释过程中,同样解释器也会对源代码进行词法分析、语法分析,并生成抽象语法树(AST),不过它会再基于抽象语法树生成字节码,最后再根据字节码来执行程序、输出结果。

浏览器中的编译器和解释器_解释器_02

V8 在执行过程中既有解释器 Ignition,又有编译器 TurboFan。

1、生成抽象语法树(AST)和执行上下文

将源代码转换为抽象语法树,并生成执行上下文。高级语言是开发者可以理解的语言,但是让编译器或者解释器来理解就非常困难了。对于编译器或者解释器来说,它们可以理解的就是 AST 了。所以无论你使用的是解释型语言还是编译型语言,在编译过程中,它们都会生成一个 AST。这和渲染引擎将 HTML 格式文件转换为计算机可以理解的 DOM 树的情况类似。

AST 是非常重要的一种数据结构,在很多项目中有着广泛的应用。其中最著名的一个项目是 Babel。Babel 是一个被广泛使用的代码转码器,可以将 ES6 代码转为 ES5 代码,这意味着你可以现在就用 ES6 编写程序,而不用担心现有环境是否支持 ES6。Babel 的工作原理就是先将 ES6 源码转换为 AST,然后再将 ES6 语法的 AST 转换为 ES5 语法的 AST,最后利用 ES5 的 AST 生成 JavaScript 源代码。

除了 Babel 外,还有 ESLint 也使用 AST。ESLint 是一个用来检查 JavaScript 编写规范的插件,其检测流程也是需要将源码转换为 AST,然后再利用 AST 来检查代码规范化的问题。

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

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

这就是 AST 的生成过程,先分词,再解析。

2.、生成字节码

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

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

浏览器中的编译器和解释器_解释器_03

从图中可以看出,机器码所占用的空间远远超过了字节码,所以使用字节码可以减少系统的内存使用。

3、执行代码

生成字节码之后,接下来就要进入执行阶段了。

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

其实字节码配合解释器和编译器是最近一段时间很火的技术,比如 Java 和 Python 的虚拟机也都是基于这种技术实现的,我们把这种技术称为即时编译(JIT)。具体到 V8,就是指解释器 Ignition 在解释执行字节码的同时,收集代码信息,当它发现某一部分代码变热了之后,TurboFan 编译器便闪亮登场,把热点的字节码转换为机器码,并把转换后的机器码保存起来,以备下次使用。

理解 JIT 这套工作机制还是很有必要的。你可以结合下图看看 JIT 的工作过程:

浏览器中的编译器和解释器_解释器_04

对于优化 JavaScript 执行效率,应该将优化的中心聚焦在单次脚本的执行时间和脚本的网络下载上,主要关注以下三点内容:

  1. 提升单次脚本的执行速度,避免 JavaScript 的长任务霸占主线程,这样可以使得页面快速响应交互;
  2. 避免大的内联脚本,因为在解析 HTML 的过程中,解析和编译也会占用主线程;
  3. 减少 JavaScript 文件的容量,因为更小的文件会提升下载速度,并且占用更低的内存。


标签:解释器,浏览器,字节,AST,编译,编译器,执行
From: https://blog.51cto.com/key3feng/8821932

相关文章

  • 软件测试/人工智能|Edge浏览器实用插件推荐
    前言我们要把edge玩出花,让它充分发挥自己的强大实力,就需要安装各个功能强大的插件,这些插件可以帮助我们实现各种功能,本文就来给大家介绍一下几款实用的edge浏览器插件。AdblockPlus广告会降低我们的浏览体验,AdblockPlus能够屏蔽网页上的广告,我们的浏览更加干净和快速。我们......
  • 软件测试/人工智能|教你轻松玩转Edge浏览器
    前言提到Windows系统自带的浏览器,大家第一反应就是IE,对IE大家都是深恶痛绝的,然后大家就纷纷转向了Chrome和Firefox;应该说微软也是知道大家对IE的不满,痛定思痛之后,推出了基于Chromium内核的新浏览器——Edge,我本来也是拒绝的,但是使用之后,就真香了,使用十分方便,功能十分强大,因此本......
  • php获取详细访客信息,获取访客IP,IP归属地,访问时间,操作系统,浏览器,移动端/PC端,环境语言,访
    问题描述:需要获取访客访问网站信息1.代码示例与说明:<?phpheader("Content-Type:text/html;charset=utf-8");        //代码中涉及字符串处理,为防止汉字乱码需加编码说明functionchinesesubstr($str,$start,$len){          ......
  • jsHTTP/HTML/浏览器
    1|前端基础1.1|HTTP/HTML/浏览器说一下http和https参考回答:https的SSL加密是在传输层实现的。(1)http和https的基本概念http:超文本传输协议,是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏......
  • vue文件下载调取浏览器下载进程
    fetch+streamSaver前端在使用axios发送网络请求时,如文件下载,无法实时获取当前已经下载的文件流,只有当后端返回全部流时,才能在浏览器右下角显示已经完成的进度。但是当文件很大时,就会出现长时间的等待,而且不显示下载进度。此时可以通过fetch来发送网络请求实时获取已经下载的......
  • 浏览器中导出导入证书,https网站报非安全链接
    1、查看证书信息2、点击“网站非安全链接”3、点击“证书信息”,然后导出。4、保存证书至文件夹5、打卡Internet选项,找到内容-证书6、找到“受信任的根证书颁发机构”点击导入。7、找到导出的证书文件,导入即可。......
  • docker问题 dubbo-admin浏览器错误
    问题描述:zookeeper容器配置成功,dubbo-admin容器配置成功。使用dockerps显示两个容器都启动成功且映射端口没有出错。在虚拟机中ping本机和在本机中ping虚拟机都显示正常接通。使用浏览器访问dubbo-admin时浏览器无法显示。解决方案:修改docker配置文件vim/etc/docker/da......
  • 浏览器页面可见性事件
        当我们页面在做耗资源的操作时(例如websockert通讯,音频、视频播放灯),彼时切换到其他页面,耗资源的操作还在继续,但我们已经看不到最直观的效果反馈了,又浪费了服务器资源,有没有办法在页面切换到其它页面时让其暂停耗资源的操作呢,让服务器的资源能够最大化的有效利用?浏览......
  • 从浏览器原理出发聊聊 Chrome 插件
    浏览器架构演进单进程浏览器时代单进程浏览器是指浏览器的所有功能模块都是运行在同一个进程里,这些模块包含了网络、插件、JavaScript运行环境、渲染引擎和页面等。在2007年之前,市面上浏览器都是单进程的。单进程浏览器的架构很多功能模块运行在一个进程里,是导致单进程浏......
  • Chrome 浏览器开启 Json 数据格式化显示
    Chrome浏览器开启Json数据格式化显示默认格式安装扩展程序JSONView......