首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JS是如何计算 1+1=2 的?

浏览器说:“我不知道啊,是v8告诉我的。” “v8是谁?是男是女?” “非男非女,亦男亦女。v8是谷歌研发的JavaScript引擎,你发给我的JS代码,都是由他执行的。”...这一句是将寄存器eax设置为1 __ add(eax, 1) //这一句将寄存器的值加1 __ ret(eax) //这里返回寄存值的值 (以上只是示例,伪代码不要当真) 上面是C++代码,在内存里生成机器码大概长这个样子...B8 01 00 00 00'这是二进制机器码的16进制展示,人类使用16进制更方便阅读,但我和CPU交流都是以010110010这种二进制方式。” 这时CPU听到有人叫他的名字,按耐不住了。...v8,那后面的'mov eax,1'是什么?我怎么从来没见你提过?” v8道:“'mov eax,1'是机器码注释,是给人类大哥看的,我给你看的都是二进制字节码,是010110010这种。...在Java版JS解释器rhino中,js脚本不是被编译为Java字节码执行的吗?” 作者觉得讨论有点跑偏了,道:“言归正传。

1.9K20

JavaScript基础——JS编译器你都做了啥?

.png 由于谷歌的V8编译器的出现,由于性能良好吸引了相当的注目,正式由于V8的出现,我们目前的前端才能大放光彩,百花齐放,V8引擎用C++进行编写, 作为一个 JavaScript 引擎,最初是服役于...V8 有数以百计的字节码。比如 Add 或 TypeOf 这样的操作符,或者像 LdaNamedProperty 这样的属性加载符,还有很多类似的字节码。...V8还有一些非常特殊的字节码,如 CreateObjectLiteral 或 SuspendGenerator。...在早期的V8引擎里,在多数浏览器都是基于字节码的,V8引擎偏偏跳过这一步,直接将jS编译成机器码,之所以这么做,就是节省了时间提高效率,但是后来发现,太占用内存了。...timeTaken = end.valueOf() - start.valueOf(); console.log("Took " + timeTaken + "ms"); 如果没有内联属性的特性,你能想想运行的有多慢吗

