v8 和 node.js 的流行让 js/ts 相关的脚本开发也慢慢走入像游戏业务开发这些领域, 本文主要从 v8pp 的实现出发, 让读者熟悉极大提高 v8 易用性, 提供诸如像c++类导出到javascript等功能的 v8pp 的同时, 也对怎么在c++ 中嵌入式的使用 v8 虚拟机有个基础的了解. 依赖v8本身完备的实现和提供的基础对象, c++ & v8 的跨语言中间件的实现复杂度大幅度下降, 除了因为 js 本身使用 prototype 设计带来的一定程度的理解成本和机制转换成本外, 其他部分都会比像 python 等的跨语言中间件来得简单, 从代码量上来说, v8pp 的代码量也远少于笔者之前剖析过的 pybind11. 从某种层面来说, 基于 v8 的跨语言中间件, v8本身提供的机制解决了绝大部分问题, 剩下的一小部分问题, 是需要 v8pp 本身来解决的.
1,给window.scrollX设置值会导致堆栈溢出,看堆栈是反复进入js的访问器回调导致。但发现github上最新代码反而没问题。一开始以为是v8-5-7和miniblink49哪个代码不兼容。但看起来不是。
--url=http://music.yule.sohu.com/20170926/n514522612.shtml 里有断言错误
最后的结论很简单,是我绑定v8 function的时候没释放。但查找问题的过程比较艰难,因为
本文分享一下nodejs中js调用c++模块的一些内容。js调用c++模块是v8提供的能力,nodejs是使用了这个能力。这样我们只需要面对js,剩下的事情交给nodejs就行。本文首先讲一下利用v8如何实现js调用c++,然后再讲一下nodejs是怎么做的。
57是给blink的每个引入v8的变量,搞了个基类:ActiveScriptWrappableBase
frida 是一个非常优秀的开源项目,因为项目活跃,代码整洁,接口清晰,加上用灵活的脚本语言(JS)来实现指令级代码追踪的能力,为广大的安全研究人员所喜爱。虽然使用人群广泛,但对其内部实现的介绍却相对较少,因此笔者就越俎代庖,替作者写写 frida 内部实现介绍,同时也作为自己的阅读理解记录。
int main(int argc, char *argv[]) { #if defined(__linux__) char** envp = environ; while (*envp++ != nullptr) {} Elf_auxv_t* auxv = reinterpret_cast<Elf_auxv_t*>(envp); for (; auxv->a_type != AT_NULL; auxv++) { if (auxv->a_type == AT_SECURE) {
前言:昨天有个同学问怎么通过NAPI把C++类的继承关系映射到JS,很遗憾,NAPI貌似还不支持,但是V8支持,因为V8在头文件里导出了这些API,并Node.js里也依赖这些API,所以可以说是比较稳定的。本文介绍一下如何实现这种映射(不确定是否能满足这位同学的需求)。
本文使用的编程语言是 Node.js,连接 MongoDB 的模块用的是mongoose。但是,本文介绍的方法适用于其他编程语言及其对应的 MongoDB 模块。
前段时间,我做了一个node模块node-multi-worker ,希望通过这个模块让node能够脱离单线程的限制,具体的使用可以看一下上面的链接。其思路就是注册任务后,分出子进程,然后在主进程需要执行任务时,向reactor子进程发送命令,而reactor收到命令后分配到worker子进程在执行完成后返回结果到主进程。这篇文章主要是为了跟大家分享一下我在开发过程中,遇到的一个问题,如何解决以及对相关知识的一个挖掘。
Node.js 不仅可以单独运行,还可以以库的方式被使用,本文介绍下如何把 Node.js 嵌入到自己项目中。首先第一步下载 Node.js 源码,然后根据 Node.js 的文档进行编译安装。这样我们就可以拿到 Node.js 提供的头文件和库文件了。接下来根据官方的 demo 写一个测试程序。
拓展nodejs的方式有很多种,可以写npm包,可以写c++插件,还可以修改内核重新编译分发。本文介绍如何通过为nodejs内核增加一个c++模块的方式拓展nodejs的功能(git地址:https://github.com/theanarkh/learn-how-to-extend-node)。相比修改nodejs内核代码,新增一个nodejs内置模块需要了解更多的知识。下面我们开始。 1 首先在src文件夹下新增两个文件。 cyb.h
前言:最近在写 Node.js Addon 的过程中,遇到了一个问题,然后发现是 ObjectWrap 弱引用导致的,本文介绍一下具体的问题和排查过程,以及 ObjectWrap 的使用问题。
前言:对于基于 V8 的 JS 运行时来说,堆外内存的管理是非常重要的一部分,因为 gc 的原因,V8 自己管理堆内存大小是有限制的,我们不能什么数据都往 V8 的堆里存储,比如我们想一下读取一个 1G 的文件,如果存到 V8 的堆,一下子就满了,所以我们需要定义堆外内存并进行管理。本文介绍 No.js 里目前支持的简单堆内存管理机制和字符编码解码的实现。
前言:随着 Node.js 的越来越强大,代码量也变得越来越多,不可避免地拖慢了 Node.js 的启动速度,针对这个问题,Node.js 社区通过 V8 的 snapshot 技术对 Node.js 的启动做了优化,在 github 有很多关于此的 issue 讨论,大家有兴趣也可以去看一下。通过快照加速启动是一个非常复杂的过程,这需要对 V8 有深入的理解。本文介绍一下如何在 Node.js 中使用快照加速 Node.js 的启动。以 v16.13.1 为例,社区一直在优化这里面的速度,不同的版本的速度可能不一样。
上面的代码主要定义里一个全局变量。然后执行一段js代码,当我们执行TCP这个函数时,v8就会调用Invoke函数
前言:CPU Profiler 是应用性能诊断和优化的利器,本文介绍 V8 中关于这部分的实现,细节比较多也比较复杂,大致分析一下原理,代码来自 V8 10.2。
我们使用nodejs写好了程序之后,要是想对该程序进行性能分析的话,就需要用到profile工具了。
本文所用的V8版本为9.4.146.24,源码层面分析builtin、Ignition、Sparkplug、TurboFan。
先说说最近的进展吧,首先是 Repo 方面的建设,README 先写起来占坑了,顺便随手自己画了张 logo 图上丢上去占坑,可以简单看看现在的 README:
逐渐有些原生语言项目(比如c++)因为希望有不停机更新的能力而引入脚本。这些团队往往有一套成熟c++服务器框架,他们往往选择把脚本作为库嵌入到C++程序的做法。
SloppyBlockFunctionStatement* delegate放到scope_->DeclarationScope()->sloppy_block_function_map()里。而这个delegate是zone堆上new出来的。
导语 | 本文将介绍在c++游戏服务器上嵌入v8 js引擎的详细教程,关键步骤都会附带完整的可运行代码。并在文末为您附上github仓库链接。 逐渐有些原生语言项目因为希望有不停机更新的能力而引入脚本。而且由于大多数项目已经有现成的c++服务器框架,他们往往选择把脚本作为库嵌入到c++程序的做法。 服务器选用一个库,最看重的莫过于稳定性和性能了,在众多脚本引擎中,v8这两方面可谓佼佼者:稳定性源自长时间各种方式的折腾,v8引擎每天那么多的实例跑在各种各样的机器、环境下,跑着各种各样的代码,一天跑的代码
首先看下rust_v8里面这段文档解释,我们需要了解一些V8的基本概念才能看懂这串代码
前言:V8 Heap Profiler 用于收集哪些代码分析了多少内存的信息。本文介绍 V8 中关于这部分的实现,代码来自 V8 10.2。
前言:perf_hooks 是 Node.js 中用于收集性能数据的模块,Node.js 本身基于 perf_hooks 提供了性能数据,同时也提供了机制给用户上报性能数据。文本介绍一下 perk_hooks。
点击上方蓝字,发现更多精彩 导语 Microtasks(微任务)是事件循环中一类优先级比较高的任务,本文通过一个有趣的例子探索其运行时机。从两年前被动接受知识 "当浏览器JS引擎调用栈弹空的时候,才会执行 Microtasks 队列",到两年后主动深入探索源码后了解到的 "当 V8 执行完调用要返回 Blink 时,由于 MicrotasksScope 作用域失效,在其析构函数中检查 JS 调用栈是否为空,如果为空就会运行 Microtasks。"。同时文章中介绍了用于探索浏览器运行原理的一些工具。 一个
前言:越来越多同学在使用Node.js,大家也不同程度地理解Node.js是什么。比如Node.js是由V8、Libuv、JS组成的,Node.js底层是C\C++,Node.js不是语言是运行时。本文通过实现一个类Node.js的JS运行时No.js,去理解Node.js的本质。No.js是我之前写的一个JS运行时,概念上是这么说,但是它算不上真正的运行时,它只是个demo,但是它让你看到如果你有兴趣,你也可以写个Node.js。
本文主要备忘为Node.js编写组件的三种实现:纯js实现、v8 API实现(同步&异步)、借助swig框架实现。
前言:无论什么语言,调试能力都是非常重要的,像 C、C++ 等语言,我们可以使用现成的工具去调试。JS 也不例外,我们可以通过浏览器来实现对 JS 的调试,但是 JS 运行时就不太一样了,因为 JS 运行时通常独立于浏览器运行,所以无法直接使用浏览器提供的能力,这时候就需要自己实现了。当然 JS 运行时不需要完全实现调试的功能,核心的能力都是由 V8 提供,JS 运行时只需要按照 V8 的规范实现一个 Inspector 代理就行。本文介绍以 V8 为基础,实现一个简单的 JS 运行时(严格来说不算,本文只是用它来代替一个描述),并基于这个 JS 运行时实现调试 JS 的能力。
环境准备 工具: git/cmake/vscode(安装js和C++插件)/python vscode :https://code.visualstudio.com/Download 编译参考:https://github.com/nodejs/node/blob/master/BUILDING.md 需要注意的是为了调试方便,需要在make命令中开启debug,如果觉得编译过程慢也可以适当调大并发数。 make -d j4 命令行:在根目录输入: gdb node // 调试目标
| 导语 利用 Object.keys 取得对象所有属性的 key ,然后进行 map 操作是 JavaScript 开发者常用的方法。但你是否思考过 key list 是依据什么顺序排列的呢?
| 导语 利用 Object.keys 取得对象所有属性的 key ,然后进行 map 操作是 JavaScript 开发者常用的方法。但你是否思考过 key list 是依据什么顺序排列的呢? 一、背景 近期维护辅导 App 内嵌 WebView 页面调 native 拍照上传的业务时,遇到一个诡异的兼容 Bug:iOS 端新提交的图片偶现顺序不一致的问题,但 Android 端一切正常。 首先简单梳理下拍照上传的关键业务逻辑: JS 侧用一个 Object 保存各个图片的信息,拍照上传后 native
前言:在 Node.js 中我们有时候会使用 global.gc() 主动触发 gc 来测试一些代码,因为我们知道 V8 gc 的执行时机是不定的。但是可能很少同学知道 global.gc() 的实现,本文介绍一些在 V8 中关于这部分的实现。
前言:V8 除了我们经常讲到的新生代和老生代的常规堆内存外,还有另一种堆内存,就是堆外内存。堆外内存本质上也是堆内存,只不过不是由 V8 进行分配,而是由 V8 的调用方分配,比如 Node.js,但是是由 V8 负责 GC 的。本文介绍堆外内存的一种类型 ArrayBuffer 的 GC 实现。
前言:Buffer 模块是 Node.js 非常重要的模块,很多模块都依赖它,本文介绍一下 Buffer 模块底层的原理,包括 Buffer 的核心实现和 V8 堆外内存等内容。
原文:https://blog.insiderattack.net/deep-dive-into-worker-threads-in-node-js-e75e10546b11
前言:随着 Node.js 的出现和不断发展,其他新的 JS 运行时也穷出不断,Deno、Just、Bun等等。本文简单介绍一下如何写一个 JS 运行时,相比操作系统、编译器来说,写一个 JS 运行时理论上并不是一个难的事情,但是写一个优秀且功能齐全的运行时并不是一个容易的事情。
虽然现在大部分情况都是使用n-api来编写插件,但是底层毕竟是v8(和libuv),使用v8编写简单的插件,同时熟悉v8的使用。
V8编译是个比较麻烦的事情,不仅是下载、编译的过程,不同系统、不同编译器、不同C++版本都可能会出现不同的问题。之前编译的时候没有记录步骤,这次简单记录一下编译V8的过程,我的工作目录是/code/v8_code/。
nodejs的很多功能都是通过c++或者通过c++层调用libuv层实现的,nodejs是如何在js层面调用c++的呢?在nodejs里,使用c++层的功能主要有两种方式,第一种就是调用全局变量process,Buffer等,第二种就是通过process.binding函数。
前言:昨天碰到了一个 worker_threads crash 的问题,最终经过阅读源码和调试找到了具体原因。不得不说,阅读源码是解决问题的非常有效的方法。
但nodejs不是给每个功能拓展一个对象,而是拓展一个process对象,再通过process.binding拓展js功能。Nodejs定义了一个js对象process,映射到一个c++对象process,底层维护了一个c++模块的链表,js通过调用js层的process.binding,访问到c++的process对象,从而访问c++模块(类似访问js的Object、Date等)。
Node.js 的出现,让 JavaScript 脱离了浏览器的束缚,进入了广阔的服务端开发领域。而 Node.js 对 CommonJS 模块化规范的引入,则更是让 JavaScript成为了一门真正能够适应大型工程的语言。
前言:trace 系统用于收集内核的数据,本文介绍在 Node.js 中 trace 的架构和实现,因为 Node.js 的 trace 系统是基于 V8 的,所以也会介绍 V8 部分。因为实现细节比较多,逻辑也比较复杂,有兴趣的同学可以配合源码一起阅读或者看一下前面的相关文章。
前言:之前的文章介绍了通过快照的方式加速 Node.js 的启动,除了快照,V8 还提供了另一种技术加速代码的执行,那就是代码缓存。通过 V8 第一次执行 JS 的时候,V8 需要即时进行解析和编译 JS代码,这个是需要一定时间的,代码缓存可以把这个过程的一些信息保存下来,下次执行的时候,通过这个缓存的信息就可以加速 JS 代码的执行。本文介绍在 Node.js 里如何利用代码缓存技术加速 Node.js 的启动。
阿里妹导读:本文分享支付宝小程序 V8 Worker 相关工作沉淀和总结,包括技术演进、基础架构、基础功能、以及 JS 引擎能力输出,以及一些优化方案等。欢迎同学们共同探讨,指正。
领取专属 10元无门槛券
手把手带您无忧上云