generator 执行机制分析
本文以下面代码为例,源码分析 generator 执行机制相关的案例源码,版本为 V8 7.7.1。源码
首先,案例当 let iterator = test() 开始执行时,源码V8 调用 Runtime_CreateJSGeneratorObject,案例卷轴滚动抽奖源码创建一个生成器对象。源码此函数逻辑是案例创建 JSGeneratorObject 的实例,设置相关属性后返回生成器对象 generator。源码此时生成器对象 generator 被保存在累加器中。案例在字节码 SuspendGenerator 的源码处理函数中,该函数暂停当前函数的案例执行,并多次调用 StoreObjectField 来保存生成器函数当前运行的源码状态。最后返回累加器中的案例值,即生成器对象 generator。源码墨香源码属性因此,生成器函数在执行到“第一次暂停”的位置时,处于暂停状态。
在有了生成器对象后,可以调用其 next 方法让生成器函数继续执行。当 JavaScript 代码继续执行 iterator.next() 时,生成器对象的 next 方法被调用。生成器函数恢复执行需要 CPU 的寄存器操作。在笔者的 Mac 下,调用链路为GeneratorBuiltinsAssembler::GeneratorPrototypeResume-> CodeFactory::ResumeGenerator-> Builtins::Generate_ResumeGeneratorTrampoline。之后,调用 X 汇编,使生成器函数在暂停处恢复执行。此过程通过 Builtins::Generate_ResumeGeneratorTrampoline 函数完成,java源码科技函数通过将未来要返回的地址压栈,并跳转到生成器函数 test 暂停的地方,继续执行。
生成器函数从暂停处继续执行后,字节码一行一行往下执行,直到遇到下一个 SuspendGenerator,即“第二次暂停”。这是由 yield 带来的。yield 被 V8 编译成 SuspendGenerator 和 ResumeGenerator 两条字节码,分别表示保存状态暂停和恢复状态继续执行。
async/await 与 generator 的关系分析:async/await 和 generator 都有暂停当前函数执行并从暂停处恢复执行的能力。await 和 yield 对应的字节码都是 SuspendGenerator 和 ResumeGenerator。生成器函数暂停时,需要调用生成器对象的csgo游戏源码 next 方法来从暂停处恢复执行。async 函数依赖 Promise 和 microtask,当 V8 在执行 microtask 队列时,已经暂停的 async 函数恢复执行。async 函数通过 Generator 和 Promise 获得保存状态暂停和恢复状态执行的能力,以及自我驱动向下继续执行的能力,从而避免调用 next 方法。
JavaScript 中的函数类型较为复杂。虽然在 JavaScript 中,1 和 0.1 都是 number,但在 V8 中它们是不同的类型,内存表示和 CPU 运算指令也有所不同。因此,即使在 JavaScript 中 typeof 都返回 function 的 test、test1、彩虹6.1.5源码test2,在 V8 中是不同的类型。日常开发中,当一个组件/方法需要一个函数做为参数时,需要确保正确传递 ES6 之前的函数、async 函数或生成器函数,以避免运行时错误。
原生 generator 与 babel 转译的区别:在日常开发中,生成器/async 函数会被 babel 转译成类似下面的代码。这段代码中,test 函数被多次调用,但由于闭包保存了函数执行的状态,每次调用 test 都是新的 test。这种实现非常巧妙,但与 V8 中生成器函数的原理有较大区别。Babel 转译的代码无法生成字节码 SuspendGenerator 和 ResumeGenerator。
总结:生成器函数被调用时,开始执行并返回生成器对象后暂停。调用 iterator.next() 后,生成器函数从第一次暂停的位置恢复执行,遇到 yield(SuspendGenerator)后第二次暂停。
flash as2.0编程参考书
已经不建议你搞FLASH代码了.而且讲实话,FLASH是盗版带起的,当初该公司根本就国内,也没提供正经的教程,都是爱好者瞎写的.到adobe时代被收购了才进入国内搞了个AS3才有正式教程,但是AS2,AS3在ADOBE自己看来都看不下去,所以才后边直接弱化掉.到年把FLASH改名成ANIMATE后主要用H5输出,而不是AS,而年也废除了flash player,到最后连打包工具AIR都直接卖了.你何必学这个呢,要编程就好好的去学JS或C语言,FLASH在业内只看作个软件内置脚本而且还是闭源无法转移到其他编程工具里的代码,象JS和C还有P你在任何软件里写复制到其他开发软件里都可以直接用.这个就是基础语言,通用语言.所以你要搞建议看这些真正的编程语言的书.
ActionScript是原Macromedia公司(后并入Adobe)为其Flash产品开发的一种基于ECMAScript的面向对象编程语言。你可以看成AS算是JS的部分功能打包,然后跑在一个名叫FLASH PLAYER虚拟机里的脚本。实际公认编程语言是,Java,C,Python,JavaScript等。
其他依存编辑器内的语言,都只叫脚本。
实际FLASH整个软件都是,Java和JavaScript做出来的。而年改叫ANIMATE后,采用的语言是C和JavaScript做出的软件。年ADOBE放弃了原FLASH所有As和代码相关的模块。
AS已经被取消再开发,开发小组已经解散,AIR已经卖出,新导入的HTML5格式的编写也是CreateJS的一个动画引擎。等于adobe除了动画制作的相关,其他代码全已抛弃。
评价
编程人员们说Macromedia ActionScript 2.0编译器有点慢,常常花好几分钟才编译个类别,然而开放源码编译器MTASC可以利用;它快多了。
ActionScript2.0 非常宽大的语法常常让编程人员们皱眉,因为它常常让不干净代码难以阅读。ActionScript 3.0的类型绑定改善了此缺点
在Flash里使用许多矢量图形可能拖慢运行许多应用程序的机器的性能,因为Flash每帧每帧重画每个向量图。Flash 8引进了cacheAsBitmap变量,它暂时把向量图转换到位图,这种做法帮助降低了延滞。
Flash的ActionScript VM倾向在触发内部的暂停处理前就非常快达到它的运算极限,特别在麦金塔版的Flash播放器上更严重。例如,简单从1算到会威胁某些用户Flash播放器的能力。
在Flash 8里许多人不喜欢引入(import)某些类直到要用到那些类别前最后一刻。不幸的是,ActionScript 3.0相当倚赖引入类别,没有导入撰写脚本(scripting)实际上不太可能。
.swf文件格式容易被反编译,使它非常难以保持原码的隐密性。在日后的发展由于发布后为原生语言结构此问题已不复存在,加上app的平台有自己的加密方式更加的解决所有语言都有的这难题。
在播放方面,在年起,FLASH player每年以几十个安全漏洞增长,到年已达百个漏洞并且无法修复,常见为挖矿软件,病毒,木马,攻击,最终所有系统均不再支持FLASH PLAYER,主流浏览器则禁止其运行。
2024-12-29 00:08
2024-12-28 23:38
2024-12-28 23:24
2024-12-28 22:53
2024-12-28 22:10