标签: v8

ARM6的交叉编译Node.js(Raspberry Pi)

我正在尝试将node.js v0.7.9编译为raspberry pi,但由于node和v8非常大,我希望能够在另一台功能更强大的PC上进行交叉编译.我正在使用https://github.com/raspberrypi/tools中的linux-x86 arm-bcm2708-linux-gnueabi工具链,并使用它们为系统成功构建其他可执行文件.我最终设置了CC,CXX,CPP,STRIP,OBJCOPY等.变量到环境变量中的工具链等价物并运行配置:获取最终的可执行文件.将其复制到系统并运行它会产生以下错误:./configure --dest-cpu=arm --without-snapshot

Extension or internal compilation error at line 0.
Segmentation fault
Run Code Online (Sandbox Code Playgroud)

但是,任何非javascript任务(如node --version和)都不会发生分段错误node --help.是否有任何CFLAGS/CXXFLAGS我可能会丢失导致此问题?有点困惑....

arm v8 cross-compiling node.js raspberry-pi

25
推荐指数
3
解决办法
1万
查看次数

Javascript:如何在RegEx .exec结果中获得多个匹配项

我跑的时候

/(a)/g.exec('a a a ').length
Run Code Online (Sandbox Code Playgroud)

我明白了

2
Run Code Online (Sandbox Code Playgroud)

但我认为它应该回归

3
Run Code Online (Sandbox Code Playgroud)

因为a字符串中有3个,而不是2个!

这是为什么?

我希望能够在RegEx中搜索字符串的所有出现并迭代它们.

FWIW:我正在使用node.js

javascript regex v8 node.js

25
推荐指数
4
解决办法
3万
查看次数

在V8中使用数组(性能问题)

我尝试了下一个代码(它在Google Chrome和nodejs中显示了类似的结果):

var t = new Array(200000); console.time('wtf'); for (var i = 0; i < 200000; ++i) {t.push(Math.random());} console.timeEnd('wtf');
wtf: 27839.499ms
undefined
Run Code Online (Sandbox Code Playgroud)

我也跑了下一个测试:

var t = []; console.time('wtf'); for (var i = 0; i < 400000; ++i) {t.push(Math.random());} console.timeEnd('wtf');
wtf: 449.948ms
undefined
var t = []; console.time('wtf'); for (var i = 0; i < 400000; ++i) {t.push(undefined);} console.timeEnd('wtf');
wtf: 406.710ms
undefined
Run Code Online (Sandbox Code Playgroud)

但在Firefox中,第一个变体看起来都很好:

>>> var t = new Array(200000); console.time('wtf'); ...{t.push(Math.random());} console.timeEnd('wtf');
wtf: 602ms
Run Code Online (Sandbox Code Playgroud)

V8会发生什么?

UPD *神奇地降低了性能*

var t …
Run Code Online (Sandbox Code Playgroud)

javascript arrays firefox google-chrome v8

25
推荐指数
2
解决办法
6235
查看次数

“集群”和“worker_threads”如何在 Node.js 中工作?

  • 我理解正确cluster吗:如果我使用包,是否意味着为每个创建的工作人员创建一个新的节点实例?

  • clusterworker_threads包有什么区别?

v8 process core node.js clusterize

25
推荐指数
1
解决办法
8240
查看次数

为什么 NodeJS 不支持 String.prototype.replaceAll?

这个字符串方法存在于 browserland 中,但不存在于 Node 中。为什么不?它既不是全新的,也不是异国情调的。

  • ReplaceAll 是 ECMA-262 src的一部分
  • ReplaceAll在V8博客上有详细描述(v8.1中添加)src
  • NodeJS 升级到 V8 v8.1 并带有 NodeJS v14.0 src

但是:

$ node
Welcome to Node.js v14.13.1.
Type ".help" for more information.
> 'asdf'.replaceAll
undefined
Run Code Online (Sandbox Code Playgroud)

我不是在要求填充;而是在要求填充。我可以在 single-instance 上执行正则表达式或循环replace。我试图弄清楚为什么这个看似不起眼的功能在 NodeJS 中不存在,尽管它似乎在几乎所有其他 JS 环境中都可用,尽管所有文档都建议我它应该存在。