2.7K190
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    JavaScript 究竟是如何工作的?

    但是微处理器能理解什么语言?它们无法理解 Java,Python 等语言,而只懂机器码。...还有很多,如果你想知道 Internet Explorer 背后的引擎,查看这个维基百科页面. 2.1 ECMAScript 面对这么多的引擎,你可能会问:我可以开发自己的引擎吗?...谷歌想要吸引更多的用户使用这项服务,从而进行广告销售并牟利。基于这个原因,这项服务必须快速且稳定。...编译器在语义分析中验证语言元素和关键词的正确用法,而 ASTs 在这个过程中扮演着重要的角色。之后,ASTs 被用于生成实际的字节码或者机器码。 ? 3.3 引擎的核心 ?...随着分析器和编译器不断地更改字节码,JavaScript 的执行性能逐渐提高。 3.4 更多历史 在V8 的 5.9 版本推出之前,它使用两个优化编译器和一个基线编译器。

    46420

    「译」JavaScript 究竟是如何工作的?(第一部分)

    但是微处理器能理解什么语言?它们无法理解 Java,Python 等语言,而只懂机器码。...还有很多,如果你想知道 Internet Explorer 背后的引擎,查看这个维基百科页面. 2.1 ECMAScript 面对这么多的引擎,你可能会问:我可以开发自己的引擎吗?...谷歌想要吸引更多的用户使用这项服务,从而进行广告销售并牟利。基于这个原因,这项服务必须快速且稳定。...image.png 编译器在语义分析中验证语言元素和关键词的正确用法,而 ASTs 在这个过程中扮演着重要的角色。之后,ASTs 被用于生成实际的字节码或者机器码。...随着分析器和编译器不断地更改字节码,JavaScript 的执行性能逐渐提高。 3.4 更多历史 在V8 的 5.9 版本推出之前,它使用两个优化编译器和一个基线编译器。

    51720

    第 1 课:计算机是如何计算 1+1=2 的?

    在计算机世界,程序员编编代码,回车一按,「运行」,字节码就永无停歇地跳动了起来了。 我们日常生活中使用手机订餐、看视频、刷微博,使用电脑打游戏、剪辑视频等,底层都是程序员编写的字节在跳动。...笔者想,浏览器应该知道答案,因为这个结果是它告诉我们的。 于是笔者问谷歌浏览器,浏览器,请你告诉我,你是怎么知道 1+1 等于 2 的? 浏览器答一脸懵懂,我不知道啊,是 V8 告诉我的。...笔者再问道,V8 又是谁,这是台球馆里新的球名吗? 浏览器道,V8 是谷歌研发的 JavaScript 引擎,你发给我的 JS 代码,都是由它执行的。...V8 解释道:「mov eax 1」是机器码注释,是给人类大哥看的,我给你看的都是二进制字节码,是 010110010 这种的。像 mov 它只是诸如 1010 这种汇编指令的编程语言代名词。...在 Java 版 JS 解释器 rhino 中,JS 脚本不是被编译为 Java 字节码执行的吗? 课时已经过去一半了,笔者感觉讨论主题有点偏离主题了,道,言归正传。

    1.9K20

    重学JS-1.3-知识点:V8引擎

    (IE) 其中最流行的是谷歌的V8引擎,除了Chrome等浏览器,Node.js、Electron(桌面应用框架)也是用的V8引擎。...除了V8引擎,Java虚拟机、PHP 8也用到了JIT。 什么是字节码?...Ignition会先将JavaScript转换为字节码(Bytecode),而不是机器能直接执行的机器码(Machine Code)。为什么需要这一步呢? 首先了解什么是字节码?...上图中,红色的线,是“去优化(Deoptimize)”的过程,如果TurboFan生成的优化机器码,对需要执行的代码不适用,会把优化的机器码,重新转换成字节码来执行。 看下面这个例子。...node --print-code --print-opt-code test.js TurboFan基于类型对字节码进行优化和去优化的例子,可以看下这个视频:Franziska Hinkelmann:

    68810

    极速优化:十倍提升JS代码运行效率的技巧

    —— v8 编译器管线: parser 将源码编译为 AST,并在 AST 基础上编译为「字节码 bytecode」 ignition 是 v8 的字节码解释器,可以运行字节码,并在运行过程中持续收集...代码的执行层次: 从源码到字节码再到机器码其实就是不断编译的过程 世界上能执行代码的地方有很多,数轴上的两个极端: 左边是抽象程度最高的人脑,右边是抽象程度最低的 CPU: 上图中三个实体以不同的角度理解下面这样的代码...Ignition 与字节码 ignition 负责解释执行 V8 引入的中间层次字节码,上接人脑里的 js 规范,下承底层 CPU 机器指令 5....TurboFan 与机器码 TurboFan 可以将字节码编译为最快的机器码,让裸机直接运行,达到最快的执行速度。...「反优化」让 ignition 走字节码解释执行。

    80050

    代码10倍提速!吃透底层架构就是如此简单

    pipeline js 代码从源码到执行 —— v8 编译器管线: parser 将源码编译为 AST,并在 AST 基础上编译为「字节码 bytecode」 ignition 是 v8 的字节码解释器.../ TurboFan 与机器码 2.1 代码的执行层次: 从源码到字节码再到机器码其实就是不断编译的过程 世界上能执行代码的地方有很多,数轴上的两个极端:左边是抽象程度最高的人脑,右边是抽象程度最低的...总之为了充分表达 js 动态特性以及方便优化为 CPU 能直接裸跑的汇编,v8 引入了 bytecode 这个层次,它比 AST 更接近物理机,因为它没有层次嵌套,是一种基于寄存器的指令集。...2.4 Ignition 与字节码 ignition 负责解释执行 V8 引入的中间层次字节码,上接人脑里的 js 规范,下承底层 CPU 机器指令。...或许你会问: 为什么要这样,这样做能帮助提升性能么?别急,后文会扣回来。 什么时候用 in-object 什么时候用 *properties 存储,两者做的是同一件事,不会冲突吗?

    84922

    深入理解 JavaScript 引擎

    食堂老板娘:老板,Chrome V8 引擎工作原理面试会问吗?...食堂老板娘:好好好,别罗嗦了,快开始吧~ 宏观视角看 V8 V8 是我们前端届的网红,它用 C++ 编写,是谷歌开源的高性能 JavaScript 和 WebAssembly 引擎,主要用在 Chrome...食堂老板娘:拿出小本本记好 V8 执行 JavaScript 代码的核心流程分为以下两个阶段: 编译 执行 编译阶段指 V8 将 JavaScript 转换为字节码或者二进制机器码,执行阶段指解释器解释执行字节码...引入字节码是一种工程上的权衡,从图中可以看出,仅仅是一个几 KB 的文件,生成的机器码就已经占用了大量的内存空间。 相比机器码,字节码不仅占用内存少,而且生成字节码的时间很快,提升了启动速度。...况且,字节码与特定类型的机器码无关,通过解释器将字节码转换为机器码后才可以执行,这样也使得 V8 更加方便的移植到不同的 CPU 架构。

    1K21

    V8 执行 JavaScript 的过程

    前文提到 CPU 只能识别机器码,对字节码是识别不了的,这里就衍生出一个问题,如果 CPU 识别不了字节码,那为什么还要在中间插一步来耗费资源转字节码呢?效率不是很更低吗?...拿之前版本的 V8 引擎执行 JS 来说,是没有转字节码这一步骤的,直接从 AST 转成机器码,这个过程称为编译过程,所以每次拿到 JS 文件的时候,首先都会编译,而这个过程还是比较浪费时间的,这是一件比较头疼的事情...引入字节码 好吧,玩不过开发者了,那 V8 团队只好换个思路,就引入字节码吧。...解释在将 AST 转为字节码之后,会在执行的时候将字节码转成机器码,这个执行过程肯定是比直接执行机器码要慢的,所以在执行方面,速度上会比较慢,但是 JS 源码通过解析器转 AST,然后再通过解释器转字节码...接着热代码继续说,当存在热代码的时候,V8 会借着 TurboFan 将为热代码的字节码转为机器码并缓存下来,这样一来,当再次调用热代码时,就不在需要将字节码转机器码,当然热代码相对来说还是少部分的,所以缓存也并不会占用太大内存

    98630

    JS代码是怎么被执行的

    JS代码是怎么被执行的 我们看到的JS都是在浏览器中或者在Node环境中运行的对吧,那不论是浏览器还是Node,负责编译并且解释执行JS代码的都是一个叫做V8的东西,所以这个问题其实就是V8引擎是怎么去运行...JavaScript的,而js和C/C++/Go/Rust这类静态编译的语言不同,这些静态编译的语言通过编译器把代码变成机器码,然后在机器上运行,js呢在编译后会生成字节码,然后在v8的虚拟机上运行字节码...V8 的 Ignition && TurboFan 模块 Ignition:interpreter,即解释器,负责将AST转换为字节码(Bytecode)并解释执行。...一开始V8并没有Bytecode这个中间过程,而是直接将AST转换成机器码,但是由于内存占用问题,虽然机器码效率最高,但机器码占用的内存空间远超过字节码,需要消耗大量内存来放转换后的字节码,所以V8团队选择了时间换空间的策略...那么Ignition作为解释器,可以完成AST到字节码的转换过程并且担任解释执行的工作,为什么V8还需要TurboFan这个编译器呢,我们不是说Javascript是一种解释型语言吗?

    3.1K40

    从【字节码缓存】再进一步看【HTTP 缓存】,面试官:“这么细吗?”

    字节码缓存 什么是字节码缓存?...惰性编译只缓存最外层代码; 于是乎,后来 V8 也引进了字节码架构: js 源代码 => AST 抽象语法树 => 字节码 => 二进制文件 引入字节码的优势在于:1. 内存占用小;2....实际上,对于 V8 编译后的字节码,Chrome 有两级缓存策略: Isolate 内存缓存; 完整序列化的硬盘缓存; 1....不能跨进程; 当 V8 编译脚本时,编译后的脚本以源码为键被存储在一个 hashtable 中(在 V8 的堆中),当 Chrome 要求 V8 编译其他脚本的时候,V8 首先检查脚本的源码是否能匹配...根据对【字节码缓存】以及 【两级缓存策略】的认知,我们将有更清晰的思路来利用浏览器缓存机制提升网站的加载性能! 还记得面试中常问的这张关于强缓存、协商缓存流程图吗?

    38920

    浏览器内核

    V8引擎(轻量) V8引擎是一个JavaScript引擎实现,最初由一些语言方面专家设计,后被谷歌收购,随后谷歌对其进行了开源。...V8使用C++开发,在运行JavaScript之前,相比其它的JavaScript的引擎转换成字节码或解释执行,V8将其编译成原生机器码(IA-32, x86-64, ARM, or MIPS CPUs...,直接将tokens转换成AST树结构 字节码生成 parser就是直接将tokens转换成AST树结构 preParse称之为预解析,为什么需要预解析呢?...关于V8的东西很多,也有很多非常绝妙的设计,更多V8相关的戳这里,一步步解锁吧!...希望能和大家一起努力营造一个良好的学习氛围,为了个人和家庭、为了我国的互联网物联网技术、数字化转型、数字经济发展做一点点贡献。数风流人物还看中国、看今朝、看你我。

    81210

    day039: 描述一下 V8 执行一段JS代码的过程?

    生成字节码 开头就已经提到过了,生成 AST 之后,直接通过 V8 的解释器(也叫Ignition)来生成字节码。...那 V8 为什么要使用字节码,字节码到底是个什么东西? 子节码是介于AST 和 机器码之间的一种代码,但是与特定类型的机器码无关,字节码需要通过解释器将其转换为机器码然后执行。...在执行字节码的过程中,如果发现某一部分代码重复出现,那么 V8 将它记做热点代码(HotSpot),然后将这么代码编译成机器码保存起来,这个用来编译的工具就是V8的编译器(也叫做TurboFan) ,...其实当你听到有人说 JS 就是一门解释器语言的时候,其实这个说法是有问题的。因为字节码不仅配合了解释器,而且还和编译器打交道,所以 JS 并不是完全的解释型语言。...这就是 V8 中执行一段JS代码的整个过程,梳理一下: 首先通过词法分析和语法分析生成 AST 将 AST 转换为字节码 由解释器逐行执行字节码,遇到热点代码启动编译器进行编译,生成对应的机器码, 以优化执行效率

    99121

    🤔 移动端 JS 引擎哪家强?美国硅谷找......

    V8 还有一个有意思的特性很少人提及,那就是——堆快照(Heap snapshots),这个是 V8 在 2015[7] 年就支持的功能,但是社区里很少有人讨论它。 堆快照是什么原理呢?...后来自己编译了一下才发现,QuickJS 的作用机制和 Hermes 还不太一样:qjsc 生成字节码的 -e 和 -c 选项,都是先把 js 文件生成一份字节码,然后拼到一个 .c 文件里,大概长下面的这个样子...: #include const uint32_t qjsc_hello_size = 87; // JS 文件编译生成的字节码都在这个数组里 const...从字节码这个设计点来看,QuickJS 和 Hermes 的定位还是不太一样的。...而生,生成的字节码一开始就考虑到分发功能(热更新就是一个应用场景),支持字节码的直接加载运行,不需要再编译一次。

    4.3K30

    V8、JSCore、Hermes、QuickJS,hybrid开发JS引擎怎么选

    V8 还有一个有意思的特性很少人提及,那就是——堆快照(Heap snapshots),这个是 V8 在 2015[7] 年就支持的功能,但是社区里很少有人讨论它。 堆快照是什么原理呢?...后来自己编译了一下才发现,QuickJS 的作用机制和 Hermes 还不太一样:qjsc 生成字节码的 -e 和 -c 选项,都是先把 js 文件生成一份字节码,然后拼到一个 .c 文件里,大概长下面的这个样子...: #include const uint32_t qjsc_hello_size = 87; // JS 文件编译生成的字节码都在这个数组里 const...从字节码这个设计点来看,QuickJS 和 Hermes 的定位还是不太一样的。...而生,生成的字节码一开始就考虑到分发功能(热更新就是一个应用场景),支持字节码的直接加载运行,不需要再编译一次。

    20K148

    前端面试题之性能优化大杂烩

    js开销缩短解析时间开销:加载-》解析和编译-》执行js的解析和编译,执行要花很长时间(谷歌开发工具中的performance中可以查看。选中main主线程中的某一段。)...js代码成抽象语法树-》字节码-》机器码 编译过程会进行优化 运行时可能会发生反优化v8内部优化脚本流:边下载边解析字节码缓存:常用的字节码会存起来(这个文件用到其他的文件也用到的参数)函数懒解析:...先解析用到的对象优化(迎合v8进行优化)保证对象初始化顺序一致(对象初始化时v8会生成隐藏属性以便后续复用并且是按照顺序排序的)不要直接赋值对象新属性(追加的属性需要通过描述数组间接查找)使用数组代替类数组...js内存,避免造成内存泄漏通过变量是否能被访问到来判断内存是否释放。...(当a对象解决:避免意外的全局变量;避免反复运行引发的闭包;避免脱离的dom元素没有被回收(所以react有ref这个api)。

    85530

    最近学到的前后端分离知识

    Node.js不是属于前端的吗? 二、初识Node.js 在遇到这个事情之前,其实我在知乎已经看了一个帖子,话题名是这个《毕设答辩,老师说node不可能写后台怎么办?》...下面我来解释一下 2.1 V8引擎是什么?...V8引擎:为了提高解析的性能,引入了一些“后端”的技术(不过他本来就由C++编写的)。它是先将JavaScript源代码转成抽象语法树,然后再将抽象语法树生成字节码。...示意图 总结:V8引擎是JavaScript引擎的一种,这个引擎由C++来编写的,性能很不错。...zhuanlan.zhihu.com/p/24357770 3.1 方式一(Nginx+Server) OK,现在假设我们用前端(vue/angular/react)开发完,开发环境下将JavaScript编译/打包完,那我们能得到纯静态的文件

    1.1K20

    Chrome 浏览器开源背后的一盘大棋

    v8层,看起来功能很单一,只是实现一下js嘛,但里面包括字节码解析器,JIT 编译器,多代GC,inspector (调试支持),内存和 CPU 的 profiler(性能统计),WebAssembly...怎么能处理好这些字符和语言,并配合几千页的html、css排版规则正确显示出来……这是个极度烧脑的事情。 我们再从排版这个大泥坑里跳出来看看外面别的东西。这时候你会发现……外面的泥坑好像更大。...对,其实chrome单词的原意就是这个。 Clound_Print,谷歌云打印相关,提供谷歌浏览器页面预览打印清单。...假如每个人员年薪是100w 人民币,持续投入十年,这个支出就是几十亿,这还不算周边的测试、产品、UI。 最关键的是,就算微软愿意投入十亿,能保证做到chromium相同的功能吗?...这些功能对于谷歌作为一个浏览器来说,当然是必要的。然而回到本问题,“浏览器内核”真的需要这么复杂吗? 浏览器需要这么复杂,这是真的;然而作为一个浏览器内核提供给一些sdk给别人用,也需要这么复杂吗?

    2.1K10

    V8 Ignition:JS 引擎与字节码的不解之缘(转载)

    所以 v8 退而求其次,只编译最外层的 js 代码,也就是下图这个例子里面绿色的部分。那么内部的代码(如下图中的黄色、红色的部分)是什么时候编译的呢?v8 推迟到第一次被调用的时候再编译。...这便是 v8 引入字节码的主要动机。而这样实现之后其实顺便又带来了两个好处,笔者认为可以视作 v8 引入字节码的次要动机,亦即:更快的启动速度和更好的 v8 代码重构。...v8 自身的重构方面,有了字节码,v8 可以朝着简化的架构方向发展,消除 Cranshaft 这个旧的编译器,并让新的 Turbofan 直接从字节码来优化代码,并当需要进行反优化的时候直接反优化到字节码...这次引入字节码实则是做了工程上的恰当取舍,将损失掉的内存找回来,更加符合如今移动和嵌入式设备为主的应用场景;以时间换空间,让 v8 能更好的服务于低内存的设备。...如今 V8 也回到了字节码的怀抱,不禁令人感叹 JS 引擎与字节码真是有着不解之缘!

    1.2K20
    领券