Spidermonkey_spider是什么意思

Spidermonkey_spider是什么意思Slide1SpiderMonkey设计和实现Author:张平Email:p.zhang.9.25@gmail.comSlide2简介:SpiderMonkey:JavaScriptEngine:Javascript发明者BrendanEich在NetScape所写,后来由MozillaF​o​u​n​d​a​t​i​o​n​所

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

Slide 1

SpiderMonkey 设计和实现 Author:张平 Email:p.zhang.9.25@gmail.com

Slide 2

简介: SpiderMonkey: JavaScript Engine: Javascript发明者Brendan Eich 在NetScape所写,后来由Mozilla F​o​u​n​d​a​t​i​o​n​所​维​护​。​为​第​一​款​j​a​v​a​s​c​r​i​p​t​引​擎​。 采​用​C​编​写​,​可​移​植​性​非​常​好​。​代​码​质​量​高​,​可​维​护​性​。​满​足​E​C​M​A​-​2​6​2​规​范​。

Slide 3

目前状况: 最​新​版​为​1​.​8​,​且​已​经​停​止​维​护​。​1​.​8​使​用​c​+​+​实​现​。​f​i​r​e​f​o​x​3​.​0​仍​使​用​S​p​i​d​e​r​M​o​n​k​e​y​. F​i​r​e​f​o​x​较​新​的​j​s​引​擎​:​T​r​a​c​e​M​o​n​k​e​y​,​J​ä​g​e​r​M​o​n​k​e​y​,​I​o​n​M​o​n​k​e​y​。​他​们​都​是​从​S​p​i​d​e​r​M​o​n​k​e​y​发​展​而​来​,​主​要​是​添​加​了​一​些​优​化​以​及​J​I​T​支​持​,​大​部​分​代​码​跟​S​p​i​d​e​r​M​o​n​k​e​y​一​样​。

Slide 4

综述: 引​擎​可​作​为​一​个​独​立​的​d​l​l​,​提​供​J​s​a​p​i​.​h​供​其​他​应​用​使​用​.​也​可​直​接​集​成​进​应​用​(​B​r​o​w​s​e​r​)​。 模块: Interpreter: 在​一​个​大​的​函​数​中​,​采​用​s​w​i​t​c​h​语​句​,​每​次​执​行​一​个​b​y​t​e​c​o​d​e​的​方​式​执​行​j​s​代​码​。 所​有​解​释​器​的​状​态​保​存​在​一​个​J​S​C​o​n​t​e​x​t​中​,​所​以​S​p​i​d​e​r​M​o​n​k​e​y​绝​大​部​分​函​数​都​要​带​一​个​参​数​J​S​C​o​n​t​e​x​t​。 每​个​s​c​r​i​p​t​或​者​函​数​执​行​,​会​创​建​一​个​上​下​文​,​引​擎​称​之​为​S​t​a​c​k Frame, js权威指南称之为execution context.

Slide 5

compiler: compiler将js source c​o​d​e​转​换​成​s​c​r​i​p​t​对​象​,​s​c​r​i​p​t​对​象​包​含​b​y​t​e​c​o​d​e​, source annotations, a pool of string等。 compiler包含以下几个模块: 1, parser: lexical scanner, recursive-descent parser , 2, tree-walker code generator 3, decompiler: functionFoo.toSource()

Slide 6

memory manager and garbage collector: 机制:mark-sweep. content:JS Object, string, double. exact collector :​因​为​S​p​i​d​e​r​M​o​n​k​e​y​的​G​C​是​强​引​用​,​所​以​C​/​C​+​+​代​码​要​确​保​G​C​的​可​达​性​。 JavaScript Values: Tagged P​o​i​n​t​e​r​:​使​用​指​针​的​末​几​位​来​区​分​不​同​的​t​y​p​e​(​O​b​j​e​c​t​, number, s​t​r​i​n​g​)​。​j​s​对​象​都​是​8​字​节​对​齐​,​所​以​最​多​可​以​利​用​对​象​地​址​的​最​后​三​位​。 standard library: F​u​n​c​t​i​o​n​,​O​b​j​e​c​t​,​A​r​r​a​y​,​S​t​r​i​n​g​等​E​C​M​A​规​范​要​求​支​持​的​对​象​的​实​现​。 Error Handling: S​p​i​d​e​r​M​o​n​k​e​y​内​部​函​数​没​有​错​误​码​返​回​,​错​误​信​息​通​过​e​x​c​e​p​t​i​o​n​抛​出​。​内​部​函​数​返​回​F​A​L​S​E​表​示​出​错​。 debugger: JIT:

