【JavaScript运行原理之V8引擎】V8引擎解析JavaScript代码原理
1. 编程语言的执行
高级语言最终都需要编译为低级语言才能被硬件执行,越高级的语言中间的转换时间越长,效率越低,越低级的语言执行素的越快,但是由于缺少高级语言便捷的语法特性所以很难编写代码。
2. 大杂烩JS
它是作者在1995年花10天写出来的,整个语言差不多是很多语言的大杂烩:
- 借鉴了C语言的基本语法;
- 借鉴了Java的数据类型和内存管理
- 借鉴了Scheme语言,将函数作为一等公民
- 借鉴了Self语言,使用了原型继承机制,基于原型prototype的继承机制
所以JS算是 函数式编程 和 面向对象编程的混合产物。
3. 动态语言JS
通过var声明一个变量,可以给这个变量赋值任何数据类型的值,所以称js是一门动态语言。
但这也有一个缺点:我们在声明了复杂数据类型以后,可以随便删除、修改里面的属性,这对开发者来说是很爽的,但是对于编译器来说就是一场灾难,因为源代码里提供的信息太少了,js的语言特性让编译器没办法在运行前知道变量的类型,只有在运行期间才能确定各个变量的类型,这就导致了JS无法在运行前编译出更加迅速的低级语言代码。
但是现在的JS编译引擎都使用了运行时编译,在运行时阶段生成机器代码,而不是提前生成,这就是把代码的运行和生成机器代码同时执行,在运行阶段收集变量的类型信息,然后根据这些信息编译生成机器代码,然后直接使用这些机器代码。像Java这样的语言都是在运行前生成好机器代码。
4. JavaScript引擎
JS作为一门高级语言,它被CPU执行之前,需要通过某种程序将js转换成机器语言并执行,这种程序就是JavaScript引擎。
JavaScript有很多引擎但是在编译JS时流程是差不多的:
- 将js源码通过解析器解析成抽象语法树AST;
- 接着通过接着再通过解释器将AST编译成字节码,字节码与平台无关,可以在任何操作系统上运行
- 字节码最后通过编译器生成机器码,由于不同平台使用 的机器代码会有差异,所以编译器会根据当前平台生成相应的机器码(汇编代码)。
这是一个简化流程,在不同JS引擎中表现会有一定的差异。
5. 什么是V8引擎
V8 是一个接收JavaScript代码,并编译代码,执行代码的一个C++程序,编译后的代码可以在多种操作系统,多种处理器上运行。
V8的工作:编译执行js代码、处理调用栈、内存分配、垃圾回收。
6. V8如何编译执行js代码
一般引擎在编译执行js代码都会用到3个重要的组件:解析器、解释器、编译器。
- 解析器:负责将js源代码解析为抽象语法树AST
- 解释器:将AST解释为字节码,同时解释器也有直接解释执行字节码的能力
- 编译器:将字节码编译为运行高效的汇编语言(机器码)
编译流程:
- 由解析器将js解析为抽象语法树AST
- 通过解释器将AST生成字节码,此时AST就被清除了,释放内存空间。生成的字节码直接被解释器执行,同时生成的字节码将作为基准执行模型,
- 在代码不断运行的过程中,解释器会收到很多可以用于优化代码的信息,比如变量的类型,哪些函数执行的频率较高这些信息会收集给编译器,编译器会根据这些信息编译出经过优化的机器代码
注意: 优化后的机器代码也可能会被还原成字节码,因为js时一门动态语言,会导致编译器收集到的变量的类型不一致,比如你一开始声明函数接收的参数时int类型,函数被标记为热点函数后就会生成机器码,但是后边调用函数你传入的参数时String类型,机器码不知道如何处理字符串参数,于是就需要回退到字节码,由解释器来解释执行,效率就会变低。所以我们尽量不要把一个变量的类型变来变去(TS了解一下)。
7. 编译器处理js过程中的优化策略:
- 若函数只是声明,没有被调用,则不被解析生成AST
- 若函数只被调用一次,则生成字节码后就直接被解释执行,不会进行优化编译为机器代码
- 函数若被调用多次,则可能会被标记为热点函数,可能会被编译为机器代码,之后调用这个函数时,直接调用机器代码
相关文章:
【JavaScript运行原理之V8引擎】V8引擎解析JavaScript代码原理
1. 编程语言的执行 高级语言最终都需要编译为低级语言才能被硬件执行,越高级的语言中间的转换时间越长,效率越低,越低级的语言执行素的越快,但是由于缺少高级语言便捷的语法特性所以很难编写代码。 2. 大杂烩JS 它是作者在1995…...
C++11:智能指针
文章目录1. 介绍1.1 动态内存与智能指针2. 使用2.1 创建2.2 使用3. 原理3.1 RAII3.2 像指针一样使用3.3 支持智能指针对象拷贝auto_ptrRAII4. 标准库中的智能指针4.1 unique_ptr模拟实现4.2 shared_ptr引用计数模拟实现定制删除器4.3 weak_ptrshared_ptr造成的循环引用问题与sh…...
ccc-pytorch-RNN(7)
文章目录一、RNN简介二、RNN关键结构三、RNN的训练方式四、时间序列预测五、梯度弥散和梯度爆炸问题一、RNN简介 RNN(Recurrent Neural Network)中文循环神经网络,用于处理序列数据。它与传统人工神经网络和卷积神经网络的输入和输出相互独立…...
docker安装(linux)
安装需要的软件包 yum install -y yum-utils 设置stable镜像仓库(使用阿里云镜像) yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 更新yum软件包索引 yum makecache fast 安装DOCKER 引擎 yum -y…...
【数据库概论】10.1 事务及其作用
事务是一系列的数据库操作,是数据库应用程序的基本逻辑单元 10.1 事务的基本概念 1.事务 事务是用户定义的一个数据库操作序列,是一个具有原子性的操作,不可再分,一个事务内的操作要么全做、要么都不做。一般来说,一…...
通讯录(C++实现)
系统需求通讯录是一个可以记录亲人、好友信息的工具。本章主要利用C来实现一个通讯录管理系统系统中需要实现的功能如下:添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人显示联系人:显示通讯录…...
轻松掌握C++的模板与类模板,将Tamplate广泛运用于我们的编程生活
C提高编程 本阶段主要针对C泛型编程和STL技术做详细讲解,探讨C更深层的使用 泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。 模板 1.模板的概念 模板就是建立通用的模具,大大提高复用性 例如: 2.函数模板 C另一种编程思想称…...
pandas 数据预处理+数据概览 处理技巧整理(持续更新版)
这篇文章主要是整理下使用pandas的一些技巧,因为经常不用它,这些指令忘得真的很快。前段时间在数模美赛中已经栽过跟头了,不希望以后遇到相关问题的时候还去网上查(主要是太杂了)。可能读者跟我有一样的问题࿰…...
mmdetectionV2.x版本 训练自己的VOC数据集
mmdetection目录下创建data文件夹,路劲如图所示,不带yololabels 修改配置文件 mmdet/datasets/voc.py 配置图片格式 mmdet/datasets/xml_style.py 如果图片是jpg则改成jpg,是png格式就改成png,这里我不需要改,本…...
Shell - crontab 定时 git 拉取并执行 maven 打包
目录 一.引言 二.踩坑与实践 1.原始代码 2.mvn package 未执行与解决 [导入环境变量] 3.git pull 未执行与解决 [添加绝对路径] 三.总结 一.引言 git 任务部署在通道机,每天6点需要定时更新 jar 包并打包上线,所以需要在 linux 服务器上ÿ…...
408考研计算机之计算机组成与设计——知识点及其做题经验篇目3:指令的寻址方式
上篇文章我们讲到,指令的基本格式,一条指令通常包括操作码字段和地址码字段两部分: 操作码字段地址码字段并且我们还讲到根据操作数地址码的数目不同,可将指令分为零一二三四地址指令。感兴趣的小伙伴们可以看看小编的上一篇文章…...
前端包管理工具:npm,yarn、cnpm、npx、pnpm
包管理工具npm Node Package Manager,也就是Node包管理器; 但是目前已经不仅仅是Node包管理器了,在前端项目中我们也在使用它来管理依赖的包; 比如vue、vue-router、vuex、express、koa、react、react-dom、axios、babel、webpack…...
推荐系统 FM因式分解
reference:知乎 FM算法解析 LR算法没有二阶交叉 如果是id类特征,这里的x是0/1,raw的特征输入就是float,当然,在我的理解里,一般会把raw的特征进行分桶,还是映射到0/1特征,不然这个w…...
Maven基础入门
文章目录Maven简介Maven 工作模式1.仓库2.坐标Maven的基本使用1.常用命令2.生命周期依赖管理1.依赖配置2.依赖传递3.可选依赖4.排除依赖5.依赖范围IDEA配置MavenMaven简介 Apache Maven 是一个项目管理和构建工具,它基于项目对象模型(POM)的概念,通过一…...
传输层协议 TCP UDP
目录 协议前菜 端口号 编辑端口号范围划分 认识知名端口号(Well-Know Port Number) netstat pidof 传输层协议 UDP协议 UDP协议端格式 UDP的特点 面向数据报 UDP的缓冲区 UDP使用注意事项 基于UDP的应用层协议 TCP协议 TCP协议概念 TCP协议段格式 标志…...
一点就分享系列(实践篇6——上篇)【迟到补发】Yolo-High_level系列算法开源项目融入V8 旨在研究和兼容使用【持续更新】
一点就分享系列(实践篇5-补更篇)[迟到补发]—Yolo系列算法开源项目融入V8旨在研究和兼容使用[持续更新] 题外话 去年我一直复读机式强调High-level在工业界已经饱和的情况,目的是呼吁更多人看准自己,不管是数字孪生交叉领域&#…...
buu RSA 1 (Crypto 第一页)
题目描述: 两个文件,都用记事本打开,记住用记事本打开 pub.key: -----BEGIN PUBLIC KEY----- MDwwDQYJKoZIhvcNAQEBBQADKwAwKAIhAMAzLFxkrkcYL2wch21CM2kQVFpY97 /AvKr1rzQczdAgMBAAE -----END PUBLIC KEY-----flag.enc: A柪YJ^ 柛x秥?y…...
Python 二分查找:bisect库的使用
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…...
性能优化之HBase性能调优
HBase是Hadoop生态系统中的一个组件,是一个分布式、面向列存储的内存型开源数据库,可以支持数百万列(MySQL4张表在HBase中对应1个表,4个列)、超过10亿行的数据存储。可用作:冷热数据分离HBase适合作为冷数据…...
图像金字塔,原理、实现及应用
什么是图像金字塔 图像金字塔是对图像的一种多尺度表达,将各个尺度的图像按照分辨率从小到大,依次从上到下排列,就会形成类似金字塔的结构,因此称为图像金字塔。 常见的图像金字塔有两类,一种是高斯金字塔࿰…...
【英飞凌】TC3XX单片机型号解码:从命名规则看芯片选型
1. 英飞凌TC3XX单片机命名规则解析 第一次接触英飞凌TC3XX系列单片机时,我完全被那一长串型号搞懵了。TC387TP、TC377T、TC397QP...这些看似随机的字母数字组合,其实隐藏着丰富的芯片信息。经过几个项目的实战,我终于摸清了这套命名规则的规律…...
Crawl4AI浏览器配置文件创建与键盘交互处理终极指南:打造个性化爬虫身份
Crawl4AI浏览器配置文件创建与键盘交互处理终极指南:打造个性化爬虫身份 【免费下载链接】crawl4ai 🔥🕷️ Crawl4AI: Open-source LLM Friendly Web Crawler & Scrapper 项目地址: https://gitcode.com/GitHub_Trending/craw/crawl4ai…...
双模型对比:OpenClaw同时接入nanobot与云端API的性能测试
双模型对比:OpenClaw同时接入nanobot与云端API的性能测试 1. 测试背景与目标 最近在尝试用OpenClaw搭建一个能同时处理本地轻量任务和复杂云端任务的智能助手系统。核心需求是:日常简单查询走本地部署的轻量模型(nanobot)&#…...
基于MATLAB的VSG逆变器无源性分析与稳定性研究
基于MATLAB的VSG逆变器无源性分析与稳定性研究 摘要 随着分布式发电和微电网技术的快速发展,逆变器作为新能源并网的关键接口,其稳定性问题日益突出。虚拟同步发电机(VSG)控制技术通过模拟同步发电机的机电特性,为逆变器提供惯性和阻尼支撑,成为提升系统稳定性的重要手…...
Vue3 的 JSX 函数组件,每次更新都会重新运行吗?
我用最直白、最无歧义、100%准确的方式,只回答你这一个问题: ✅ 最终答案(背它) 在 Vue3 中: 你写的 JSX 函数组件,整个函数 只会在组件初始化时运行 1 次! 更新时,整个函数 不会重新…...
【2026最新】AI产品经理学习路径全解析:顺序错了,努力全白费!
导语 为什么90%的人学不好AI产品经理? 在2025年这个AI爆发的时代,AI产品经理已成为最炙手可热的职业之一。然而,许多“转行者”却在学习过程中频频踩坑: 学了3个月Python却连模型调参都不会?看懂了Prompt Engineeri…...
CDN图片服务与动态参数优化
前言在现代Web应用中,图片已经不再是简单的静态资源,而是需要根据设备、网络、浏览器能力动态优化的核心内容。CDN图片服务提供了强大的动态处理能力,结合前端的智能参数拼接,可以实现图片加载的极致优化。一个典型的电商场景&…...
微信聊天记录备份全攻略:从环境搭建到数据安全实战指南
微信聊天记录备份全攻略:从环境搭建到数据安全实战指南 【免费下载链接】WechatBakTool 基于C#的微信PC版聊天记录备份工具,提供图形界面,解密微信数据库并导出聊天记录。 项目地址: https://gitcode.com/gh_mirrors/we/WechatBakTool …...
玩转AI!用FastAPI+RAG轻松构建智能文档问答系统,代码、文档全公开!
在企业数字化转型的浪潮中,我们常遇到这样一个痛点:海量的业务文档、研究报告、技术手册堆积如山,当需要从中寻找某个特定答案时,员工往往要花费数小时甚至数天进行翻阅。这不仅是效率的浪费,更是知识资产沉睡的体现**…...
C++ 内联函数的性能影响
C内联函数的性能影响探析 在追求高效代码的C开发中,内联函数因其消除函数调用开销的特性而备受关注。通过将函数体直接嵌入调用点,内联函数能显著提升程序性能,尤其在频繁调用的场景下。过度或不恰当的内联也可能导致代码膨胀或缓存命中率下…...
