我正在尝试将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我可能会丢失导致此问题?有点困惑....
我跑的时候
/(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
我尝试了下一个代码(它在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) 我理解正确cluster吗:如果我使用包,是否意味着为每个创建的工作人员创建一个新的节点实例?
cluster和worker_threads包有什么区别?
这个字符串方法存在于 browserland 中,但不存在于 Node 中。为什么不?它既不是全新的,也不是异国情调的。
但是:
$ 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的文档解释了如何创建包装C++对象的Javascript对象.Javascript对象保持指向C++对象实例的指针.我的问题是,假设您在堆上创建C++对象,如何在gc收集Javascript对象时收到通知,这样您就可以释放堆分配的C++对象?
#define TYPE_CHECK(T, S) \
while (false) { \
*(static_cast<T* volatile*>(0)) = static_cast<S*>(0); \
}
Run Code Online (Sandbox Code Playgroud)
我正在阅读谷歌v8的代码,发现上面的宏进行类型检查.
但是,我不明白为什么会这样.虽然(假)永远不会被执行,对吧?有人可以解释这些线吗?谢谢
好的,我正处于我的束缚之中.有一些类似的问题,但他们都提到了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) 我最近一直在研究Node.js的核心,我对Node平台的内部工作有一些疑问.据我了解,Node.js的工作原理如下:
Node有一个用Javascript编写的API,它允许程序员与文件系统和网络之类的东西进行交互.但是,所有这些功能实际上都是由C/C++代码完成的,也是Node的一部分.事情变得模糊不清.因此,Chrome V8引擎的工作基本上是"编译"(解释?)javascript到机器代码.V8是用C++编写的,而Javascript语言本身是由ECMA指定的,因此关键字和语言特征等都是由它们定义的.这引出了我的前几个问题:
Node Node Library如何与Node Bindings交互,因为Node Bindings是用C++编写的?
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被推送到调用堆栈,我们的回调被传递到某处,在那里它被保留直到请求操作完成.如果是,则将回调传递到回调队列.每次清除调用堆栈时,事件循环都会将回调队列顶部的项目推送到调用堆栈,然后执行该调用.此事件循环在单个线程上运行.出现问题的地方是有人写"阻塞"代码,或者代码从不离开调用堆栈并有效地绑定线程.如果总是在调用堆栈上执行代码,那么事件循环将永远不会将项目从回调队列推送到调用堆栈,并且它们永远不会被执行,从根本上冻结应用程序.这引出了我的下一个问题:
我发现这张图片是演示过程的一个例子:
这是我不确定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如何与其中任何一个进行交互仍然不清楚.
我写了一个非常简单的基准:
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 && …
v8 ×10
node.js ×6
javascript ×5
c++ ×3
arm ×1
arrays ×1
clusterize ×1
core ×1
ecmascript-6 ×1
firefox ×1
gcc ×1
libuv ×1
libv8 ×1
process ×1
raspberry-pi ×1
regex ×1
rubygems ×1
templates ×1
therubyracer ×1