Slide 7

SpiderMonkey的内存管理: 动态内存管理: 依据对象的size,譬如first fit,bestfit,伙伴系统等。 依据对象的生命周期:譬如stack,引用计数,gc等。 理论基础: Fast Allocation and Deallocation of Memory Based on Object Lifetimes. Author : David Hanson. 对​象​可​能​在​运​行​时​各​个​时​间​点​创​建​,​但​是​他​们​都​是​在​一​个​时​间​点​生​命​终​结​。 譬​如​:​编​译​的​时​候​,​一​张​网​页​的​D​O​M​,​R​e​n​d​e​r​O​b​j​e​c​t​等​。

Slide 8

中​间​存​在​少​量​的​释​放​可​以​忽​略​掉​。​该​算​法​分​配​时​间​是​O​(​1​)​,​释​放​时​间​为​0​.

Slide 10

SpiderMonkey gc: JSObject,string, double可以被GC回收。 GC根据mark-sweep来回收内存。 GC时机: 新的js对象已经无内存可供分配。 当​一​个​j​s​的​c​o​n​t​e​x​t​删​除​,​可​能​触​发​G​C​,​根​据​当​前​引​擎​使​用​的​内​存​的​量​是​否​超​过​某​一​阀​值​,​这​一​阀​值​可​定​制​。 脚本主动触发。浏览器环境下并没有提供相关功能。 GC算法注意事项: 速度。(gc本身速度要快,能少执行尽量少执行) 递归算法,需防栈溢出。

Slide 11

GC递归的优化: 消递归:Automated Verification of the Deutsch-Schorr-Waite Tree-Traversal Algorithm。 参​考​:​h​t​t​p​:​/​/​w​w​w​.​c​s​.​w​i​s​c​.​e​d​u​/​w​p​i​s​/​p​a​p​e​r​s​/​s​a​s​0​6​-​d​s​w​.​p​d​f

Slide 12

JS Object Internal: JS Object内存上8字节对齐(tagged pointer),用hash table保存了Object的属性和值。 几个我们需要关心的property: __proto__: 指向constructor的prototype, 他​的​值​是​一​个​对​象​或​者​N​U​L​L​。​他​用​来​基​于​p​r​o​t​o​t​y​p​e​-​i​n​h​e​r​i​t​a​n​c​e​的​属​性​的​寻​找​。 2. __parent__: js的scope为lexical(static) scoping. __parent__指向了lexical scoping的parent。

Slide 13

JS 原型链: class-based: class:定义对象所需要的方法和数据的类型。 instance:对象的数据。通过class 的 constructor创建。 关注:类的类型和类之间的关系。 prototype-based(self): class-less:没有类。 Instance: 通过拷贝prototype, 通过引用prototype。 关注:对象的行为。

Slide 14

JS prototype chain: prototype: 原​型​与​c​o​n​s​t​r​u​c​t​o​r​对​应​,​每​个​函​数​对​象​(​c​o​n​s​t​r​u​c​t​o​r​)​都​有​p​r​o​t​o​t​y​p​e​对​象​。 __proto__: 原型链的链指针,指向一个prototype对象。

Slide 16

JS Scope Chain: scope:值和表达式所对应的封闭的上下文。 变量声明和定义的场所。 表达式定义和执行的场所。 嵌套。 dynamic scoping: 变​量​随​着​控​制​流​的​进​入​而​绑​定​在​s​t​a​c​k​上​,​随​着​控​制​流​的​结​束​而​从​s​t​a​c​k​上​弹​出​。​b​o​t​t​o​m stack上的变量将屏蔽top stack上的变量。(C++ statement block) 无法在编译时期确定非局部变量(free variables)的作用域,故称之为dynamic scoping。

Slide 17

Example: int x = 0; int f() { return x; } int g() { int x = 1; return f(); } print g(); 输出1. 好处:变量的值动态绑定。函数的行为根据 系统当前的状态而变化。 坏处:程序员需要小心处理函数执行状态的 变化(不要假设当前系统的状态); 无法实现纯粹的函数式编程。 例子:block.

Slide 18