v8 node.js

25
推荐指数
1
解决办法
2万
查看次数

当关联的Javascript对象在V8中被垃圾收集时,如何释放包装的C++对象?

V8的文档解释了如何创建包装C++对象的Javascript对象.Javascript对象保持指向C++对象实例的指针.我的问题是,假设您在堆上创建C++对象,如何在gc收集Javascript对象时收到通知,这样您就可以释放堆分配的C++对象?

javascript c++ v8

24
推荐指数
1
解决办法
5118
查看次数

以下代码如何工作?

    #define TYPE_CHECK(T, S)                                     \
    while (false) {                                              \
      *(static_cast<T* volatile*>(0)) = static_cast<S*>(0);      \
    }
Run Code Online (Sandbox Code Playgroud)

我正在阅读谷歌v8的代码,发现上面的宏进行类型检查.

但是,我不明白为什么会这样.虽然(假)永远不会被执行,对吧?有人可以解释这些线吗?谢谢

c++ templates v8

24
推荐指数
2
解决办法
561
查看次数

在Mavericks上修复therubyracer/libv8(0.12.1)安装

好的,我正处于我的束缚之中.有一些类似的问题,但他们都提到了Therubyracer 0.10,他们大多认为问题可以通过升级到0.12来解决.

我有类似的问题,但是当我使用0.12时.

类似的问题

我在使用'标准'(xcode?)gcc以及来自自制软件的apple-gcc42和gcc时遇到了问题.我都试过--with-system-v8--without-system-v8,并再次,没有骰子.

这是一些日志:

