如何执行一段 JavaSscript 代码

解释执行 与 编译执行

解释执行,需要先将输入的源代码通过解析器编译成中间代码,之后直接使用解释器解释执行中间代码,然后直接输出结果。

编译执行。采用这种方式时,也需要先将源代码转换为中间代码,然后我们的编译器再将中间代码编译成机器代码。通常编译成的机器代码是以二进制文件形式存储的,需要执行这段程序的时候直接执行二进制文件就可以了。还可以使用虚拟机将编译后的机器代码保存在内存中,然后直接执行内存中的二进制代码。

V8 的策略

解释执行的启动速度快,但是执行时的速度慢,而编译执行的启动速度慢,但是执行时的速度快。

V8 并没有采用某种单一的技术,而是混合编译执行和解释执行这两种手段。

我们把这种混合使用编译器和解释器的技术称为 JIT(Just In Time) 技术。

具体流程

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

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

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

Babel 的工作原理就是先将 ES6 源码转换为 AST,然后再将 ES6 语法的 AST 转换为 ES5 语法的 AST,最后利用 ES5 的 AST 生成 JavaScript 源代码。

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

2. 生成字节码

其实一开始 V8 并没有字节码,而是直接将 AST 转换为机器码,但是随着 Chrome 在手机上的广泛普及,特别是运行在 512M 内存的手机上,内存占用问题也暴露出来了,因为 V8 需要消耗大量的内存来存放转换后的机器码。为了解决内存占用问题,V8 团队大幅重构了引擎架构,引入字节码,

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

3. 执行代码

即时编译(JIT)技术。具体到 V8,

就是指解释器 Ignition 在解释执行字节码的同时,收集代码信息,

当它发现某一部分代码变热了之后,

TurboFan 编译器便闪亮登场,把热点的字节码转换为机器码,并把转换后的机器码保存起来,以备下次使用。

如何执行一段java代码_V8 之 如何执行一段 JavaSscript 代码相关推荐

  1. java 判断dir是否存在_谁可以帮忙写一段java判断文件或者文件夹是否存在的代码...

    田心枫 package com.may.ninety; import java.io.File; import java.io.IOException; public class WeekDemo1  ...

  2. php请求接口两次,php curl post请求执行一次curl_exce 请求的接口确执行两次

    1.php curl post请求接口,打印日志执行了一次curl_exce,但是请求的接口却重复执行两次. 2.代码: $ch = curl_init(); if(false === $ch){ w ...

  3. Crontab中shell每分钟执行一次HDFS文件上传不执行的解决方案

    一.Crontab -e 加入输出Log */1 * * * * /qiwen_list/upload_to_hdfs.sh > /qiwen_list/mapred.log 2>& ...

  4. Linux命令每五分钟执行一次,Linux crontab 每5秒钟执行一次 shell 脚本 的方法

    Linux crontab 每5秒钟执行一次 shell 脚本 的方法 由于 Linux 的 crontab 的定时命令格式如下: minute hour day-of-month month-of- ...

  5. matlab 每秒执行一次,Systemd.timer 定时任务每秒执行的精度问题

    目的:每秒执行定时任务 环境:CentOS 使用绝对时间参数 OnCalendar 来设定每秒执行就会出现停顿 6,7 秒的情况.看下面执行结果 如果是每 2 秒执行就是正常的. service: [ ...

  6. java 中的静态变量,静态代码块,动态代码块,构造方法执行顺序的深入探究

    要想完全弄懂这个执行顺序,需要我们先了解几个概念. 首先是类加载与对象的构造,类加载就是在第一次调用这个类的时候jvm虚拟机会通过类加载器在一个叫做方法区的逻辑内存中将所要用到的类的信息存放在里边,其 ...

  7. windows计划任务设置每小时执行一次

    1.新建一个任务 2.设置触发器是:每天 3.设置开始时间 4.下一步 5.一定要把√选上,点击完成 6.弹出窗口选择:触发器 7.点击编辑,勾选 重复任务间隔,完成.最小每5分钟执行一次,网上说可以 ...

  8. js图片转二进制流_V8是如何执行一段JS代码的?

    汇编器 编译器 解释器 解释执行和解释执行 什么是V8? V8执行Js代码的过程 汇编器 编译器 解释器 众所周知,计算机只能理解机器语言,而我们平时编程用的通常是高级语言,所以源代码通常都要经过层层 ...

  9. V8引擎:编译器和解析器是如何执行一段javascript代码的?

    前言 前面我已经说完了js引擎是如何存储数据,如何回收垃圾的,但这只是基础罢了,并不是v8引擎的最主要任务,接下来我要讲v8引擎的核心:如何执行js代码,为什么要学习这些东西呢? 前端工具和框架的自身 ...

最新文章

  1. 如何在Win7电脑上增加新磁盘分区?
  2. 【网络编程】之七、select聊天室
  3. 使用Spring和Hibernate进行集成测试有多酷
  4. [转]2016年Web前端面试题目汇总
  5. 面试问题背后的“猫腻”
  6. aix查看oracle用户密码,AIX详细查看用户/进程使用内存
  7. 【转】关于OnPaint的工作机制
  8. Clojure 学习入门(10)- httpkit
  9. mysql kill sql_批量 kill mysql 中运行时间长的sql
  10. (附源码)ssm牙科诊所预约网站 毕业设计 260952
  11. 中望cad文字显示问号怎么办_中望CAD图纸显示乱码?如何快速解决字体问题
  12. ijkplayer 代码走读之 h264 解封装器应用详解
  13. redis-trib.rb命令详解
  14. 2020-05-05
  15. Compose系列 五 副作用 side-effect
  16. POJ 1436.Horizontally Visible Segments-线段树(区间更新、端点放大2倍)
  17. 【深度学习】关于pytorch中使用pretrained的模型,对模型进行调整
  18. Ubuntu 18.04缺少libstdc++.so.6共享库解决方案
  19. C/C++实现文件加密器
  20. LabVIEW写入可快速加载的TDMS文件

热门文章

  1. 我说我了解集合类,面试官竟然问我为啥HashMap的负载因子不设置成1!?
  2. 阿里云原生张羽辰:服务发现技术选型那点事儿
  3. FinTech:一个单体系统足以撑起银行持续交付全球大项目
  4. 十分钟搞定JeecgBoot 单体升级微服务!
  5. SpringBoot2.0 整合 SpringSecurity 框架,实现用户权限安全管理
  6. Densely CNN
  7. 《JavaScript高级程序设计(第四版)》红宝书学习笔记(1)
  8. 本地也能运行AWS?是的,AWS开始进军混合云领域了
  9. 企业网络之间资源互访
  10. MapGuide 浏览器可接受参数分析