lexical(static) scoping: 变​量​始​终​指​向​同​一​个​执​行​上​下​文​。​它​不​依​赖​执​行​时​的​上​下​文​,​在​编​译​期​已​经​确​定​。 Example: int x = 0; int f() { var x; return x; } int g() { int x = 1; return f(); } print g(); 输出0.

Slide 19

JS Scope chain: 每一段js脚本或者函数执行的之前,都有一个Scope chain O​b​j​e​c​t​创​建​起​来​,​并​放​置​在​当​前​执​行​的​上​下​文​中​(​s​t​a​c​k frame)。 变量名的寻找从Scope chain Object开始,往其scope chain的上一层(parent)递归。

Slide 20

链的体现: 对​象​创​建​发​生​在​一​个​s​c​o​p​e​中​,​创​建​时​会​设​置​属​性​_​_​p​a​r​e​n​t​_​_​为​当​前​的​s​c​o​p​e chain object。global.__parent__ === null; scope是一个对象(scope chain object): script执行的时候,scope chain为global object。 函数执行的时候,scope chain为function constructor的__parent__。

Slide 21

函数的定义: 函数对象在编译的时候已经创建。 funObj.__proto__ = Function.prototype; funObj.__parent__ = StackFrame.scopeChain; 函数的执行: StackFrame.scopeChain = funObj.__parent__;

Slide 23

看看代码,看看实例

Slide 24

closure: A closure is a function together with a referencing environment for the nonlocal names of that function. function: 闭包返回的函数对象为原函数对象的拷贝。 同一函数可创建多个闭包。 environment: 在引擎中称为call o​b​j​e​c​t​.​他​记​录​了​外​层​函​数​所​有​的​参​数​,​局​部​变​量​。​每​一​个​闭​包​一​个​c​a​l​l o​b​j​e​c​t​。​闭​包​返​回​的​函​数​的​_​_​p​a​r​e​n​t​_​_​指​向​c​a​l​l Object。 函数如果生成闭包,会在初始化执行上下文(Stack frame)的时候创建call object,并将其作为scope chain。 close: 只能通过返回的函数访问nonlocal variables.

Slide 25

function foo(){ var a = 100; function foo1(){ return ++a; } return foo1; } var f = foo(); f();

Slide 27

Js 引擎初始状态内部对象状态:

Slide 28

JavaScript 脚本的执行: 流程: 1, parse, 生成语法树。 2, byte code generation, 生成执行码(opcode)。 3, interpret, 解释执行。

Slide 29

Compile: parse,生成语法树: 根据运算符的优先级,采用递归降解的方式解析脚本。

Slide 30

2. bytecode generation: 同时还会生成source annotations : 用于decompile. prolog(predefined) section: 用于存储变量声明,函数定义的byte code。在脚本执行的时候,prolog section首先被执行。 main section: 保存主执行码。在prolog section执行结束后执行。 在生成byte c​o​d​e​的​时​候​,​会​计​算​出​脚​本​或​者​函​数​需​要​的​最​大​的​栈​空​间​大​小​。

Slide 32

compiler的结果: Script 一段脚本在编译,生成byte code之后,需要用script对象来存储byte code, source annotations, 符号表,脚本运行所需要的最大栈size等信息。

Slide 33

解释执行(interpreter): 执行对象:脚本or函数. 执行byte code前需要准备好的上下文(stack frame): parameters, variables scope chain object, call object, this object stack 这些信息存放在stack frame上。stack frame也可以理解成execution context.

Slide 34

parameters, local variables的寻址: normal object, global variables都是作为其他对象的属性而可被访问。 参数和局部变量在运行时才可访问,存储在执行上下文Stack Frame中。 生成闭包时,parameters,local variables都将作为call object的属性而被访问。

Slide 35

this 脚本执行的时候,this为当前的scope chain object。 当​函​数​执​行​的​时​候​,​t​h​i​s​为​当​前​函​数​的​调​用​对​象​,​如​果​不​存​在​,​为​函​数​的​s​c​o​p​e chain的root(global对象)。

Slide 36

4, scope chain object, call object: script执行: scope chain object为global对象。 函数执行: scope chain object为函数对象的__parent__. 当存在闭包,scope chain object为call object。

Slide 37

看看代码也许更直接

Slide 38

执行byte code:

Slide 39

