A. Node.js 8有哪些重要功能和修复
N-API介绍
N-API是用于构建原生插件的API。它独立于底层Java运行时,并作为Node.js自身的一部分进行维护。这么做的目的是保证应用程序二进制接口(ABI)在不同Node.js版本之间能够保持稳定。
N-API的目的是将附加组件和基础Java引擎中的更改区分开,以便原生插件在不需要重新编译情况下,就可以运行不同的Node.js版本。
了解更多N-API信息。
Node.js 8中的缓冲区安全性改进
在Node.js 8版本之前,使用new Buffer(Number)构造函数分配的缓冲区并未使用ZEROS初始化内存空间。结果导致新的Buffer实例可能包含敏感信息,容易导致安全问题。
虽然这是一个用于提高创建新Buffer性能的决定,但是对大多数人来说,并不打算这么使用。因此从Node.js 8开始,使用new Buffer(Number)或Buffer(Number)分配的Buffers会被ZEROS自动填充。
将V8升级到5.8:TurboFan&Ingnition
使用Node.js 8版本,底层的V8 Java引擎也会更新。
对于Node.js用户来说,最大的变化就是引入TurboFan和Ignition。Ignition是V8的解释器,TurboFan是优化编译器。
“Ignition和TurboFan的联合使用已经开发了近3½年,它代表了V8团队集体认识的最终结果,是V8团队收集了Java的实测性能并仔细分析了Full-codegen的缺点和Crankshaft的结果。这也是能够在未来几年内继续优化Java语言体系的基础。“ - Daniel Clifford和V8团队
B. 编译器具体实现中比较巧妙的思想有哪些
要说编译器实现的巧妙思想,很多都是用来解决工程性问题的,跟编译原理中的算法(解决抽象概念问题 / 学术问题)未必有直接关系。
题主是更想知道某个算法在具体实现中的特点或者说应用方式呢,还是更想了解工程方面的问题呢?
我觉得前者应该有很多人会给出非常有趣的回答,我就主要回答后者的方面吧。解决工程性问题的巧妙技巧也挺吸引人的,而且有非常大量的素材…根本无法列举完。
LLVM
说到编译器实现,不得不落个俗套说说LLVM编译器套件。不用介绍LLVM是啥了,感觉是“地球人都知道”系列。
1、一套IR,三种表现形式:运行时表现形式(llvm/IR,内存中)、序列化表现形式(bitcode,用于存储)、文本表现形式(“LLVM汇编”,便于人阅读和编辑)。三种形式间可以无损变换是LLVM非常非常强大的实现特点之一。
实际使用时能否真的达到无损变换很大程度上取决于要实现的语言有多少东西无法用LLVM IR表达。
例如说如果有语言实现基于LLVM来实现JIT编译器,并且想把一个运行时的对象指针当作常量嵌入生成的代码里,它可以把这个常量构造成LLVM IR,但如果把这个常量序列化到bitcode或生成文本形式,等“下一次编译”再读出来用的话,那个常量指针可能已经不对了。这跟生成PIC(position-independent code)的问题类似,但LLVM没办法帮语言解决这种问题。
也有可能有些语言实现偷懒,有些嵌入LLVM IR的metadata无法无损转换为文本形式,这也不能怪LLVM IR不好,但确实是使用中要头疼的问题…
这种一套IR三种表现形式的设计非常实用,一些新的语言实现项目受其影响也采用了类似的设计。
C. Node.js v8.0.0正式发布,看看带来了哪些主要新特性
5月30日12点,Node.js8正式发布了,这个版本具有一系列新功能和性能改进,并且这些功能和改进将获得长期支持(LTS)。下面就来介绍Node.js8版本中最重要的功能和修复。新版本的代号是Carbon。Node.js8将从2017年10月起,正式成为当前的LTS版本,并持续到2019年12月31日。这也意味着Node.js6版本将在2018年4月进入到维护模式,并在2019年4月结束维护支持。下载Node.js8版本:https://nodejs.org/download/rc/v8.0.0-rc.2/AsyncHooksAPI介绍AsyncHooks(以前称为AsyncWrap)API允许获取有关句柄对象生命周期的结构跟踪信息。API发出的消息会将Node.js中所有句柄对象的生命周期告知给consumer。它试图解决类似于continuation-local-storagenpmpackage这样的问题。如果你正在使用continuation-local-storage,那么已经可以用称为cls-hook的asynchooks来代替使用了–只是目前并不是使用asynchooks的最好时机,所以需要谨慎使用!AsyncHooksAPI在Node.js8中如何工作createHooks函数的注册功能会被每一个异步操作的不同生命周期事件调用。constasyncHooks=require('async_hooks')asyncHooks.createHooks({init,pre,post,destroy})了解AsyncHooks,或查看正在进行的工作文档。这些函数将会根据处理程序对象的生命周期事件选择性触发。N-API介绍N-API是用于构建原生插件的API。它独立于底层JavaScript运行时,并作为Node.js自身的一部分进行维护。这么做的目的是保证应用程序二进制接口(ABI)在不同Node.js版本之间能够保持稳定。N-API的目的是将附加组件和基础JavaScript引擎中的更改区分开,以便原生插件在不需要重新编译情况下,就可以运行不同的Node.js版本。了解N-API信息。Node.js8中的缓冲区安全性改进在Node.js8版本之前,使用newBuffer(Number)构造函数分配的缓冲区并未使用ZEROS初始化内存空间。结果导致新的Buffer实例可能包含敏感信息,容易导致安全问题。虽然这是一个用于提高创建新Buffer性能的决定,但是对大多数人来说,并不打算这么使用。因此从Node.js8开始,使用newBuffer(Number)或Buffer(Number)分配的Buffers会被ZEROS自动填充。将V8升级到5.8:TurboFan&Ingnition使用Node.js8版本,底层的V8JavaScript引擎也会更新。对于Node.js用户来说,最大的变化就是引入TurboFan和Ignition。Ignition是V8的解释器,TurboFan是优化编译器。“Ignition和TurboFan的联合使用已经开发了近3½年,它代表了V8团队集体认识的最终结果,是V8团队收集了JavaScript的实测性能并仔细分析了Full-codegen的缺点和Crankshaft的结果。这也是能够在未来几年内继续优化JavaScript语言体系的基础。“-DanielClifford和V8团队目前V8的编译管道如下图所示。这个管道的最大问题是,新的语言功能必须在管道的不同部分实现,这就增加了大量额外的开发工作。下面是简化的管道,没有了FullCodeGenerator和Crankshaft:新管道大大降低了V8团队的技术负担,并实现了很多之前无法实现的改进。了解TurboFanandIgnition和TurboFanInliningHeuristics。将npm升级到5.0.0新的Node.js8版本还附带npm5-最新版本的npmCLI。新npm版本的亮点:一种新的标准化的锁定文件功能,用于跨包管理器的兼容性(package-lock.json),以及一种用于shrinkwrap的新格式和语义--save已经不再需要了,因为所有的安装将默认保存node-gyp现在支持Windows的node-gyp.cmd新的发布版本将会包括sha512和sha1校验Node.js8版本中的其它显着改变BufferBuffer方法现在接受Uint8Array作为输入ChildProcessArgument和Kill信号验证得到改善ChildProcess方法接受Uint8Array作为输入Console使用控制台方法时,错误事件发送现在受到了抑制DomainsNativePromise实例现在是域感知的文件系统实用程序类fs.SyncWriteStream已被弃用已弃用的fs.read()字符串接口已被删除HTTP溢出的Cookieheaders会被连接成一个字符串该httpResponse.writeHeader()方法已被弃用StreamStream现在支持destroy()和_destroy()APITLS该rejectUnauthorized选项现在默认为trueURLWHATWGURL的实现,现在是Node.jsAPI完全支持的Node.js8下一步要做什么Node.js8版本令我们兴奋,因为它包含了很多有趣的提升,例如AsyncHooksAPI,这些API在当前的文档状态是很难掌握的。我们将尽快开始使用新版本,并尽快提供给用户新功能的更详细说明。
D. Nodejs 8有哪些重要功能和修复
5月30日12点,Node.js 8正式发布了,这个版本具有一系列新功能和性能改进,并且这些功能和改进将获得长期支持(LTS)。
下面就来介绍Node.js 8版本中最重要的功能和修复。
新版本的代号是Carbon。Node.js 8将从2017年10月起,正式成为当前的LTS版本,并持续到2019年12月31日。这也意味着Node.js 6版本将在2018年4月进入到维护模式,并在2019年4月结束维护支持。
下载Node.js 8版本:https://nodejs.org/download/rc/v8.0.0-rc.2/
Async Hooks API 介绍
Async Hooks (以前称为AsyncWrap) API允许获取有关句柄对象生命周期的结构跟踪信息。
API发出的消息会将Node.js中所有句柄对象的生命周期告知给consumer。它试图解决类似于continuation-local-storage npm package这样的问题。
如果你正在使用continuation-local-storage,那么已经可以用称为cls-hook的async hooks来代替使用了 – 只是目前并不是使用async hooks的最好时机,所以需要谨慎使用!
Async Hooks API 在 Node.js 8 中如何工作
createHooks函数的注册功能会被每一个异步操作的不同生命周期事件调用。
constasyncHooks=require('async_hooks')
asyncHooks.createHooks({
init,
pre,
post,
destroy
})
了解更多Async Hooks,或查看正在进行的工作文档。这些函数将会根据处理程序对象的生命周期事件选择性触发。
N-API 介绍
N-API是用于构建原生插件的API。它独立于底层JavaScript运行时,并作为Node.js自身的一部分进行维护。这么做的目的是保证应用程序二进制接口(ABI)在不同Node.js版本之间能够保持稳定。
N-API的目的是将附加组件和基础JavaScript引擎中的更改区分开,以便原生插件在不需要重新编译情况下,就可以运行不同的Node.js版本。
了解更多N-API信息。
Node.js 8 中的缓冲区安全性改进
在Node.js 8版本之前,使用new Buffer(Number)构造函数分配的缓冲区并未使用ZEROS初始化内存空间。结果导致新的Buffer实例可能包含敏感信息,容易导致安全问题。
虽然这是一个用于提高创建新Buffer性能的决定,但是对大多数人来说,并不打算这么使用。因此从Node.js 8开始,使用new Buffer(Number)或Buffer(Number)分配的Buffers会被ZEROS自动填充。
将 V8 升级到 5.8:TurboFan & Ingnition
使用Node.js 8版本,底层的V8 JavaScript引擎也会更新。
对于Node.js用户来说,最大的变化就是引入TurboFan和Ignition。Ignition是V8的解释器,TurboFan是优化编译器。
“Ignition和TurboFan的联合使用已经开发了近3½年,它代表了V8团队集体认识的最终结果,是V8团队收集了JavaScript的实测性能并仔细分析了Full-codegen的缺点和Crankshaft的结果。这也是能够在未来几年内继续优化JavaScript语言体系的基础。“ - Daniel Clifford和V8团队
目前V8的编译管道如下图所示。
新管道大大降低了V8团队的技术负担,并实现了很多之前无法实现的改进。
了解更多TurboFan and Ignition和 TurboFan Inlining Heuristics 。
将 npm 升级到 5.0.0
新的Node.js 8版本还附带npm 5 - 最新版本的npm CLI。
新 npm 版本的亮点:
一种新的标准化的锁定文件功能,用于跨包管理器的兼容性(package-lock.json),以及一种用于shrinkwrap的新格式和语义
--save 已经不再需要了,因为所有的安装将默认保存
node-gyp现在支持Windows的node-gyp.cmd
新的发布版本将会包括sha512和sha1校验
Node.js 8 版本中的其它显着改变
Buffer
Buffer方法现在接受Uint8Array作为输入
Child Process
Argument和Kill信号验证得到改善
Child Process方法接受Uint8Array作为输入
Console
使用控制台方法时,错误事件发送现在受到了抑制
Domains
Native Promise实例现在是域感知的
文件系统
实用程序类fs.SyncWriteStream已被弃用
已弃用的fs.read( )字符串接口已被删除
HTTP
溢出的Cookie headers会被连接成一个字符串
该httpResponse.writeHeader( )方法已被弃用
Stream
Stream现在支持destroy( )和_destroy( ) API
TLS
该rejectUnauthorized选项现在默认为true
URL
WHATWG URL的实现,现在是Node.js API完全支持的
Node.js 8 下一步要做什么
Node.js 8版本令我们兴奋,因为它包含了很多有趣的提升,例如Async Hooks API,这些API在当前的文档状态是很难掌握的。我们将尽快开始使用新版本,并尽快提供给用户新功能的更详细说明。