从头开始…

 $ cd ~/Documents/code/website
 $ rvm gemset empty
 $ ruby -v
 ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-darwin10.8.0]
 $ grep rubyracer Gemfile
 gem 'therubyracer', '~> 0.12.0'
 $ brew list | grep v8
 $ cat ~/.bundle/config 
 $ cat .bundle/config 
 BUNDLE_BIN: bin
 $ $CXX
 $ $CPP
 $ $CC
 $ which gcc
 /usr/bin/gcc
 $ which g++
 /usr/bin/g++
 $ g++ -v
 Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with- 
 gxx-include-dir=/usr/include/c++/4.2.1
 Apple LLVM version 5.1 (clang-503.0.38) (based …
Run Code Online (Sandbox Code Playgroud)

gcc rubygems v8 therubyracer libv8

24
推荐指数
3
解决办法
2万
查看次数

异步javascript如何在Node.js中解释和执行?

我最近一直在研究Node.js的核心,我对Node平台的内部工作有一些疑问.据我了解,Node.js的工作原理如下:

在此输入图像描述

Node有一个用Javascript编写的API,它允许程序员与文件系统和网络之类的东西进行交互.但是,所有这些功能实际上都是由C/C++代码完成的,也是Node的一部分.事情变得模糊不清.因此,Chrome V8引擎的工作基本上是"编译"(解释?)javascript到机器代码.V8是用C++编写的,而Javascript语言本身是由ECMA指定的,因此关键字和语言特征等都是由它们定义的.这引出了我的前几个问题:

  1. Node Node Library如何与Node Bindings交互,因为Node Bindings是用C++编写的?

  2. Chrome V8引擎如何在Node的上下文中解释Javascript?我知道它使用了一种名为JIT的技术,在类似的问题中提到过:(https://softwareengineering.stackexchange.com/questions/291230/how-does-chrome-v8-work-and-why-was-javascript- not-jit-first-first-first-pl)但这并没有解释如何在Node的上下文中解释Javascript.与Node一起提供的Chrome V8引擎与Chrome浏览器上运行的引擎完全相同,还是已经过修改以与Node配合使用?

这让我想到了下一个问题.因此Node具有事件驱动的非阻塞IO.它通过事件循环实现了这一点,虽然它通常被称为"节点事件循环",但它实际上是libuv库的一部分,libuv库是一个旨在提供异步IO的C++库.在较高的层次上,事件循环基本上是通过Callbacks访问的,Callbacks是一个原生的Javascript功能,也是选择Javascript作为Node项目语言的原因之一.下面是事件循环如何工作的说明:

在此输入图像描述

这也可以通过这个简洁的小网站现场演示:http://latentflip.com/loupe/ 假设我们的Node应用程序需要调用外部API.所以我们写这个:

request(..., function eyeOfTheTiger() {
   console.log("Rising up to the challenge of our rival");
});
Run Code Online (Sandbox Code Playgroud)

我们的调用request被推送到调用堆栈,我们的回调被传递到某处,在那里它被保留直到请求操作完成.如果是,则将回调传递到回调队列.每次清除调用堆栈时,事件循环都会将回调队列顶部的项目推送到调用堆栈,然后执行该调用.此事件循环在单个线程上运行.出现问题的地方是有人写"阻塞"代码,或者代码从不离开调用堆栈并有效地绑定线程.如果总是在调用堆栈上执行代码,那么事件循环将永远不会将项目从回调队列推送到调用堆栈,并且它们永远不会被执行,从根本上冻结应用程序.这引出了我的下一个问题:

  1. 如果Javascript是由Chrome V8引擎解释的,那么"控制"将代码推送到回调队列上的是什么?如何通过libuv事件循环处理Javascript代码?

我发现这张图片是演示过程的一个例子:

在此输入图像描述

这是我不确定Chrome V8引擎和libuv如何互动的地方.我倾向于相信节点绑定有助于这种交互,但我不太确定如何.在上图中,似乎NodeJS绑定仅与通过V8从Javascript编译的机器代码进行交互.如果是这样,我感到困惑的是V8引擎如何解释Javascript,以便Node Bindings可以区分回调和实际代码以立即执行.

我知道这是一系列非常深刻和复杂的问题,但我相信这将有助于为试图理解Node.js的人们解决很多困惑,并帮助程序员理解事件驱动的优缺点,非基本级别的非阻塞IO.

状态更新:刚看过Sencha会议的精彩演讲(链接在这里).所以在这次演讲中,演示者提到了V8嵌入指南(此处链接),并讨论了如何将C++函数暴露给Javascript,反之亦然.本质上它是如何工作的是C++函数可以暴露给V8并且还指定它希望这些对象如何暴露给Javascript,并且V8解释器将能够识别嵌入式C++函数并在它找到与之匹配的Javascript时执行它们你指定了.例如,您可以将变量和函数公开给V8,这些变量和函数实际上是用C++编写的.这基本上是Node.js的作用; 它能够在requireJavascript中添加函数,这些函数在调用时实际执行C++代码.这稍微清除了问题1,但它并没有准确地显示Node标准库如何与V8一起工作.关于libuv如何与其中任何一个进行交互仍然不清楚.

javascript c++ v8 node.js libuv

24
推荐指数
1
解决办法
1501
查看次数

为什么在nodejs的for循环中让var慢于var?

我写了一个非常简单的基准:

console.time('var');
for (var i = 0; i < 100000000; i++) {}
console.timeEnd('var')


console.time('let');
for (let i = 0; i < 100000000; i++) {}
console.timeEnd('let')
Run Code Online (Sandbox Code Playgroud)

如果你正在运行Chrome,可以在这里试试(因为NodeJS和Chrome使用相同的JavaScript引擎,虽然版本通常略有不同):

// Since Node runs code in a function wrapper with a different
// `this` than global code, do that:
(function() {
  console.time('var');
  for (var i = 0; i < 100000000; i++) {}
  console.timeEnd('var')


  console.time('let');
  for (let i = 0; i < 100000000; i++) {}
  console.timeEnd('let')
}).call({});
Run Code Online (Sandbox Code Playgroud)

结果令我惊讶:

var: 89.162ms
let: 320.473ms
Run Code Online (Sandbox Code Playgroud)

我在Node 4.0.0 && …

javascript v8 node.js ecmascript-6

24
推荐指数
1
解决办法
2565
查看次数