V8-JavaScript引擎在R中的应用

版权声明:本人博文一律不许转载,如发现转载,需负法律责任 https://blog.csdn.net/qq_38984677/article/details/82747419

传送:R语言中使用JavaScript

v8命名灵感源自20世纪50年代经典的“肌肉车”引擎;2008年9月2日v8与chrome同时宣布开源;2009年v8引入一个名为irregexp的正则表达式引擎;2009年内嵌v8的node.js发布了第一个版本,成为最受欢迎的JavaScript生态系统之一;2010年引入全新的优化JIT编译器crankshaft,极大提升了运行时性能;2011年垃圾回收器性能得到了极大改善,新的增量垃圾回收器大大减少停顿时间,并保持了极佳的峰值性能和低内存使用率,v8引入隔离的概念,可在一个进程中启动多个v8运行时实例;2014年v8通过并发编译将JIT编译的一些工作从主线程中移除,从此来减少堵塞,并显著提高了性能;2015年实现代码缓存和脚本流,大大加快了网页加载速度;2016年发布了最后一组ES2015特征集(包括promise、类语法、词法作用域、解构等)以及一些ES2016特性;2017年完成对v8引擎的重大调整,默认情况下启用新的ignition和turbofan管道

v8包是用C++编写的用于R的开源、高性能、嵌入式JavaScript引擎,实现ECMA-262第5版中规定的ECMAScript(是通过ECMA-262标准化的脚本程序设计语言,可将其理解为JavaScript的一个标准)

#创建一个新的v8 context,提供可执行环境允许单独\不相关的JavaScript代码在v8的单个实例中运行
v8(global = "global", console = TRUE, typed_arrays = TRUE)	#typed_arrays=TRUE启用对类型化数组的支持(ECMA6的一部分),为全局命名空间增加了许多附件功能

V8 context无法序列化,但创建新的context和source code非常便捷,可根据需要运行任意数量的并行v8 context;ct$eval以与eval在JavaScript中相同的方式计算一串原始代码返回一个带控制台输出的字符串;ct$get,ct$assign和ct$call函数自动转换参数并返回值(from/to JSON)除非参数已包装在JS()中。ct$validate用于测试一段代码是否在上下文中是有效的JavaScript语法,并始终返回TRUE或FALSE

与其他外部语言接口相比,v8不需要编译器、外部可执行文件或运行时依赖项,整个引擎在6MB的包中,适用所有主要平台。V8是裸露的JavaScript引擎,目前没有DOM-窗口对象,没有网络或磁盘IO,甚至没有事件循环,但这些R全都有

console()	#启动交互式控制台
eval(src)	#使用JavaScript源码评估字符串
validate(src)	#测试一段JavaScript代码在语法上是否有效
source(file)	#使用JavaScript代码评估文件
get(name,...)	#通过JSON将JavaScript转换成R,...是fromJSON函数参数
assign(name,value)		#通过JSON将R对象分配给JavaScript
call(fun,...)	#通过参数调用JavaScript函数,未包括在JS()中的参数将转化为JSON
reset()	#重置context,删除所有对象
#创建新的context
ctx<-v8()

#evaluate some code 
ctx$eval("var foo=123")	#定义变量,console无返回结果
ctx$eval("vtr foo=123")	#SyntaxError: Unexpected identifier(未找到标识符)
ctx$eval("foo")	#输出123

#函数与闭包(R的闭包包括函数参数,函数体及调用环境)
cat(ctx$eval("JSON.stringify({x:Math.random()})"))	#创建JSON
ctx$eval("(function(x){return x+1;})")	#匿名函数:输出function(x){return x+1;}
ctx$eval("(function(x){return x+1;})(123)")	#输出124

#R对象(R与JavaScript之间的数据交换) via JSON only
ctx$assign("mydata", mtcars)	#通过JSON将R对象mtcars复制给mydata
g<-ctx$get("mydata")	#通过JSON将JavaScript转换成R对象
ctx$get("mydata", simplifyVector = FALSE)	#参数是fromJSON的参数

#分配javascript(JS()-不转换成JSON字符)
ctx$assign("foo", JS("function(x){return x*x}"))	#foo-函数类型,无JS()则是字符
ctx$assign("bar", JS("foo(9)"))
ctx$get("bar")	#输出81

#只验证脚本是否正确
ctx$validate("function foo(x){2*x}") #TRUE
ctx$validate("foo = function(x){2*x}") #TRUE
ctx$validate("function(x){2*x}") #FALSE

#从文件或者URL加载JavaScript库
ctx$source(system.file("js/underscore.js", package="V8"))
ctx$source("https://cdnjs.cloudflare.com/ajax/libs/crossfilter/1.3.11/crossfilter.min.js")

#ctx$call调用JavaScript函数,自动在R和JavaScript之间转换对象
ct$call("_.filter", mtcars, JS("function(x){return x.mpg < 15}"))

#调用匿名函数
ctx$call("function(x, y){return x * y}", 123, 3)


-------------------------------------------------------------
console.log-日志输出,console.error-错误,console.warn-警告,手动回调R控制台
ct$eval('console.log("this is a message")')
ct$eval('console.warn("Heads up!")')
ct$eval('console.error("Oh no! An error!")')

ct <- v8(typed_arrays = TRUE);
ct$get(JS("Object.keys(global)"))

猜你喜欢

转载自blog.csdn.net/qq_38984677/article/details/82747419