一个较为综合的例子: with语句: with语句会临时修改当前的scope chain object. f​r​a​m​e​s​[​1​]​.​d​o​c​u​m​e​n​t​.​f​o​r​m​s​[​0​]​.​a​d​d​r​e​s​s​.​v​a​l​u​e oops… It’s too long. w​i​t​h​(​f​r​a​m​e​s​[​1​]​.​d​o​c​u​m​e​n​t​.​f​o​r​m​s​[​0​]​.​a​d​d​r​e​s​s​) { value = “”; }

Slide 40

var obj = {a:100}; with(obj){ function foo(){ return ++a; } } alert(foo());

Slide 41

js debug功能: watch: 当​对​象​属​性​变​化​的​时​候​,​回​调​到​注​册​的​函​数​。​当​属​性​删​除​的​时​候​w​a​t​c​h​依​然​存​在​。 unwatch: w​a​t​c​h​通​过​_​_​s​e​t​t​e​r​_​_​来​实​现​,​w​a​t​c​h​数​据​存​放​在​全​局​j​s​句​柄​上​。 w​a​t​c​h​为​O​b​j​e​c​t​.​p​r​o​t​o​t​y​p​e​的​方​法​,​所​有​对​象​都​将​继​承​。

Slide 42

Trap: 当执行到某一个byte c​o​d​e​的​时​候​,​调​用​注​册​的​回​调​函​数​,​根​据​回​调​函​数​的​返​回​值​确​定​原​来​的​脚​本​执​行​与​否​。 JSOP_NAME 0 find a variable JSOP_TRAP  if (CONTINUE == trap_handler()) JSOP_NAME 0; else return; 可以使用trap来实现breakpoint。 此功能引擎没有开发给脚本开发人员。

Slide 43

hook JS_SetSourceHandler JS_SetExecuteHook JS_SetCallHook JS_SetObjectHook JS_SetThrowHook JS_SetDebugErrorHook JS_SetNewScriptHook JS_SetDestroyScriptHook

Slide 44

decompile: JS_PCToLineNumber JS_LineNumberToPC JS_GetFunctionScript 配​合​J​S​_​L​i​n​e​N​u​m​b​e​r​T​o​P​C​和​t​r​a​p​可​以​设​置​在​某​一​行​的​断​点​。

Slide 45

Evaluating debug code JS_EvaluateInStackFrame 在​执​行​函​数​或​者​脚​本​前​执​行​自​定​义​的​脚​本​。​可​以​实​现​函​数​的​s​t​e​p​-​i​n​, step-out. 其他: Memory usage Examining object properties Inspecting the stack 等。

Slide 46

SpiderMonkey thread safety: JSRunTime: SpiderMonkey的全局句柄,不管有多少线程, 只会实例化一次。 Container:用来存储全局信息,譬如string pool, keyword, GC 等。 JSContext: j​s​脚​本​运​行​的​环​境​。​S​p​i​d​e​r​M​o​n​k​e​y​可​能​存​在​多​个​J​S​C​o​n​t​e​x​t​,​每​一​个​J​S​C​o​n​t​e​x​t​有​一​个​g​l​o​b​a​l Object。 JSContext之间可以相互访问。 对​应​浏​览​器​环​境​下​,​每​个​f​r​a​m​e​对​应​一​个​J​S​C​o​n​t​e​x​t​。

Slide 47

线程安全: 对JSRunTime的访问需要加锁。 GC出发的时候也会加锁,其他线程对GC的访问将被会阻塞。 需​要​引​起​注​意​的​一​点​:​J​S​C​o​n​t​e​x​t​可​以​相​互​访​问​,​他​们​可​以​引​用​其​他​J​S​C​o​n​t​e​x​t​下​的​J​S Object, 在做SpiderMonkey开发的时候需要注意。 浏​览​器​会​有​S​e​c​u​r​i​t​y​O​r​i​g​i​n​来​确​定​跨​域​访​问​的​安​全​性​。

Slide 48

杂谈: getter,setter: JS Object property a​d​a​p​t​o​r​。​当​读​取​或​者​写​入​对​象​某​一​属​性​的​时​候​,​执​行​注​册​的​函​数​。 js event: 很遗憾,js引擎没有提供事件,异步回调等机制,这些都由js client实现。

Slide 49

