nashorn on jdk 8 (adc2013)

24
Nashorn on JDK 8 莫莫@RednaxelaFX

Upload: kris-mok

Post on 15-Jan-2015

610 views

Category:

Technology


6 download

DESCRIPTION

Brief introduction of Nashorn on JDK 8. Delivered at ADC 2013 (http://adc.alibabatech.org/), on July 14, 2013. Full version of slides coming soon.

TRANSCRIPT

Page 1: Nashorn on JDK 8 (ADC2013)

Nashorn on JDK 8

莫枢(@RednaxelaFX)

Page 2: Nashorn on JDK 8 (ADC2013)

关于我

• 编程语言及虚拟机爱好者• 曾在淘宝和 Oracle 任职参与 Java 虚拟机

相关研发工作• 博客: http://rednaxelafx.iteye.com/• 微博: @RednaxelaFX

Page 3: Nashorn on JDK 8 (ADC2013)

何为 Nashorn ?

Page 4: Nashorn on JDK 8 (ADC2013)

何为 Nashorn ?

Page 5: Nashorn on JDK 8 (ADC2013)

何为 Nashorn ?

Page 7: Nashorn on JDK 8 (ADC2013)

何为 Nashorn ?

• Oracle 的 ECMAScript 5.1 实现• 运行于 Java 虚拟机上• 全新的代码, 100% Java 实现• OpenJDK项目 / JEP 174• GPLv2• 作为 JDK 的一部分随 JDK8 发布• 替代原本的 Rhino

Page 8: Nashorn on JDK 8 (ADC2013)

为何 Nashorn ?

• 改造 Rhino ?• 优势:现成的实现,功能完整• 劣势:代码老旧,难以翻新

Page 9: Nashorn on JDK 8 (ADC2013)

为何用 Java 实现 JavaScript ?

• 充分利用 Java 平台已有的资源• 成熟的 GC• 成熟的 JIT 编译器• 多线程支持• 丰富的标准库和第三方库

Page 10: Nashorn on JDK 8 (ADC2013)

为何用 Java 实现 JavaScript ?

• JavaScript 的标准库语义与 Java 相似• 可以充分复用 Java 的标准库• number -> java.lang.Double (*)• string -> java.lang.String• boolean -> java.lang.Boolean• Date -> java.util.Date (*)• RegExp -> java.util.regex.Pattern (*)• null -> null• undefined -> ? (Undefined)

Page 11: Nashorn on JDK 8 (ADC2013)

为何用 Java 实现 JavaScript ?

http://img.xgo-img.com.cn/9_500x375/8144.jpg

Page 14: Nashorn on JDK 8 (ADC2013)

Nashorn 的执行模型

• 纯编译,无解释器• 从 JavaScript 源码编译为 Java 字节码• 动态编译• 延迟编译( lazy compilation )

Page 15: Nashorn on JDK 8 (ADC2013)

Nashorn 的执行模型

词法分析

语法分析

常量折叠

控制流 lowering

类型标注

值域分析 (*)

代码分离

类型固化

字节码生成

JavaScript 源码

抽像语法树( AST )

Java 字节码

编译器前端

编译器后端

* 当前尚未完整实现

Page 16: Nashorn on JDK 8 (ADC2013)

Nashorn 的对象模型

function Point(x, y) { this.x = x; this.y = y;}

var p = new Point(2013, 42);

Page 17: Nashorn on JDK 8 (ADC2013)

map

__proto__

context …

flags 0

spill null

arrayData

L0 x

L1 y

L2

L3

Key Getter Setter“x” x getter x setter“y” y getter y setter

map

__proto__

2013

42

EMPTY_ARRAY

Page 18: Nashorn on JDK 8 (ADC2013)

Nashorn 的对象模型

function Point(x, y) { this.x = x; this.y = y;}

var p = new Point(1, 2);p.z = 3; p.a = 4; p.b = 5;p[0] = 6; p[1] = 7;

Page 19: Nashorn on JDK 8 (ADC2013)

map

__proto__

context …

flags 0

spill

arrayData

L0 x

L1 y

L2 z

L3 a

Key Getter Setter“x” x getter x setter“y” y getter y setter“z” z getter z setter“a” a getter a setter“b” b getter b setter

map

__proto__

1

2

0 6

1 7

b

5

3

4

Page 20: Nashorn on JDK 8 (ADC2013)

使用 Nashorn

• 命令行解释器• jjs / jrunscript

• 嵌入 Java 应用作为脚本使用• 唯一公有 API 是 JSR 223

( javax.script )• 系统脚本( shebang script )

Page 21: Nashorn on JDK 8 (ADC2013)

Node.jar

• Java 服务器端的 JavaScript 平台• 正在不断研发中• 集成了下列技术• Node.js• Nashorn• Grizzly• Java 平台 API

Page 23: Nashorn on JDK 8 (ADC2013)

更多关于 JavaScript 引擎的讨论

• 请参考 HLLVM 群组的讨论帖• http://hllvm.group.iteye.com/group/topic/

37596

Page 24: Nashorn on JDK 8 (ADC2013)

谢谢!