google v8 实战 -- 神秘的v8.vcproj

title: google v8 实战 -- 神秘的v8.vcproj

 

根据前文的说明,大家应该都可以把v8.lib编译出来了。

 

本文想再说说编译这个环节。因为区区在另外一台同样安装了VS2008和

python2.5的机器上,编译失败,而且败在v8.vcproj中的natives.cc上。打开这

个文件时要小心,连IDE都会警告说“这个文件包含巨长的文本行,可以会很慢”。

 

google的人很厚道地把natives.cc放在一个叫"generated files"的文件组中,就

说明这个文件其实是给机器读,而不是给人读的啦。

 

我们都知道,在VC工程中想自定义构建过程可以用Customize Build步骤的,当然

就要好奇看看natives.cc怎么来的。在v8工程设置中没有Customize Build步骤,

那就在js文件组中找吧~十几个.js文件,看了七八个,一个Customize Build都没

看到,怒了,直接用emacs打开v8.vcproj,用isearch才在最后一个v8native.js

中找到:

 

<File

   RelativePath="../../src/v8natives.js"

   >

  <FileConfiguration

Name="Debug|Win32"

>

<Tool

  Name="VCCustomBuildTool"

  Description="Processing js files..."

  CommandLine="./js2c.cmd ../../src &quot;$(IntDir)/DerivedSources&quot;&#x0D;&#x0A;"

  AdditionalDependencies="../../src/macros.py;../../src/runtime.js;../../src/v8natives.js;../../src/array.js;../../src/string.js;../../src/uri.js;../../src/math.js;../../src/messages.js;../../src/apinatives.js;../../src/debug-delay.js;../../src/mirror-delay.js;../../src/date-delay.js;../../src/regexp-delay.js;../../src/json-delay.js"

  Outputs="$(IntDir)/DerivedSources/natives.cc;$(IntDir)/DerivedSources/natives-empty.cc"

  />

  </FileConfiguration>

  <FileConfiguration

Name="Release|Win32"

>

<Tool

  Name="VCCustomBuildTool"

  Description="Processing js files..."

  CommandLine="./js2c.cmd ../../src &quot;$(IntDir)/DerivedSources&quot;&#x0D;&#x0A;"

  AdditionalDependencies="../../src/macros.py;../../src/runtime.js;../../src/v8natives.js;../../src/array.js;../../src/string.js;../../src/uri.js;../../src/math.js;../../src/messages.js;../../src/apinatives.js;../../src/debug-delay.js;../../src/mirror-delay.js;../../src/date-delay.js;../../src/regexp-delay.js;../../src/json-delay.js"

  Outputs="$(IntDir)/DerivedSources/natives.cc;$(IntDir)/DerivedSources/natives-empty.cc"

  />

  </FileConfiguration>

</File>

 

这个要反省一下,虽然一个一个找很慢,但是换用emacs说明区区急了点。

 

从CommandLine可以看到是js2c.cmd命令生成了natives.cc,在

AdditionalDependencies里面,所有的js文件都被加入,这就是之前找不到其它

Customize Build的原因了。如果细看js2c.cmd,会发现它其实是用js2c.py来完

成任务的。

 

js2c.py的本质上是个C++数组初始化语句代码生成器,因为py有方便的三引号语

法,用来处理文本模板和简单的宏替换是很方便的。app engine为什么就不做了

sample工程的模板呢,害得区区还得自己写make_app.py~

 

经js2c.py生成natives.cc的内容大约如下:

 

//重要注释一堆

#include "v8.h"

#include "natives.h"

namespace v8 {

namespace internal {

  static const char runtime[] = { 1...

  static const char v8natives[] = {...

  static const char array[] = { 10,...

  static const char string[] = { 10..

  static const char uri[] = { 10, 1..

  static const char math[] = { 10, ..

  static const char messages[] = { ..

  static const char apinatives[] = ..

  static const char debug[] = { 99,...

  static const char mirror[] = { 82...

  static const char date[] = { 10, ...

  static const char regexp[] = { 10...

  static const char json[] = { 10, ...

....

//后要加一下访问接口

 

 

有人问过,说为什么不直接使用win32的自定义资源呢?这没看过最初的v8,只能

说目前而言,v8不光是想跑在win32平台下,所以常量区比较平台无关一些。何况

还可以方便地用py做些中间加工呢。

 

 

如果v8.vcproj编译不过,可以用gvim(对于内存不多的机子)/emacs查看一下natives.cc,

然后再根据python版本差异修正一下js2c.py。应该就OK了。。

 

 

总的来说...............

 

 

这个 文件->数组 的技术没什么。。 不过,还有个耐看些的,就是v8_snapshot,

初略来看,这东西主要是为提升加载速度。就是把前面那个校准库的jit编译结果

序列化,那snapshot版本启动时就不用再重复编译了。有时间区区其想详细写写

这个的~

 

当然,要说明一个,这个snapshot不是非常新鲜的东西,lisp编译器很早就有了。

以前研究emacs源码时就看到过,只不过GNU的黑客管她叫dump,而不是snapshot而已。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值