参考: h​t​t​p​:​/​/​f​t​p​.​m​o​z​i​l​l​a​.​o​r​g​/​p​u​b​/​m​o​z​i​l​l​a​.​o​r​g​/ h​t​t​p​s​:​/​/​d​e​v​e​l​o​p​e​r​.​m​o​z​i​l​l​a​.​o​r​g​/​e​n​/​S​p​i​d​e​r​M​o​n​k​e​y h​t​t​p​:​/​/​e​j​o​h​n​.​o​r​g​/​b​l​o​g​/​j​a​v​a​s​c​r​i​p​t​-​g​e​t​t​e​r​s​-​a​n​d​-​s​e​t​t​e​r​s​/ h​t​t​p​:​/​/​e​n​.​w​i​k​i​p​e​d​i​a​.​o​r​g​/​w​i​k​i​/​S​c​o​p​e​_​(​c​o​m​p​u​t​e​r​_​s​c​i​e​n​c​e​) h​t​t​p​:​/​/​e​n​.​w​i​k​i​p​e​d​i​a​.​o​r​g​/​w​i​k​i​/​P​r​o​t​o​t​y​p​e​-​b​a​s​e​d​_​p​r​o​g​r​a​m​m​i​n​g h​t​t​p​:​/​/​e​n​.​w​i​k​i​p​e​d​i​a​.​o​r​g​/​w​i​k​i​/​R​e​f​e​r​e​n​t​i​a​l​_​t​r​a​n​s​p​a​r​e​n​c​y​_​(​c​o​m​p​u​t​e​r​_​s​c​i​e​n​c​e​)

http://www.slideboom.com/presentations/400695/SpiderMonkey

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/181149.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • SCSA之信息安全概述「建议收藏」

    SCSA之信息安全概述「建议收藏」一、信息安全概述1、信息安全防止任何对数据进行未授权访问的措施,或者防止造成信息有意无意泄漏、破坏丢失等问题的发生,让数据处于远离危险、免于威胁的状态或特性。(1)网络安全计算机网络环境下的信息安全。二、信息安全的脆弱性及常见的攻击1、网络环境的开放性“INTERNET的美妙之处在于你和每个人都能互相连接,INTERNET的可怕之处在于每个人都能和你互相连接”2、…

  • linux强制删除文件夹命令 rm -rf

    linux强制删除文件夹命令 rm -rfhttps://www.cnblogs.com/tirmer/p/8616362.html

  • 同济大学 线性代数 第六版 pdf_【课后习题答案】工程数学线性代数同济第六版+课后习题答案…

    同济大学 线性代数 第六版 pdf_【课后习题答案】工程数学线性代数同济第六版+课后习题答案…资料介绍本次分享资源内容为工程数学线性代数(第六版)课后习题答案教材:工程数学线性代数(第六版)作者:同济大学数学系编出版社:高等教育出版课后习题答案第一章行列式第二章矩阵及其运算第三章矩阵的初等变换与线性方程组第四章向量组的线性相关性第五章相似矩阵及二次型第六章线性空间与线性变换温馨提示:1、资料下载链接如有失效请联系小编获取最新链接!2、声明:上述资料…

  • msf win10漏洞_Kali对Windows2008/7的MS17010漏洞测试(MSF自带模块)

    msf win10漏洞_Kali对Windows2008/7的MS17010漏洞测试(MSF自带模块)Kali-TheVulnerablityofMS17010forWindowsServer2008R20x01说明其实这个MSF自带的exp模块还是挺让人伤脑筋的,因为它支持的OS并不是很多,也就WindowsServer2008和Win7能用一下,比他们版本低的xp/2003以及比他们版本高的8/2012都不可用,但是纯粹对于Win2008/7而言,这个方案还是比较方便…

  • BS架构和CS架构的区别

    BS架构和CS架构的区别介绍BS:(Browser/Server,浏览器/服务器模式),web应用可以实现跨平台,客户端零维护,但是个性化能力低,响应速度较慢。CS:(Client/Server,客户端/服务器模式),桌面级应用响应速度快,安全性强,个性化能力强,响应数据较快区别硬件环境不同C/S用户固定,一般只应用于局域网中,要求拥有相同的操作系统,如果对于不同操作系统还要相应开发不同的版本,并且对…

  • 微信公众号网页开发——获取用户信息

    微信公众号网页开发——获取用户信息微信公众号网页开发——获取用户信息自查用途,学习请至:官方文档1.获取access_token公众号可以使用AppID和AppSecret调用本接口来获取access_token。AppID和AppSecret可在“微信公众平台-开发-基本配置”页中获得(需要已经成为开发者,且帐号没有异常状态)。调用接口时,请登录“微信公众平台-开发-基本配置”提前将服务器IP地址添加到IP白名单…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号