- 浏览: 3068227 次
- 性别:
- 来自: 海外
-
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
事实上非常容易,以至于没啥好写的。根据V8的官方文档就能顺利"as-is"构造出来。
必须的环境:
Subversion 1.4 or higher - see http://subversion.tigris.org/links.html#clients
Python 2.4 or higher - see http://www.python.org
SCons 1.0.0 or higher - see http://www.scons.org
我使用的是
Subversion 1.4.6 (r28521)
Python 2.5.1
SCons 1.0.0
Visual Studio 2008 Professional
然后,根据说明,在构造时覆盖SCons的环境参数,在V8源码的根目录执行下述指令就行:
(把VS和WinSDK装在默认路径上也不是没好处,呵呵。用scons --help可以看到其它构建选项)
执行结束后,得到release/snapshot/static版的v8.lib。
接下来想把位于samples里的shell构造出来,只要把shell.cc从samples目录复制到V8的根目录然后:
加上/O2之类的开关当然也是可以的咯。
直接通过SCons脚本也可以构造出shell:
然后可以开shell这样玩:
更多选项可以用shell_g --help得到。
在V8的tools\visual_studio\目录里有对应VS2005的solution文件,于是通过VS IDE也可以浏览V8代码,编辑,构建。
阅读V8的源码是件开心的事;代码风格看起来相当不错,至少很合我的偏好。里面借鉴Strongtalk等的技巧也让人很兴奋。有时间一定要仔细看看。
===========================================================================
Alright,来玩玩看。
下面一图是V8 0.3.4 vs DMDScript 1.14 vs Managed JScript (sdl-sdk 0.4.0) vs Rhino 1.7R1 vs JScript 5.7做同一个测试的比较:
(图缩小了的话点击放大)
从数字上看,至少现在的Managed JScript比06年底的JScript要快了,即便前者运行在.NET上而后者是native的。但它们的速度都远远比不上V8……时间差了一位啊 - -
新的JavaScript引擎真可怕。
sieve.js/ds/jsx来自DMDScript自带的sieve.ds测试文件,内容为:
纯啃数字的microbenchmark
需要说明的几点:
1、Benchmarks are nothing more than lies damn lies.这个是真理。但至少从图中数字可以看出不同实现间在这个特定例子下的速度差异。
2、关于运行环境:
用来测试的机器是运行在Intel Pentium-M 715 (Dothan核心,1.50GHz)+1248MB内存上的Windows XP SP3。
JVM是Sun的HotSpot Client VM
.NET Framework是3.5 SP1。
采用client的JVM是因为这个例子运行时间太短,如果使用-server反而会更慢(数值上显示出来是1000+);Rhino的-opt在这里也没有多少作用,开了-opt 9之后执行这个例子的时间也没变化。
3、给不熟悉这几个引擎的简单介绍一下:
V8是Google新推出的浏览器Chrome中使用的JavaScript引擎,用C++编写。发布于2008年9月;
DMDScript是Digital Mars开发的一种ECMAScript 3的实现,用D语言编写。也有C++编写的版本,上面例子里用的就是C++版的。发布于2007年9月;
Managed JScript是微软在DLR平台上的ECMAScript 3的实现,用C#编写,运行在.NET Framework上。我测试用的版本来自Silverlight Dynamic Languages SDK 0.4.0(稍做修改,让它能在普通的.NET Framework 2.0而不是Silverlight 2.0 RC0中运行)。发布于2008年10月;
Rhino 1.7R1是Mozilla基于JVM开发的JavaScript 1.7实现,用Java编写。发布于2008年3月。很明显这个版本还不可能用上原型阶段的invokedynamic;
JScript 5.7是微软的另一个ECMAScript 3实现,我不太清楚它是C还是C++写的,不过它暴露了COM接口。IE7使用的JScript引擎就是它。发布于2006年11月。虽然是很老了,但现在IE8还没正式推出,只好用它来测。要在WSH里运行上面的测试,需要把print()改为WScript.Echo()。
4. 为什么不拿SquirrelFish Extreme和TraceMonkey来测?
答:因为我懒得单独build它们……以后有机会再说;虽说不自己build可以用它们各自所属的浏览器最新的nightly builds,但我也不想装nightly build的Safari和FireFox 3.1。
5. 那么JScript.NET (JScript 8.0)呢?
答:我测了,大概在600上下。这玩儿微软已经放弃了,所以没放在图里比较。这静态编译了的JScript.NET居然比动态编译的Managed JScript还慢 T T
要在JScript.NET上运行上述测试,需要在文件开头添加import System,然后把print()换为Console.WriteLine();同时还要用var语句显式声明所有变量。
开了/fast开关来编译的话,JScript.NET运行上述测试的时间降到500左右,但还是比Managed JScript稍微慢一些。
===============================================
2015-04更新:
在Mac OS X上build现在最新的V8的话,可以按照官网说明,这样:
这样可以build出我需要的d8 shell,在out/native/d8。
但“有趣”的是print_ast居然只在ia32 target上有,而在x64 target上没有。太诡异了吧?
赐教不敢。确实,用我build出来的shell来跑那句 print("中文"); 的话显示出来的是乱码。这大概是因为V8的shell中的print函数使用的字符编码与中文Windows的字符编码不匹配导致的。等我回家看看具体的,现在在这边没build环境……我猜在shell的print函数临输出前加一个WideCharToMultiByte()的调用就好了。
必须的环境:
Subversion 1.4 or higher - see http://subversion.tigris.org/links.html#clients
Python 2.4 or higher - see http://www.python.org
SCons 1.0.0 or higher - see http://www.scons.org
我使用的是
Subversion 1.4.6 (r28521)
Python 2.5.1
SCons 1.0.0
Visual Studio 2008 Professional
然后,根据说明,在构造时覆盖SCons的环境参数,在V8源码的根目录执行下述指令就行:
引用
scons env="PATH:C:\Program Files\Microsoft Visual Studio 9.0\VC\bin;C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE;C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools,INCLUDE:C:\Program Files\Microsoft Visual Studio 9.0\VC\include;C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include,LIB:C:\Program Files\Microsoft Visual Studio 9.0\VC\lib;C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib"
(把VS和WinSDK装在默认路径上也不是没好处,呵呵。用scons --help可以看到其它构建选项)
执行结束后,得到release/snapshot/static版的v8.lib。
接下来想把位于samples里的shell构造出来,只要把shell.cc从samples目录复制到V8的根目录然后:
引用
cl /Iinclude shell.cc v8.lib
加上/O2之类的开关当然也是可以的咯。
直接通过SCons脚本也可以构造出shell:
scons env="PATH:C:\Program Files\Microsoft Visual Studio 9.0\VC\bin;C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE;C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools,INCLUDE:C:\Program Files\Microsoft Visual Studio 9.0\VC\include;C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include,LIB:C:\Program Files\Microsoft Visual Studio 9.0\VC\lib;C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib" snapshot=on mode=debug console=readline disassembler=on sample=shell
然后可以开shell这样玩:
shell_g.exe --print_code
V8 version 2.0.0 > var i = 1 --- Raw source --- var i = 1 --- Code --- kind = FUNCTION Instructions (size = 63) 01802EA0 0 55 push ebp 01802EA1 1 89e5 mov ebp,esp 01802EA3 3 56 push esi 01802EA4 4 57 push edi 01802EA5 5 6829013c00 push 0x3c0129 ;; object: 003C0129 <undefined> 01802EAA 10 56 push esi 01802EAB 11 680d2d1d00 push 0x1d2d0d ;; object: 001D2D0D <FixedArray[2]> 01802EB0 16 6a00 push 0x0 01802EB2 18 e86901ffff call 017F3020 ;; debug: statement 0 ;; code: STUB, Runtime, RuntimeStub_DeclareGlobals 01802EB7 23 3b25400d7400 cmp esp,[0x740d40] 01802EBD 29 0f8305000000 jnc 40 (01802EC8) 01802EC3 35 e8d8d5feff call 017F04A0 ;; code: STUB, StackCheck, minor: 0 01802EC8 40 68b1293c00 push 0x3c29b1 ;; object: 003C29B1 <String[1]: i> 01802ECD 45 6a02 push 0x2 01802ECF 47 e88cd5feff call 017F0460 ;; code: STUB, Runtime, RuntimeStub_InitializeVarGlobal 01802ED4 52 b829013c00 mov eax,003C0129 ;; object: 003C0129 <undefined> 01802ED9 57 89ec mov esp,ebp ;; debug: statement 10 ;; js return 01802EDB 59 5d pop ebp 01802EDC 60 c20400 ret 0x4 RelocInfo (size = 13) 01802EA6 embedded object (003C0129 <undefined>) 01802EAC embedded object (001D2D0D <FixedArray[2]>) 01802EB2 statement position (0) 01802EB3 code target (STUB) (017F3020) 01802EC4 code target (STUB) (017F04A0) 01802EC9 embedded object (003C29B1 <String[1]: i>) 01802ED0 code target (STUB) (017F0460) 01802ED5 embedded object (003C0129 <undefined>) 01802ED9 statement position (10) 01802ED9 js return > i + 2 --- Raw source --- i + 2 --- Code --- kind = FUNCTION Instructions (size = 71) 018030A0 0 55 push ebp 018030A1 1 89e5 mov ebp,esp 018030A3 3 56 push esi 018030A4 4 57 push edi 018030A5 5 6829013c00 push 0x3c0129 ;; object: 003C0129 <undefined> 018030AA 10 3b25400d7400 cmp esp,[0x740d40] 018030B0 16 0f8305000000 jnc 27 (018030BB) 018030B6 22 e8e5d3feff call 017F04A0 ;; debug: statement 0 ;; code: STUB, StackCheck, minor: 0 018030BB 27 ff7617 push [esi+0x17] 018030BE 30 b9b1293c00 mov ecx,003C29B1 ;; object: 003C29B1 <String[1]: i> 018030C3 35 e8f82dffff call LoadIC_Initialize (017F5EC0) ;; code: contextual, LOAD_IC, UNINITIALIZED 018030C8 40 90 nop 018030C9 41 890424 mov [esp],eax 018030CC 44 6a04 push 0x4 018030CE 46 e86dfeffff call 01802F40 ;; code: STUB, GenericBinaryOp, minor: 4240 018030D3 51 50 push eax 018030D4 52 8f45f4 pop [ebp+0xf4] 018030D7 55 8b45f4 mov eax,[ebp+0xf4] 018030DA 58 89ec mov esp,ebp ;; js return 018030DC 60 5d pop ebp 018030DD 61 c20400 ret 0x4 018030E0 64 b829013c00 mov eax,003C0129 ;; object: 003C0129 <undefined> 018030E5 69 ebf3 jmp 58 (018030DA) RelocInfo (size = 11) 018030A6 embedded object (003C0129 <undefined>) 018030B6 statement position (0) 018030B7 code target (STUB) (017F04A0) 018030BF embedded object (003C29B1 <String[1]: i>) 018030C4 code target (context) (LOAD_IC) (017F5EC0) 018030CF code target (STUB) (01802F40) 018030DA js return 018030E1 embedded object (003C0129 <undefined>) 3 > quit() --- Raw source --- quit() --- Code --- kind = FUNCTION Instructions (size = 65) 01803140 0 55 push ebp 01803141 1 89e5 mov ebp,esp 01803143 3 56 push esi 01803144 4 57 push edi 01803145 5 6829013c00 push 0x3c0129 ;; object: 003C0129 <undefined> 0180314A 10 3b25400d7400 cmp esp,[0x740d40] 01803150 16 0f8305000000 jnc 27 (0180315B) 01803156 22 e845d3feff call 017F04A0 ;; debug: statement 0 ;; code: STUB, StackCheck, minor: 0 0180315B 27 6829333c00 push 0x3c3329 ;; object: 003C3329 <String[4]: quit> 01803160 32 ff7617 push [esi+0x17] 01803163 35 e8f81bffff call 017F4D60 ;; code: contextual, CALL_IC, UNINITIALIZED, argc = 0 01803168 40 8b75fc mov esi,[ebp+0xfc] 0180316B 43 890424 mov [esp],eax 0180316E 46 8f45f4 pop [ebp+0xf4] 01803171 49 8b45f4 mov eax,[ebp+0xf4] 01803174 52 89ec mov esp,ebp ;; js return 01803176 54 5d pop ebp 01803177 55 c20400 ret 0x4 0180317A 58 b829013c00 mov eax,003C0129 ;; object: 003C0129 <undefined> 0180317F 63 ebf3 jmp 52 (01803174) RelocInfo (size = 10) 01803146 embedded object (003C0129 <undefined>) 01803156 statement position (0) 01803157 code target (STUB) (017F04A0) 0180315C embedded object (003C3329 <String[4]: quit>) 01803164 code target (context) (CALL_IC) (017F4D60) 01803174 js return 0180317B embedded object (003C0129 <undefined>) --- Raw source --- (a){ if(%_IsSmi(a))return a; return %NumberToJSInt32(ToNumber(a)); } --- Code --- kind = FUNCTION name = ToInt32 Instructions (size = 72) 01803220 0 55 push ebp 01803221 1 8bec mov ebp,esp 01803223 3 56 push esi 01803224 4 57 push edi 01803225 5 3b25400d7400 cmp esp,[0x740d40] 0180322B 11 0f822d000000 jc 62 (0180325E) 01803231 17 8b4508 mov eax,[ebp+0x8] 01803234 20 a801 test al,0x1 01803236 22 0f8506000000 jnz 34 (01803242) 0180323C 28 8be5 mov esp,ebp ;; debug: statement 8356 ;; js return 0180323E 30 5d pop ebp 0180323F 31 c20800 ret 0x8 01803242 34 8b5e17 mov ebx,[esi+0x17] 01803245 37 6829023c00 push 0x3c0229 ;; object: 003C0229 <String[8]: ToNumber> 0180324A 42 53 push ebx 0180324B 43 50 push eax 0180324C 44 e86fe1feff call 017F13C0 ;; debug: statement 8366 ;; debug: position 8390 ;; code: contextual, CALL_IC, UNINITIALIZED, in_loop, argc = 1 01803251 49 8b75fc mov esi,[ebp+0xfc] 01803254 52 8945f4 mov [ebp+0xf4],eax 01803257 55 e884ffffff call 018031E0 ;; code: STUB, Runtime, RuntimeStub_NumberToJSInt32 0180325C 60 ebde jmp 28 (0180323C) 0180325E 62 e83dd2feff call 017F04A0 ;; debug: statement 8337 ;; code: STUB, StackCheck, minor: 0 01803263 67 8b7df8 mov edi,[ebp+0xf8] 01803266 70 ebc9 jmp 17 (01803231) RelocInfo (size = 20) 0180323C statement position (8356) 0180323C js return 01803246 embedded object (003C0229 <String[8]: ToNumber>) 0180324C statement position (8366) 0180324C position (8390) 0180324D code target (context) (CALL_IC) (017F13C0) 01803258 code target (STUB) (018031E0) 0180325E statement position (8337) 0180325F code target (STUB) (017F04A0)
更多选项可以用shell_g --help得到。
在V8的tools\visual_studio\目录里有对应VS2005的solution文件,于是通过VS IDE也可以浏览V8代码,编辑,构建。
阅读V8的源码是件开心的事;代码风格看起来相当不错,至少很合我的偏好。里面借鉴Strongtalk等的技巧也让人很兴奋。有时间一定要仔细看看。
===========================================================================
Alright,来玩玩看。
下面一图是V8 0.3.4 vs DMDScript 1.14 vs Managed JScript (sdl-sdk 0.4.0) vs Rhino 1.7R1 vs JScript 5.7做同一个测试的比较:

(图缩小了的话点击放大)
从数字上看,至少现在的Managed JScript比06年底的JScript要快了,即便前者运行在.NET上而后者是native的。但它们的速度都远远比不上V8……时间差了一位啊 - -
新的JavaScript引擎真可怕。
sieve.js/ds/jsx来自DMDScript自带的sieve.ds测试文件,内容为:
/* Eratosthenes Sieve prime number calculation. */ size = 8190; sizepl = 8191; var flags = new Array(sizepl); var i, prime, k, count, iter; print("10 iterations\n"); starttime = new Date(); for (iter = 1; iter <= 10; iter++) { count = 0; for (i = 0; i <= size; i++) flags[i] = true; for (i = 0; i <= size; i++) { if (flags[i]) { prime = i + i + 3; k = i + prime; while (k <= size) { flags[k] = false; k += prime; } count += 1; } } } elapsedtime = new Date() - starttime; print("\n" + count + " primes\n"); print("elapsed time = " + elapsedtime + "\n");
纯啃数字的microbenchmark
需要说明的几点:
1、Benchmarks are nothing more than lies damn lies.这个是真理。但至少从图中数字可以看出不同实现间在这个特定例子下的速度差异。
2、关于运行环境:
用来测试的机器是运行在Intel Pentium-M 715 (Dothan核心,1.50GHz)+1248MB内存上的Windows XP SP3。
JVM是Sun的HotSpot Client VM
引用
java version "1.6.0_05"
Java(TM) SE Runtime Environment (build 1.6.0_05-b13)
Java HotSpot(TM) Client VM (build 10.0-b19, mixed mode, sharing)
Java(TM) SE Runtime Environment (build 1.6.0_05-b13)
Java HotSpot(TM) Client VM (build 10.0-b19, mixed mode, sharing)
.NET Framework是3.5 SP1。
采用client的JVM是因为这个例子运行时间太短,如果使用-server反而会更慢(数值上显示出来是1000+);Rhino的-opt在这里也没有多少作用,开了-opt 9之后执行这个例子的时间也没变化。
3、给不熟悉这几个引擎的简单介绍一下:
V8是Google新推出的浏览器Chrome中使用的JavaScript引擎,用C++编写。发布于2008年9月;
DMDScript是Digital Mars开发的一种ECMAScript 3的实现,用D语言编写。也有C++编写的版本,上面例子里用的就是C++版的。发布于2007年9月;
Managed JScript是微软在DLR平台上的ECMAScript 3的实现,用C#编写,运行在.NET Framework上。我测试用的版本来自Silverlight Dynamic Languages SDK 0.4.0(稍做修改,让它能在普通的.NET Framework 2.0而不是Silverlight 2.0 RC0中运行)。发布于2008年10月;
Rhino 1.7R1是Mozilla基于JVM开发的JavaScript 1.7实现,用Java编写。发布于2008年3月。很明显这个版本还不可能用上原型阶段的invokedynamic;
JScript 5.7是微软的另一个ECMAScript 3实现,我不太清楚它是C还是C++写的,不过它暴露了COM接口。IE7使用的JScript引擎就是它。发布于2006年11月。虽然是很老了,但现在IE8还没正式推出,只好用它来测。要在WSH里运行上面的测试,需要把print()改为WScript.Echo()。
4. 为什么不拿SquirrelFish Extreme和TraceMonkey来测?
答:因为我懒得单独build它们……以后有机会再说;虽说不自己build可以用它们各自所属的浏览器最新的nightly builds,但我也不想装nightly build的Safari和FireFox 3.1。
5. 那么JScript.NET (JScript 8.0)呢?
答:我测了,大概在600上下。这玩儿微软已经放弃了,所以没放在图里比较。这静态编译了的JScript.NET居然比动态编译的Managed JScript还慢 T T
要在JScript.NET上运行上述测试,需要在文件开头添加import System,然后把print()换为Console.WriteLine();同时还要用var语句显式声明所有变量。
开了/fast开关来编译的话,JScript.NET运行上述测试的时间降到500左右,但还是比Managed JScript稍微慢一些。
===============================================
2015-04更新:
在Mac OS X上build现在最新的V8的话,可以按照官网说明,这样:
make native mode=debug console=readline snapshot=on -j4 disassembler=on gdbjit=on objectprint=on
这样可以build出我需要的d8 shell,在out/native/d8。
但“有趣”的是print_ast居然只在ia32 target上有,而在x64 target上没有。太诡异了吧?
V8 version 4.4.0 (candidate) [console: readline] d8> function f1() { print("f1") } --- Raw source --- function f1() { print("f1") } --- Code --- source_position = 0 kind = FUNCTION Instructions (size = 148) 0xb7f8c00f8c0 0 488b4c2408 REX.W movq rcx,[rsp+0x8] 0xb7f8c00f8c5 5 493b4da8 REX.W cmpq rcx,[r13-0x58] 0xb7f8c00f8c9 9 750d jnz 24 (0xb7f8c00f8d8) 0xb7f8c00f8cb 11 488b4e27 REX.W movq rcx,[rsi+0x27] 0xb7f8c00f8cf 15 488b4927 REX.W movq rcx,[rcx+0x27] 0xb7f8c00f8d3 19 48894c2408 REX.W movq [rsp+0x8],rcx 0xb7f8c00f8d8 24 55 push rbp 0xb7f8c00f8d9 25 4889e5 REX.W movq rbp,rsp 0xb7f8c00f8dc 28 56 push rsi 0xb7f8c00f8dd 29 57 push rdi 0xb7f8c00f8de 30 56 push rsi 0xb7f8c00f8df 31 49ba6165e8491b090000 REX.W movq r10,0x91b49e86561 ;; object: 0x91b49e86561 <FixedArray[2]> 0xb7f8c00f8e9 41 4152 push r10 0xb7f8c00f8eb 43 6a00 push 0x0 0xb7f8c00f8ed 45 b803000000 movl rax,0x3 0xb7f8c00f8f2 50 48bb70c3530001000000 REX.W movq rbx,0x10053c370 ;; v8::internal::Runtime_DeclareGlobals(int, v8::internal::Object**, v8::internal::Isolate*) 0xb7f8c00f8fc 60 e8bf85efff call 0xb7f8bf07ec0 ;; debug: statement 0 ;; code: STUB, CEntryStub, minor: 0 0xb7f8c00f901 65 493ba520080000 REX.W cmpq rsp,[r13+0x820] 0xb7f8c00f908 72 7305 jnc 79 (0xb7f8c00f90f) 0xb7f8c00f90a 74 e8511ff2ff call StackCheck (0xb7f8bf31860) ;; code: BUILTIN 0xb7f8c00f90f 79 498b45a8 REX.W movq rax,[r13-0x58] 0xb7f8c00f913 83 48bbc164e8491b090000 REX.W movq rbx,0x91b49e864c1 ;; object: 0x91b49e864c1 Cell for 6144 0xb7f8c00f91d 93 83430bd1 addl [rbx+0xb],0xd1 0xb7f8c00f921 97 791f jns 130 (0xb7f8c00f942) 0xb7f8c00f923 99 50 push rax 0xb7f8c00f924 100 e8f71df2ff call InterruptCheck (0xb7f8bf31720) ;; code: BUILTIN 0xb7f8c00f929 105 58 pop rax 0xb7f8c00f92a 106 48bbc164e8491b090000 REX.W movq rbx,0x91b49e864c1 ;; object: 0x91b49e864c1 Cell for 6144 0xb7f8c00f934 116 49ba0000000000180000 REX.W movq r10,0x180000000000 0xb7f8c00f93e 126 4c895307 REX.W movq [rbx+0x7],r10 0xb7f8c00f942 130 488be5 REX.W movq rsp,rbp ;; debug: statement 28 ;; js return 0xb7f8c00f945 133 5d pop rbp 0xb7f8c00f946 134 c20800 ret 0x8 0xb7f8c00f949 137 cc int3 0xb7f8c00f94a 138 cc int3 0xb7f8c00f94b 139 cc int3 0xb7f8c00f94c 140 cc int3 0xb7f8c00f94d 141 cc int3 0xb7f8c00f94e 142 cc int3 0xb7f8c00f94f 143 90 nop Deoptimization Output Data (deopt points = 0) Back edges (size = 0) ast_id pc_offset loop_depth 0x91b49e865a1: [TypeFeedbackInfo] - ic_total_count: 0, ic_with_type_info_count: 0, ic_generic_count: 0 RelocInfo (size = 12) 0xb7f8c00f8e1 embedded object (0x91b49e86561 <FixedArray[2]>) 0xb7f8c00f8fc statement position (0) 0xb7f8c00f8fd code target (STUB) (0xb7f8bf07ec0) 0xb7f8c00f90b code target (BUILTIN) (0xb7f8bf31860) 0xb7f8c00f915 embedded object (0x91b49e864c1 Cell for 6144) 0xb7f8c00f925 code target (BUILTIN) (0xb7f8bf31720) 0xb7f8c00f92c embedded object (0x91b49e864c1 Cell for 6144) 0xb7f8c00f942 statement position (28) 0xb7f8c00f942 js return --- End code ---
- shell_g.zip (1004.2 KB)
- 下载次数: 29
- d8.zip (1 MB)
- 下载次数: 28
评论
4 楼
srdrm
2010-05-04
good, 你说v8代码好, 我也想看看
3 楼
RednaxelaFX
2010-01-21
liang.itjob 写道
不知楼主有没有试过中文,如
显示出来的全部都是乱码,不知道怎么解决,望楼主赐教
print("中文");
显示出来的全部都是乱码,不知道怎么解决,望楼主赐教
赐教不敢。确实,用我build出来的shell来跑那句 print("中文"); 的话显示出来的是乱码。这大概是因为V8的shell中的print函数使用的字符编码与中文Windows的字符编码不匹配导致的。等我回家看看具体的,现在在这边没build环境……我猜在shell的print函数临输出前加一个WideCharToMultiByte()的调用就好了。
2 楼
liang.itjob
2010-01-20
不知楼主有没有试过中文,如
显示出来的全部都是乱码,不知道怎么解决,望楼主赐教
print("中文");
显示出来的全部都是乱码,不知道怎么解决,望楼主赐教
1 楼
lyo1005
2009-05-29


发表评论
-
The Prehistory of Java, HotSpot and Train
2014-06-02 08:18 0http://cs.gmu.edu/cne/itcore/vi ... -
MSJVM and Sun 1.0.x/1.1.x
2014-05-20 18:50 0当年的survey paper: http://www.sym ... -
Sun JDK1.4.2_28有TieredCompilation
2014-05-12 08:48 0原来以前Sun的JDK 1.4.2 update 28就已经有 ... -
IBM JVM notes (2014 ver)
2014-05-11 07:16 0Sovereign JIT http://publib.bou ... -
class data sharing by Apple
2014-03-28 05:17 0class data sharing is implement ... -
HotSpot Server VM与Server Class Machine
2014-02-18 13:21 0HotSpot VM历来有Client VM与Server V ... -
Java 8的lambda表达式在OpenJDK8中的实现
2014-02-04 12:08 0三月份JDK8就要发布首发了,现在JDK8 release c ... -
GC stack map与deopt stack map的异同
2014-01-08 09:56 0两者之间不并存在包含关系。它们有交集,但也各自有特别的地方。 ... -
HotSpot Server Compiler与data-flow analysis
2014-01-07 17:41 0http://en.wikipedia.org/wiki/Da ... -
基于LLVM实现VM的JIT的一些痛点
2014-01-07 17:25 0同事Philip Reames Sanjoy Das http ... -
tailcall notes
2013-12-27 07:42 0http://blogs.msdn.com/b/clrcode ... -
《自制编程语言》的一些笔记
2013-11-24 00:20 0http://kmaebashi.com/programmer ... -
字符串的一般封装方式的内存布局 (1): 元数据与字符串内容,整体还是分离?
2013-11-07 17:44 22466(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局 (0): 拿在手上的是什么
2013-11-04 18:22 21562(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局
2013-11-01 12:55 0(Disclaimer:未经许可请 ... -
关于string,内存布局,C++ std::string,CoW
2013-10-30 20:45 0(Disclaimer:未经许可请 ... -
Function.prototype.bind
2013-09-24 18:07 0polyfill http://stackoverflow. ... -
Java的instanceof是如何实现的
2013-09-22 16:57 0Java语言规范,Java SE 7版 http://docs ... -
也谈类型: 数据, 类型, 标签
2013-08-18 01:59 0numeric tower http://en.wikiped ... -
oop、klass、handle的关系
2013-07-30 17:34 0oopDesc及其子类的实例 oop : oopDesc* ...
相关推荐
在实际开发中,这个项目可能会使用Webpack或Create React App等工具进行构建和打包,以便部署到生产环境。同时,为了数据持久化,可能还会使用数据库,如MongoDB或SQLite来存储食谱信息。 总的来说,"recipe-app...
Java初学小作业,文件操作
本工具用于在支持无线网络的电脑上输入SSID和密码后一键创建WIFI热点
4.3 信息检索与问题解决 openmv+STM32串口通信 openmv串口通信openmv识别物体 openmv神经网络训练 openmv openmv+STM32串口通信 op
内容概要:本文详细探讨了EKF(扩展卡尔曼滤波)算法与传统里程计算法在机器人轨迹定位和跟踪中的性能差异。文中通过具体代码实例展示了两种方法的工作原理,并通过实验数据对比了两者的定位精度。里程计算法由于误差累积问题,定位精度较低,平均误差达到1.0283米;而EKF算法通过融合多种传感器数据并不断修正,显著提高了定位精度,平均误差仅为0.0716米。此外,文章还讨论了EKF算法的局限性和应用场景。 适合人群:从事机器人研究、开发的技术人员,尤其是关注机器人定位和导航系统的工程师。 使用场景及目标:适用于需要高精度机器人定位和跟踪的应用场景,如自动驾驶、仓储物流自动化等。目标是帮助技术人员选择合适的定位算法,优化机器人系统的性能。 其他说明:尽管EKF算法在大多数情况下表现出色,但在某些极端条件下(如急转弯)仍可能存在误差,此时可以考虑使用更高级的滤波算法,如UKF(无迹卡尔曼滤波)。
1、该资源内项目代码经过严格调试,下载即用确保可以运行! 2、该资源适合计算机相关专业(如计科、人工智能、大数据、数学、电子信息等)正在做课程设计、期末大作业和毕设项目的学生、或者相关技术学习者作为学习资料参考使用。 3、该资源包括全部源码,需要具备一定基础才能看懂并调试代码。 大学生创新创业项目-基于微信小程序的一款模拟面试软件源码(使用微信Web开发者工具来实现用在线答题,支持在线面试(视频面试),可以观看面试视频,可以投简历,随时刷新招聘的信息、发布招聘信息、收藏文章等功能).zip 大学生创新创业项目-基于微信小程序的一款模拟面试软件源码(使用微信Web开发者工具来实现用在线答题,支持在线面试(视频面试),可以观看面试视频,可以投简历,随时刷新招聘的信息、发布招聘信息、收藏文章等功能).zip 大学生创新创业项目-基于微信小程序的一款模拟面试软件源码(使用微信Web开发者工具来实现用在线答题,支持在线面试(视频面试),可以观看面试视频,可以投简历,随时刷新招聘的信息、发布招聘信息、收藏文章等功能).zip 大学生创新创业项目-基于微信小程序的一款模拟面试软件源码(使用微信Web开发者工具来实现用在线答题,支持在线面试(视频面试),可以观看面试视频,可以投简历,随时刷新招聘的信息、发布招聘信息、收藏文章等功能).zip 大学生创新创业项目-基于微信小程序的一款模拟面试软件源码(使用微信Web开发者工具来实现用在线答题,支持在线面试(视频面试),可以观看面试视频,可以投简历,随时刷新招聘的信息、发布招聘信息、收藏文章等功能).zip
# 基于Go语言的数据库智能迁移工具 ## 项目简介 本项目是一个基于Go语言的数据库智能迁移工具,旨在帮助开发者方便、高效地进行数据库版本管理和迁移。通过简单的配置和SQL脚本,用户可以轻松地进行数据库结构的更新和数据的迁移。 ## 项目的主要特性和功能 1. 支持多种数据库涵盖MySQL、PostgreSQL,可按需选择。 2. 配置文件解析解析YAML格式配置文件,获取数据库连接、迁移目录、日志路径等参数。 3. 迁移文件过滤忽略以"ignore"开头的SQL文件,避免误执行。 4. 版本管理按文件名判断版本,依版本号顺序执行迁移脚本,保证迁移连续性。 5. 自动执行SQL脚本自动执行迁移目录下SQL文件,完成数据库结构更新和数据迁移。 6. 通知功能可通过企业微信等方式发送通知,告知迁移结果或提醒异常。 7. 日志记录详细记录迁移过程日志,便于追踪排查问题。 ## 安装使用步骤 1. 已下载项目的源码文件。
本工具用于将一台电脑上的个人数据快速备份到移动介质上,然后再将备份的数据从移动介质上还原到另一台电脑中,实现用户数据的快速迁移。
内容概要:本文档详细介绍了 Ubuntu 20.04 的安装步骤,包括从下载镜像到安装后的配置。首先,用户需要访问 Ubuntu 官网下载 ISO 文件,并通过工具如 Rufus 或命令行工具 `dd` 制作启动 U 盘。接着,设置 BIOS 使 U 盘成为第一启动项,进入 Ubuntu 安装界面。在安装过程中,用户可以选择安装语言、连接网络、选择安装类型(普通或最小安装)、进行磁盘分区(可选),以及设置用户信息
数据说明: 由Landsat 08卫星拍摄的山区、森林覆盖和沙漠图像组成的数据集,为遥感分析的各种应用提供了宝贵的资源。每幅图像的分辨率为256x256像素,比例尺范围为2公里至50公里每厘米,该数据集提供了高细节水平和覆盖范围,可用于分类和分割任务。 对于这个数据集,一个潜在的开发想法是实施机器学习模型,用于自动分类图像中的土地覆盖类型。通过在这个数据集上训练深度学习网络,可以创建一个能够准确识别和分类不同土地覆盖类别的模型,例如山脉、森林和沙漠。这将对环境监测、土地利用规划和保护工作产生重大影响。 该数据集的另一个可能应用是在变化检测分析领域。通过比较在不同时间点拍摄的图像,可以识别和分析土地覆盖模式的变化,如森林砍伐、城市化或自然灾害。这些信息可用干评估人类活动对环境的影响,监测植被健康状况的变化或预测土地覆盖动态的未来趋势。 此外,该数据集可用于开发图像分割算法,这涉及将图像划分为多个区域或感兴趣的对象。通过对这一数据集应用先进的图像处理技术,将有可能在图像中准确划定不同土地覆被类型的界限,从而能够对数据进行更详细的分析和解释。
内容概要:本文详细介绍了选区激光熔化(SLM)和电子束选区熔化(EBM)这两种增材制造技术的热源模拟方法。文中首先解释了这两种技术的基本原理及其面临的挑战,即如何精确控制热源分布和热影响区。随后,文章重点讨论了高斯热源模型的应用,包括其数学表达式以及在ANSYS Fluent中的具体实现方式。此外,还探讨了模拟过程中需要注意的关键点,如网格划分、边界条件和材料属性的设定。最后,通过一个具体的SLM模拟案例展示了整个模拟流程,并给出了实用的操作建议和技术细节。 适合人群:从事增材制造领域的研究人员、工程师以及相关专业的学生。 使用场景及目标:适用于希望通过数值模拟优化SLM和EBM工艺参数的研究人员和工程师,旨在提高成形件质量并降低成本。同时,也为初学者提供了一套完整的模拟指南。 其他说明:文章不仅提供了理论知识,还包括了大量的实践经验和代码示例,有助于读者更好地理解和掌握热源模拟的技术要点。
内容概要:本文详细介绍了永磁同步电机(PMSM)负载转矩估计的研究背景及其重要性,重点讨论了几种经典负载估计方法,包括卡尔曼滤波、离散卡尔曼滤波和Luenberger龙博格观测器。文中不仅提供了理论解释,还展示了具体的MATLAB/Simulink仿真模型,涵盖负载转矩测量、预测及转矩预测等功能。此外,文章深入探讨了负载自适应、转矩估计、电机转速闭环控制等关键技术的融合,强调了这些技术在实现PMSM高性能控制中的协同作用。通过实际案例和实验数据,验证了不同方法的有效性和优劣。 适合人群:从事电机控制、自动化工程及相关领域的研究人员和技术人员,尤其是对永磁同步电机负载转矩估计感兴趣的读者。 使用场景及目标:适用于希望深入了解PMSM负载转矩估计方法及其仿真的科研工作者和工程师。目标是掌握卡尔曼滤波、Luenberger观测器等技术的具体实现,提升电机控制系统的性能和稳定性。 其他说明:文章提供了详细的仿真模型和代码片段,便于读者理解和复现实验结果。同时,针对实际应用中的常见问题给出了优化建议,帮助读者避免常见的错误和陷阱。
# 基于TensorFlow.js和Angular的表情分类应用 ## 项目简介 本项目是一个使用TensorFlow.js和Angular构建的表情分类应用。它通过机器学习和图像识别技术,帮助用户理解和预测他人的情绪表达。这是一个有趣且实用的工具,特别是在人际交往过程中,可以帮助你更好地理解他人的情绪和意图。 ## 项目的主要特性和功能 1. 表情识别: 通过摄像头实时捕捉图像,应用机器学习模型进行表情识别。 2. 简单的用户界面: 用户界面设计简洁明了,易于操作。 3. 训练模型: 用户可以通过点击不同的类别来录入图像,训练模型以识别不同的表情。 4. 实时反馈: 训练完毕后,应用会实时分析摄像头的图像,并给出最可能的表情类别。 ## 安装使用步骤
QxEntityEditor 1.2.8 64位 MacOS程序安装包,QxOrm图形化编辑工具。官网无法访问,加速下载。
《前后端分离的图书管理系统源码资源简介》 本资源包含前后端分离的图书管理系统新版源码、详细说明以及数据库文件,是一份极具学习价值的优质资源。 在前端方面,采用现代化的前端技术框架构建用户界面,具备简洁美观、交互友好的特点,能为用户提供流畅的操作体验,如便捷的图书查询、借阅操作等。后端则运用成熟的技术栈,实现系统的核心业务逻辑,包括对图书信息、用户信息的管理,以及借阅流程的处理等,确保系统的高效稳定运行。 详细说明文档对系统的各个功能模块、代码结构、关键技术点进行了详细解读,有助于学习者快速理解系统的设计思路和实现原理。数据库文件则为系统提供了数据存储支持,其设计合理,能满足图书管理系统的数据需求。 本资源为学习者提供了一个实际的项目案例,通过学习和研究该资源,可深入了解前后端分离的开发模式、相关技术的应用,提升编程能力和项目实践水平,但请注意,本资源仅用于学习交流,严禁用于商业用途。
3.4.6-识别形状+颜色+增加最小变化阈值+增加最大变化阈值 STM32串口通信 openmv+STM32串口通信 openmv串口通信openmv识别物体 openmv神经网络训练 openmv数
matlab
内容概要:本文详细介绍了一款基于汇川H5U的转盘机程序框架,该框架集成了多个实用功能,如上下料、CCD模拟、伺服运动控制等。框架采用模块化设计,分为HMI交互层、工位调度引擎、运动控制集群和仿真沙盒四大模块。每个工位作为一个独立的状态机,便于扩展和维护。文中提供了具体的代码示例,帮助读者理解各功能的具体实现方法。此外,框架支持仿真模式,可以在没有真实硬件的情况下进行测试。 适合人群:主要针对自动化领域的初学者和希望优化编程习惯的开发者。对于新手而言,这是一个非常好的学习模板,能够帮助他们快速掌握汇川PLC编程的基本技巧和最佳实践。 使用场景及目标:①学习汇川PLC编程的基础知识和最佳实践;②通过具体案例理解状态机的概念及其在工业自动化中的应用;③利用仿真功能进行无硬件测试,提高开发效率;④掌握工位管理和伺服控制的技术细节,为复杂项目打好基础。 其他说明:该框架不仅适用于小型项目,还可以扩展到更大规模的应用,如多工位生产线。通过深入研究该框架,开发者可以提升编程技能,避免常见的编程陷阱。
内容概要:本文详细介绍了飞轮储能系统的建模方法及其在MATLAB中的仿真实现,主要针对永磁同步电机驱动的飞轮系统。文章首先解释了飞轮储能的基本概念,随后深入探讨了两种不同的运行模式:机侧网侧分家运作的结构(模型一)和机网侧协同运行(模型二)。模型一侧重于双闭环控制,强调了PI控制器的参数设置和坐标变换的正确实现;模型二则关注协同控制,特别是在能量双向流动控制和锁相环的应用方面。文中提供了多个具体的MATLAB代码片段,帮助读者理解和实现各个控制环节的关键技术。此外,文章还分享了许多实用的经验和注意事项,如求解器的选择、参数整定以及常见的调试陷阱。 适合人群:电气工程专业学生、从事电力系统研究的技术人员、对飞轮储能系统感兴趣的科研工作者。 使用场景及目标:适用于飞轮储能系统的教学、科研和工程项目预研。通过学习本文,读者可以掌握飞轮储能系统的建模方法,理解永磁同步电机驱动的具体实现方式,并能够在MATLAB/Simulink环境中进行有效的仿真。 其他说明:文章不仅提供了详细的理论讲解和技术指导,还附带了大量的代码实例和实践经验,有助于读者更好地理解和应用相关知识。