JavaScript 引擎技术
主讲:周爱民
JavaScript的语言特性
程序设计语言的分类
动态语言
函数式
JavaScript语言的知识系统难度
动态
原型继承
面向对象
静态
过程式
跨度
命令式
说明式
接下来的目标
一般内置关键字
流程控制
switch (*expression) {
case *value : ...;
case *value : ...;
default:...;
}
异常处理
*exception = new Error(*number, *description)
throw *exception
try{
// tryStatements
}
catch (*exception) {
// catchStatements
if (*exception.number == 10) {
// ...
}
else throw *exception;
}
finally {
// finallyStatements
}
元类型系统与对象类型系统
Number
number
包装类
Boolean
boolean
String
string
直接量
Object
构造器
值类型
Function
内置对象
Array
原生对象
类型系统typeof( )
undefined
RegExp
Error
Date
引用类型
注1
Math
Object(object)
Function(function)
注2
Global
注2
Arguments
注3
Enumerator
XML
引擎扩展对象
VBArray
Script
ActiveXObject
...
注1
Debug
宿主对象
Window
Image
Navigator
...
类型系统与对象系统
注1:非构造器
注2:不能直接引用
注3:指引擎相对于ECMA扩展的原生对象(左右两侧分别为JScript与SpiderMonkey JS)
面向对象的基本概念
闭包
原型
JavaScript面向对象的支持
原型问题
function MyObject() {...}
function MyObject2() {
// (类抄写)...
}
MyObject2.prototype = new MyObject();
MyObject2.prototype.XXX = ...; // 原型修改
对象系统的类型问题
对象是什么?
名
值
性质
foo
...
R/D/E
O2.parent
名
值
性质
foo
...
R/D/E
O3.parent
名
值
性质
obj._proto_
aObj
名
值
性质
原型/对象-属性包
function Object2() {
}
function Object3() {
}
Object.prototype
// Object2.prototype = new Object();
Object3.prototype = new Object2();
Object2.prototype
Object3.prototype
Object.prototype.foo = ...;
aObj = new Object3();
aObj.foo()
Object2.prototype.foo = ...;
aObj.foo()
主要函数式特性
函数引用
变量1
变量2
...
变量1
变量2
...
...
...
00040000 : mov eax, 100
// 位于运行空间的二进制代码...
function myFunc() {
// ...
}
..
..
函数实例
运行期
代码、编译期
function myFunc() {
// ...
}
function myFunc() {
// ...
}
函数
变量1
变量2
...
...
...
运行期函数实例至少
有一个闭包,这时候
“函数实例 = 闭包”
function myFunc() {
// ...
}
..
..
function ....
函数实例具有多
个闭包的情况
function myFunc() {
// ...
}
函数、函数实例、函数引用与闭包
闭包
第二次
do Check: test.
do myFunc: undefined
当前闭包中的值
上一个闭包中的值
一个实例多个闭包的例子
第一次
var checker;
function myFunc() {
if (checker) {
checker();
}
alert('do myFunc: ' + str);
var str = 'test.';
if (!checker) {
checker = function() {
alert('do Check:' + str);
}
}
return arguments.callee;
}
// 连续执行两次myFunc()
myFunc()();
do myFunc: undefined
导致一个闭包被持用
返回同一个实例的引用
第二个调用运算
导致闭包创建
闭包是什么?
闭包是什么?
闭包内部结构上的存取规则
?
名
值
性质
foo
...
R/D/E
Object.prototype
脚本对象 . 变量/函数?
名
值
性质
foo
...
R/D/E
O2.parent
upvalue
脚本对象 . 变量/函数?
名
值
性质
Object2.prototype
O3.parent
upvalue
Object3.prototype
脚本对象 . 变量/函数?
obj._proto_
context.body
aObj
aFunc
存取规则的简单描述
主要动态语言特性
引擎的基本原理与模型
脚本对象
全局
脚本对象
anonymous
打开一个闭包
()
( )
yes, prop
过程:
*anonymous
.
( )
P,I
obj
‘aMethod’
a
=
P,I,C, rt
一次在对象及原型
属性包中的扫描
x
100
no, undef.
JavaScript怎样粘合语言特性
function a() {
}
(function() {
var x;
obj.aMethod( a(x = 100) );
})();
no, next, yeah! a
yes, x
undef.
a
100
x
lambda?函数式?
((. obj 'aMethod') ((a (= x 100))))
lambda = 函数
动态?
函数式语言,其实不如说成是表达式语言!
什么是动态函数式语言?
lambda表达式运算是求值运算!
所以我们可以在一个语法树(或其子树)上执行它,其结果仍然是值!
我们把对象存取变成了原型链表上的名称查找!
我们闭包/作用域变成了“脚本对象(结构)”上的名称查找!
动态语言= “在关联数组上的、动态的查找(标识符)”,取得它/执行它!
语言= 数据结构+算法!
十分钟:休息,答疑
下一节的内容
JavaScript 语言规范的发展JavaScript 引擎的发展
JavaScript 1.5以后的扩展概要
基于JavaScript 1.5的框架扩展技术
JavaScript语言规范的发展
FF 2.0b1
[JS 1.7]
Mozilla FF 0.8[2004.02]
FF 1.5
[JS 1.6]
MozillaFirefox 1.0
MozFirebird0.6[2003.05]
Mozilla
Gecko
重写Netscape 5
Netscape Browser 9
Phoenix 0.1
NC4.06JavaScript 1.3
Netscape Browser 8
Netscape 6Mozilla 0.6
JavaScript 1.5
NC4.08
NC4.8
Mozilla 开始独立发展JavaScript 1.x
NC4.5
JavaScript
稳定版本
Mozilla Firefox发布1.0
Netscape 基于FF发展
Mozilla开源
AOL收购
2006.08 -2006.10
1999.03
11
2000.07
2001.10
1998.01
08
10
11
11
2002.08
09
2004.11 -2005.03
2007.10
2005.11
JScript稳定版本
IE5.0JScript 5.0
IE5.01JScript 5.1
IE5.5JScript 5.5
IE6.0JScript 5.6
IE7.0JScript 5.7
JavaScript 1.xNC4.0JavaScript 1.2
NN3.0JavaScript 1.1
NN2.0JavaScript 1.0
10
Time
1996.02
08
1997.06
1998.06
1999.12
LiveScript
Mocha
IE3.0JScript 1.0
JScript 2.0
CSS
IE4.0JScript 3.0
基于JavaScript 1.1
ECMA Ed1
ECMA Ed2
ECMA Ed3
JavaScript 1.4只由Netscape服务器端产品实现
JScript 4.0只包含在Visual Studio早期的SP中
JavaScript 1.6-1.7
Mozilla Firefox 3
AIR(framework + AVM)
Adobe Flex 2.0
Flash Player 9
ActionScript 3
ActionMonkey =
Tamarin + SpiderMonkey
JS 1.9
Tamarin(AVM2)
IronMonkey =
IronPython + IronRuby +Tamarin
Flash Player 7.0
ActionScript 2
ScreamingMonkey =
SpiderMonkey - Mozilla
Flash Player 5.0
ActionScript 1.0
Adobe收购Macromedia
v2-v4动作
(action)脚本
12
2002.01
10
2000.09
2003.04
04
2006.06
10
11
2007.07
AJAX - RWC
.NET 1.0
JScript .NET(7.x)
ASP.NET AJAX
Javascript
Atlas 1.0
Vector Frames - RIA
IronPython
Silverlight 1.0
.NET 1.1
Dynamic VB
Dynamic Language
JScript.NET 8
DLR 1.0
Ruby
JavaScript 2Mozilla 2启动
Time
09
2005
Today
2007.11.30
2008.Q2
基于AS and JS.NET
ECMA Ed4
[interim report]
TC39-TG1
[ECMA技术员会39-任务组1]
ECMA Ed4
[release?]
ES3: 对大型软件系统的抽象能力是较弱的,也缺乏一些大型编程系统中常用的机制(例如静态类型检查、早期绑定等)此外,它是基于对象而非面向对象的,因此对象系统的表达能力也不足够。
AS3: 使用双虚拟机支持AS1-2与AS3,基本重写语言框架。
JavaScript 2(ECMA Ed4)
JavaScript 引擎的发展
引擎、应用环境
Native Objects, etc, EvalError()
Host Objects,
etc, ActiveXObject()
Build-in Objects,etc, Object(), Global..
Your Objects, etc, function MyObject() {...}
应用环境
Runtime? JIT? VM?
宿主(外壳是一种宿主)
引擎
Simple ECMAScript Engine
(2007.08.15, 2.1.1277)
SEE
C
NGS JS Interpreter 0.24
(New Generation Software)
C
NJS 0.25 alpha
Free EcmaScript Interpreter(FESI 1.18, 2003.09.29)
java
DMDScript
D
D Language
linear_b(7.0~9.24)
futhark(9.5 or 10+)
Opera
JavaScriptCore
(in safari/webkit)
JavaScriptCore
KJS(KDE)
C++
Trolltech Qt Script for app.
Konqueror
Epimetheus
C++
Javascript-C++
JS
Javascript-JS
Narcissus
NarrativeJS
java
Raino
Javascript-Java
Raino
Javascript-C
JVM
C
ActionMonkey
Netscape
SpiderMonkey
Tamarin(AVM2)
C
ActionScript1
ActionScript2
ActionScript3
AIR
?
JScript.NET
JScript
.NET
WSH
Internet Explorer
DLR
.NET
CLR+CTS
DotGNU JScript
Mono JScript
Mono
JavaScript 引擎的谱系ECMA Ed3
ECMA Ed4
Mutil-Languages
Javascript
IronPython
Dynamic VB
Ruby
JIT compiler
common infrastructure such as
Common Hosting Mechanisms
HOST
common compiler infrastructure
CLR
DLR vs AVM vs JVMxVM = vm_sys.eval_opcode(Interpreter(JIT, Code))
DLR