I'll take a quiet life. A handshake of carbon monoxide.

0%

ChakraCore学习笔记(一):在Windows上编译ChakraCore

原创文章,转载请标明出处:Soul Orbit
本文链接地址:ChakraCore学习笔记(一):在Windows上编译ChakraCore

Chakra是Edge浏览器中的JavaScript引擎,在2016年6月份,我看到Edge的博客说,Chakra的benchmark已经超越了Chrome v8,而且看数据还不是一点半点,这件事情让我又惊讶又激动,因为这确实不容易啊,所以当时就非常好奇Chakra是怎么实现的,可是一直都抽不出时间来好好读读代码,直到现在。正好博客也已经搬迁完毕了,所以在一边阅读的过程中,正好一边写一点东西,做个笔记吧。

1. Chakra vs ChakraCore

16年年初,Chakra的源代码被开源放在了github上,项目名叫ChakraCore:https://github.com/Microsoft/ChakraCore

虽然ChakraCore具有几乎所有Chakra的功能,但是它并不是Chakra,他们之间的差别主要有两个:

  1. Chakra中有一套绑定接口用于支持浏览器和UAP,这套接口并没有暴露在ChakraCore中,但是ChakraCore提供了另外一套公开的接口JSRT用来完成同样的功能。
  2. Chakra中有一套用于支持调试的基于COM的接口,但是除了Windows以外的平台并没有COM,所以Chakra正在开发一套新的基于Json接口来支持调试

下面这张来自ChakraCore Github的图很好的说明了ChakraCore和Chakra的区别:
chakracore_componentization

随着时间的发展,现在ChakraCore已经可以在Windows,Linux和Mac上编译和运行。这个我觉得是很有意义的,因为这使得Chakra不是仅仅为了Edge而存在,而是能更好的和整个社区一起发展,比如,现在ChakraCore已经能够支持nodejs,当然我们也可以用它来做别的事情,比如做游戏的脚本引擎等等。

2. 准备工作

在编译ChakraCore之前,我们要确认我们已经安装了如下环境:

  • Windows 7 SP1或更高版本, Windows Server 2008 R2或更高版本
  • Visual Studio 2013或者2015

另外如果想编译arm版本,则必须使用Visual Studio 2015加上Windows 10 SDK。

3. 下载并编译ChakraCore

首先我们需要下载ChakraCore的源代码,在你的代码目录下运行如下命令即可,比如我的代码目录是d:\Code:

1
2
cd d:\Code
git clone https://github.com/Microsoft/ChakraCore.git

ChakraCore在Windows上的编译异常简单,只需要用Visual Studio打开Build\Chakra.Core.sln,然后编译整个项目就行。如果你更喜欢在命令行下编译那么可以在msbuild环境下使用如下命令:

1
2
3
4
msbuild /m /p:Platform=<platform> /p:Configuration=<configuration> Build\Chakra.Core.sln

:: 举个例子
msbuild /m /p:Platform=x64 /p:Configuration=debug Build\Chakra.Core.sln

msbuild-chakracore

另外ChakraCore遵守主干开发分支发布的原则,所以我们想提交任何的修改只需要在master分支上开发就可以啦,当然请不要忘记fork并创建相应的issue和pull request,绝对不要直接往上提交。

4. 使用ChakraCore

好的,现在我们应该已经成功编译了ChakraCore的代码了,我们来简单看一下怎么使用它吧!

  1. 首先我们在VS里面新建一个工程,我们这就叫它ChakraCoreTest吧。

  2. 然后在使用ChakraCore之前,我们需要设置一下项目属性:

    把ChakraCore目录下的lib\jsrt添加到C/C++ -> General -> Additional Include Directories中:
    chakracoretest-include

    把ChakraCore.lib添加到Linker -> Input -> Additional Dependencies中:
    chakracoretest-lib

    把ChakraCore目录下的Build\VcBuild\bin$(PlatformTarget)_$(Configuration)目录添加到Linker -> General -> Additional Library Directories中:
    chakracoretest-libdir

  3. 最后我们把main函数所在文件替换成如下内容,这个是ChakraCore给的Hello World程序,用来演示如何使用ChakraCore。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    #include "stdafx.h"

    // Fixed by PR: https://github.com/Microsoft/ChakraCore/pull/2511
    // #include <stdint.h> // To work around issue #2510 temporarily:
    // // https://github.com/Microsoft/ChakraCore/issues/2510

    #include "ChakraCore.h"
    #include <string>
    #include <iostream>

    using namespace std;

    int main()
    {
    JsRuntimeHandle runtime;
    JsContextRef context;
    JsValueRef result;
    unsigned currentSourceContext = 0;

    // Your script; try replace hello-world with something else
    wstring script = L"(()=>{return \'Hello world!\';})()";

    // Create a runtime.
    JsCreateRuntime(JsRuntimeAttributeNone, nullptr, &runtime);

    // Create an execution context.
    JsCreateContext(runtime, &context);

    // Now set the current execution context.
    JsSetCurrentContext(context);

    // Run the script.
    JsRunScript(script.c_str(), currentSourceContext++, L"", &result);

    // Convert your script result to String in JavaScript; redundant if your script returns a String
    JsValueRef resultJSString;
    JsConvertValueToString(result, &resultJSString);

    // Project script result back to C++.
    const wchar_t *resultWC;
    size_t stringLength;
    JsStringToPointer(resultJSString, &resultWC, &stringLength);

    wstring resultW(resultWC);
    cout << string(resultW.begin(), resultW.end()) << endl;
    system("pause");

    // Dispose runtime
    JsSetCurrentContext(JS_INVALID_REFERENCE);
    JsDisposeRuntime(runtime);

    return 0;
    }
  4. 编译,然后把ChakraCore目录下Build\VcBuild\bin$(PlatformTarget)_$(Configuration)下的ChakraCore.dll拷贝到我们新生成的ChakraCoreTest.exe所在的目录下。
    比如,我的是把 D:\Code\ChakraCore\Build\VcBuild\bin\x64_debug\ChakraCore.dll 拷贝到 D:\Code\ChakraCoreTest\x64\Debug\ChakraCore.dll。

  5. 现在运行这个程序吧!
    chakracoretest-run

同系列文章: