`
RednaxelaFX
  • 浏览: 3068227 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

在WinXP上构建V8

阅读更多
事实上非常容易,以至于没啥好写的。根据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源码的根目录执行下述指令就行:
引用
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)

.NET Framework是3.5 SP1。
采用client的JVM是因为这个例子运行时间太短,如果使用-server反而会更慢(数值上显示出来是1000+);Rhino的-opt在这里也没有多少作用,开了-opt 9之后执行这个例子的时间也没变化。

3、给不熟悉这几个引擎的简单介绍一下:
V8Google新推出的浏览器Chrome中使用的JavaScript引擎,用C++编写。发布于2008年9月;
DMDScriptDigital 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 ---
  • 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  
 

相关推荐

    recipe-app:简单的React&Node.js应用程序,用于查找美味食谱

    在实际开发中,这个项目可能会使用Webpack或Create React App等工具进行构建和打包,以便部署到生产环境。同时,为了数据持久化,可能还会使用数据库,如MongoDB或SQLite来存储食谱信息。 总的来说,"recipe-app...

    Java初学小作业,文件操作

    Java初学小作业,文件操作

    一键创建WiFi无线热点工具

    本工具用于在支持无线网络的电脑上输入SSID和密码后一键创建WIFI热点

    4.3 信息检索与问题解决 openmv+STM32串口通信 openmv串口通信openmv识别物体 openmv神经网络训练 openmv openmv+STM32串口通信 op.md

    4.3 信息检索与问题解决 openmv+STM32串口通信 openmv串口通信openmv识别物体 openmv神经网络训练 openmv openmv+STM32串口通信 op

    机器人轨迹定位中EKF算法与里程计算法的精度对比及应用

    内容概要:本文详细探讨了EKF(扩展卡尔曼滤波)算法与传统里程计算法在机器人轨迹定位和跟踪中的性能差异。文中通过具体代码实例展示了两种方法的工作原理,并通过实验数据对比了两者的定位精度。里程计算法由于误差累积问题,定位精度较低,平均误差达到1.0283米;而EKF算法通过融合多种传感器数据并不断修正,显著提高了定位精度,平均误差仅为0.0716米。此外,文章还讨论了EKF算法的局限性和应用场景。 适合人群:从事机器人研究、开发的技术人员,尤其是关注机器人定位和导航系统的工程师。 使用场景及目标:适用于需要高精度机器人定位和跟踪的应用场景,如自动驾驶、仓储物流自动化等。目标是帮助技术人员选择合适的定位算法,优化机器人系统的性能。 其他说明:尽管EKF算法在大多数情况下表现出色,但在某些极端条件下(如急转弯)仍可能存在误差,此时可以考虑使用更高级的滤波算法,如UKF(无迹卡尔曼滤波)。

    基于微信小程序的一款模拟面试软件源码(使用微信Web开发者工具来实现用在线答题,支持在线面试,观看面试视频,投简历,刷新招聘信息、发布招聘信息等功能).zip

    1、该资源内项目代码经过严格调试,下载即用确保可以运行! 2、该资源适合计算机相关专业(如计科、人工智能、大数据、数学、电子信息等)正在做课程设计、期末大作业和毕设项目的学生、或者相关技术学习者作为学习资料参考使用。 3、该资源包括全部源码,需要具备一定基础才能看懂并调试代码。 大学生创新创业项目-基于微信小程序的一款模拟面试软件源码(使用微信Web开发者工具来实现用在线答题,支持在线面试(视频面试),可以观看面试视频,可以投简历,随时刷新招聘的信息、发布招聘信息、收藏文章等功能).zip 大学生创新创业项目-基于微信小程序的一款模拟面试软件源码(使用微信Web开发者工具来实现用在线答题,支持在线面试(视频面试),可以观看面试视频,可以投简历,随时刷新招聘的信息、发布招聘信息、收藏文章等功能).zip 大学生创新创业项目-基于微信小程序的一款模拟面试软件源码(使用微信Web开发者工具来实现用在线答题,支持在线面试(视频面试),可以观看面试视频,可以投简历,随时刷新招聘的信息、发布招聘信息、收藏文章等功能).zip 大学生创新创业项目-基于微信小程序的一款模拟面试软件源码(使用微信Web开发者工具来实现用在线答题,支持在线面试(视频面试),可以观看面试视频,可以投简历,随时刷新招聘的信息、发布招聘信息、收藏文章等功能).zip 大学生创新创业项目-基于微信小程序的一款模拟面试软件源码(使用微信Web开发者工具来实现用在线答题,支持在线面试(视频面试),可以观看面试视频,可以投简历,随时刷新招聘的信息、发布招聘信息、收藏文章等功能).zip

    (源码)基于Go语言的数据库智能迁移工具.zip

    # 基于Go语言的数据库智能迁移工具 ## 项目简介 本项目是一个基于Go语言的数据库智能迁移工具,旨在帮助开发者方便、高效地进行数据库版本管理和迁移。通过简单的配置和SQL脚本,用户可以轻松地进行数据库结构的更新和数据的迁移。 ## 项目的主要特性和功能 1. 支持多种数据库涵盖MySQL、PostgreSQL,可按需选择。 2. 配置文件解析解析YAML格式配置文件,获取数据库连接、迁移目录、日志路径等参数。 3. 迁移文件过滤忽略以"ignore"开头的SQL文件,避免误执行。 4. 版本管理按文件名判断版本,依版本号顺序执行迁移脚本,保证迁移连续性。 5. 自动执行SQL脚本自动执行迁移目录下SQL文件,完成数据库结构更新和数据迁移。 6. 通知功能可通过企业微信等方式发送通知,告知迁移结果或提醒异常。 7. 日志记录详细记录迁移过程日志,便于追踪排查问题。 ## 安装使用步骤 1. 已下载项目的源码文件。

    数据迁移工具.exe

    本工具用于将一台电脑上的个人数据快速备份到移动介质上,然后再将备份的数据从移动介质上还原到另一台电脑中,实现用户数据的快速迁移。

    【操作系统安装】Ubuntu 20.04详细安装与配置教程:从下载到系统优化全流程指导

    内容概要:本文档详细介绍了 Ubuntu 20.04 的安装步骤,包括从下载镜像到安装后的配置。首先,用户需要访问 Ubuntu 官网下载 ISO 文件,并通过工具如 Rufus 或命令行工具 `dd` 制作启动 U 盘。接着,设置 BIOS 使 U 盘成为第一启动项,进入 Ubuntu 安装界面。在安装过程中,用户可以选择安装语言、连接网络、选择安装类型(普通或最小安装)、进行磁盘分区(可选),以及设置用户信息

    由Landsat 08卫星拍摄的7176张地形识别图像数据集

    数据说明: 由Landsat 08卫星拍摄的山区、森林覆盖和沙漠图像组成的数据集,为遥感分析的各种应用提供了宝贵的资源。每幅图像的分辨率为256x256像素,比例尺范围为2公里至50公里每厘米,该数据集提供了高细节水平和覆盖范围,可用于分类和分割任务。 对于这个数据集,一个潜在的开发想法是实施机器学习模型,用于自动分类图像中的土地覆盖类型。通过在这个数据集上训练深度学习网络,可以创建一个能够准确识别和分类不同土地覆盖类别的模型,例如山脉、森林和沙漠。这将对环境监测、土地利用规划和保护工作产生重大影响。 该数据集的另一个可能应用是在变化检测分析领域。通过比较在不同时间点拍摄的图像,可以识别和分析土地覆盖模式的变化,如森林砍伐、城市化或自然灾害。这些信息可用干评估人类活动对环境的影响,监测植被健康状况的变化或预测土地覆盖动态的未来趋势。 此外,该数据集可用于开发图像分割算法,这涉及将图像划分为多个区域或感兴趣的对象。通过对这一数据集应用先进的图像处理技术,将有可能在图像中准确划定不同土地覆被类型的界限,从而能够对数据进行更详细的分析和解释。

    增材制造中选区激光熔化与电子束选区熔化的ANSYS Fluent高斯热源模拟及应用

    内容概要:本文详细介绍了选区激光熔化(SLM)和电子束选区熔化(EBM)这两种增材制造技术的热源模拟方法。文中首先解释了这两种技术的基本原理及其面临的挑战,即如何精确控制热源分布和热影响区。随后,文章重点讨论了高斯热源模型的应用,包括其数学表达式以及在ANSYS Fluent中的具体实现方式。此外,还探讨了模拟过程中需要注意的关键点,如网格划分、边界条件和材料属性的设定。最后,通过一个具体的SLM模拟案例展示了整个模拟流程,并给出了实用的操作建议和技术细节。 适合人群:从事增材制造领域的研究人员、工程师以及相关专业的学生。 使用场景及目标:适用于希望通过数值模拟优化SLM和EBM工艺参数的研究人员和工程师,旨在提高成形件质量并降低成本。同时,也为初学者提供了一套完整的模拟指南。 其他说明:文章不仅提供了理论知识,还包括了大量的实践经验和代码示例,有助于读者更好地理解和掌握热源模拟的技术要点。

    永磁同步电机(PMSM)负载转矩估计与预测的MATLAB/Simulink仿真及卡尔曼滤波、Luenberger观测器的应用

    内容概要:本文详细介绍了永磁同步电机(PMSM)负载转矩估计的研究背景及其重要性,重点讨论了几种经典负载估计方法,包括卡尔曼滤波、离散卡尔曼滤波和Luenberger龙博格观测器。文中不仅提供了理论解释,还展示了具体的MATLAB/Simulink仿真模型,涵盖负载转矩测量、预测及转矩预测等功能。此外,文章深入探讨了负载自适应、转矩估计、电机转速闭环控制等关键技术的融合,强调了这些技术在实现PMSM高性能控制中的协同作用。通过实际案例和实验数据,验证了不同方法的有效性和优劣。 适合人群:从事电机控制、自动化工程及相关领域的研究人员和技术人员,尤其是对永磁同步电机负载转矩估计感兴趣的读者。 使用场景及目标:适用于希望深入了解PMSM负载转矩估计方法及其仿真的科研工作者和工程师。目标是掌握卡尔曼滤波、Luenberger观测器等技术的具体实现,提升电机控制系统的性能和稳定性。 其他说明:文章提供了详细的仿真模型和代码片段,便于读者理解和复现实验结果。同时,针对实际应用中的常见问题给出了优化建议,帮助读者避免常见的错误和陷阱。

    (源码)基于TensorFlow.js和Angular的表情分类应用.zip

    # 基于TensorFlow.js和Angular的表情分类应用 ## 项目简介 本项目是一个使用TensorFlow.js和Angular构建的表情分类应用。它通过机器学习和图像识别技术,帮助用户理解和预测他人的情绪表达。这是一个有趣且实用的工具,特别是在人际交往过程中,可以帮助你更好地理解他人的情绪和意图。 ## 项目的主要特性和功能 1. 表情识别: 通过摄像头实时捕捉图像,应用机器学习模型进行表情识别。 2. 简单的用户界面: 用户界面设计简洁明了,易于操作。 3. 训练模型: 用户可以通过点击不同的类别来录入图像,训练模型以识别不同的表情。 4. 实时反馈: 训练完毕后,应用会实时分析摄像头的图像,并给出最可能的表情类别。 ## 安装使用步骤

    QxEntityEditor-1.2.8-macosx

    QxEntityEditor 1.2.8 64位 MacOS程序安装包,QxOrm图形化编辑工具。官网无法访问,加速下载。

    前后端分离的图书管理系统新版源码+说明+数据库.zip

    《前后端分离的图书管理系统源码资源简介》 本资源包含前后端分离的图书管理系统新版源码、详细说明以及数据库文件,是一份极具学习价值的优质资源。 在前端方面,采用现代化的前端技术框架构建用户界面,具备简洁美观、交互友好的特点,能为用户提供流畅的操作体验,如便捷的图书查询、借阅操作等。后端则运用成熟的技术栈,实现系统的核心业务逻辑,包括对图书信息、用户信息的管理,以及借阅流程的处理等,确保系统的高效稳定运行。 详细说明文档对系统的各个功能模块、代码结构、关键技术点进行了详细解读,有助于学习者快速理解系统的设计思路和实现原理。数据库文件则为系统提供了数据存储支持,其设计合理,能满足图书管理系统的数据需求。 本资源为学习者提供了一个实际的项目案例,通过学习和研究该资源,可深入了解前后端分离的开发模式、相关技术的应用,提升编程能力和项目实践水平,但请注意,本资源仅用于学习交流,严禁用于商业用途。

    3.4.6-识别形状+颜色+增加最小变化阈值+增加最大变化阈值 STM32串口通信

    3.4.6-识别形状+颜色+增加最小变化阈值+增加最大变化阈值 STM32串口通信 openmv+STM32串口通信 openmv串口通信openmv识别物体 openmv神经网络训练 openmv数

    MATLAB 神经网络30个案例分析程序和数据.zip

    matlab

    汇川H5U转盘机程序框架详解:适用于自动化初学者的高效编程模板

    内容概要:本文详细介绍了一款基于汇川H5U的转盘机程序框架,该框架集成了多个实用功能,如上下料、CCD模拟、伺服运动控制等。框架采用模块化设计,分为HMI交互层、工位调度引擎、运动控制集群和仿真沙盒四大模块。每个工位作为一个独立的状态机,便于扩展和维护。文中提供了具体的代码示例,帮助读者理解各功能的具体实现方法。此外,框架支持仿真模式,可以在没有真实硬件的情况下进行测试。 适合人群:主要针对自动化领域的初学者和希望优化编程习惯的开发者。对于新手而言,这是一个非常好的学习模板,能够帮助他们快速掌握汇川PLC编程的基本技巧和最佳实践。 使用场景及目标:①学习汇川PLC编程的基础知识和最佳实践;②通过具体案例理解状态机的概念及其在工业自动化中的应用;③利用仿真功能进行无硬件测试,提高开发效率;④掌握工位管理和伺服控制的技术细节,为复杂项目打好基础。 其他说明:该框架不仅适用于小型项目,还可以扩展到更大规模的应用,如多工位生产线。通过深入研究该框架,开发者可以提升编程技能,避免常见的编程陷阱。

    飞轮储能系统建模与MATLAB仿真:永磁同步电机驱动详解及其应用场景

    内容概要:本文详细介绍了飞轮储能系统的建模方法及其在MATLAB中的仿真实现,主要针对永磁同步电机驱动的飞轮系统。文章首先解释了飞轮储能的基本概念,随后深入探讨了两种不同的运行模式:机侧网侧分家运作的结构(模型一)和机网侧协同运行(模型二)。模型一侧重于双闭环控制,强调了PI控制器的参数设置和坐标变换的正确实现;模型二则关注协同控制,特别是在能量双向流动控制和锁相环的应用方面。文中提供了多个具体的MATLAB代码片段,帮助读者理解和实现各个控制环节的关键技术。此外,文章还分享了许多实用的经验和注意事项,如求解器的选择、参数整定以及常见的调试陷阱。 适合人群:电气工程专业学生、从事电力系统研究的技术人员、对飞轮储能系统感兴趣的科研工作者。 使用场景及目标:适用于飞轮储能系统的教学、科研和工程项目预研。通过学习本文,读者可以掌握飞轮储能系统的建模方法,理解永磁同步电机驱动的具体实现方式,并能够在MATLAB/Simulink环境中进行有效的仿真。 其他说明:文章不仅提供了详细的理论讲解和技术指导,还附带了大量的代码实例和实践经验,有助于读者更好地理解和应用相关知识。

Global site tag (gtag.js) - Google Analytics