zoukankan      html  css  js  c++  java
  • JavaScript 引擎——Chrome V8 引擎入门

    https://developers.google.com/v8/intro

    本文内容

    • 介绍
    • 关于 V8 引擎
    • V8 引擎入门
    • 参考资料

    介绍


    V8 是 Google 开源的、高性能的 JavaScript 引擎。V8 是由 C++ 编写,并用在 Google 开源浏览器 Chrome 中。

    Google 的 V8 项目旨在帮助那些 C ++ 开发者在他们的应用程序中使用 V8,以及对 V8 的设计和性能感兴趣的人。本文及其后的文章将介绍 V8,和如何在你的代码中使用 V8,并提供一套 JavaScript benchmarks 来测量 V8 的性能。

    关于 V8 引擎


    V8 实现了 ECMA-262 第 5 版描述的 ECMAScript,可运行在 Windows(XP 或更高)、Mac OS X(10.5 或更高)和使用 IA-32、x64 或 ARM 处理器的 Linux 系统。

    V8 编译和执行 JavaScript 源代码,处理对象内存分配,对不再使用的对象进行回收。V8 的垃圾回收(Google 自己说是“能停止世界、新一代、准确的垃圾回收”)是其性能的关键。其他的性能方面,如 V8 设计元素(V8 Design Elements)。

    JavaScript 是浏览器中最常用的客户端脚本,如用来操作 DOM(Document Object Model,文档对象模型)。但是,DOM 通常由 JavaScript 提供,而不是浏览器。V8—Google Chrome 就是这样。但是,V8 提供所有的数据类型、操作符、对象和 ECMA 标准规定的函数。

    V8 可以使任何 C++ 应用程序向 JavaScript 代码公开自己的对象和函数。由你决定向 JavaScript 公开你希望的对象和函数。在这方面,有很多应用程序都这么做,如,Adobe Flash 和苹果 Mac OS X 中 Dashboard  部件和和雅虎部件。

    V8 引擎入门


    首先,需要下载 V8 源代码并生成 V8。之后,演示 V8 代码的 "Hello World" 示例。在演示 "Hello World" 示例时,介绍一些关键的 V8 概念。

    • Hello World 示例
    • 运行 Hello World 示例
    Hello World 示例

    把一个 JavaScript 语句作为一个字符串参数,作为 JavaScript 代码执行,并输出结果。但是下面代码不能执行,因为它还缺少 V8 必要的部分。

    int main(int argc, char* argv[]) {
     
      // Create a string containing the JavaScript source code.
      String source = String::New("'Hello' + ', World'");
     
      // Compile the source code.
      Script script = Script::Compile(source);
      
      // Run the script to get the result.
      Value result = script->Run();
     
      // Convert the result to an ASCII string and print it.
      String::AsciiValue ascii(result);
      printf("%s\n", *ascii);
      return 0;
    }

    若真正在 V8 中运行该示例,还需要添加句柄(handles)、作用域(handle scope)和上下文环境(context):

    • 一个句柄是一个指向对象的指针。所有 V8 对象都是通过句柄访问,这样 V8 垃圾回收才能起作用。
    • 一个作用域可以看做任意数量句柄的容器。这样,当使用完句柄后,不用单独删除每个,而是简单删除作用域。
    • 一个上下文环境一个执行环境,允许单独的、不相关的 JavaScript 代码运行在 V8 单个实例。必须在你要执行的 JavaScript 代码中显示指定上下文环境。

    这些概念会在 嵌入式指南 中更多描述。

    下面代码同上边一样,但包含了句柄、作用域和上下文环境。另外,也包含了命名空间和 V8 头文件:

    #include <v8.h>
     
    using namespace v8;
     
    int main(int argc, char* argv[]) {
     
      // Create a stack-allocated handle scope.
      HandleScope handle_scope;
     
      // Create a new context.
      Persistent<Context> context = Context::New();
      
      // Enter the created context for compiling and
      // running the hello world script. 
      Context::Scope context_scope(context);
     
      // Create a string containing the JavaScript source code.
      Handle<String> source = String::New("'Hello' + ', World!'");
     
      // Compile the source code.
      Handle<Script> script = Script::Compile(source);
      
      // Run the script to get the result.
      Handle<Value> result = script->Run();
      
      // Dispose the persistent context.
      context.Dispose();
     
      // Convert the result to an ASCII string and print it.
      String::AsciiValue ascii(result);
      printf("%s\n", *ascii);
      return 0;
    }
    运行 Hello World 示例

    你可以按如下步骤运行示例:

    • 下载 V8 源代码,并按指示生成 V8。
    • 复制上面的代码,并另存为 hello_world.cpp 到 V8 生成的目录。
    • 编译 hello_world.cpp,链接到生成期间创建的静态库。例如,在 64 位 Linux,使用 GNU 编译器:
    g++ -Iinclude hello_world.cc -o hello_world out/x64.release/obj.target/tools/gyp/libv8_{base,snapshot}.a -lpthread
    • 命令行执行 hello_world 可执行文件。例如,在 Linux,当前目录为 V8 目录,输入下面命令:
    ./hello_world
    • 你会看到终端输出 Hello, World!

    这仅仅是一个简单的例子,你可能想执行更多脚本。

    参考资料


    下载 Hello World Demo - Hello World 程序

    下载 Demo - 简单执行 JavaScript 语句。包括获得 JSON 中的数据,字符串长度和字符串所有字符大写。

    2012-11-05_101413

    (该 Demo 要想运行起来,说容易,也不容易。在 VS 里将 V8 的包含文件和库追加到项目的包含目录和库目录设置里。)

  • 相关阅读:
    《玩转.NET Micro Framework 移植基于STM32F10x处理器》内容介绍
    《玩转.NET Micro Framework 移植基于STM32F10x处理器》前言
    《玩转.NET Micro Framework 移植基于STM32F10x处理器》内容介绍
    《玩转.NET Micro Framework 移植基于STM32F10x处理器》微软中国.NET Micro Framework项目组工程师所作之序
    《玩转.NET Micro Framework 移植基于STM32F10x处理器》资源汇总
    《玩转.NET Micro Framework 移植基于STM32F10x处理器》微软中国.NET Micro Framework项目组工程师所作之序
    《玩转.NET Micro Framework 移植基于STM32F10x处理器》前言
    Windows、Linux、ARM、Android、iOS全平台支持的RTMP推流组件libEasyRTMP库接口调用说明
    简单高效易用Windows/Linux/ARM/Android/iOS平台实现RTMP推送组件EasyRTMPAndroid MediaCodec硬编码流程介绍
    RTSP网络监控摄像头如何实现Windows、Linux、ARM、Android、iOS全平台支持的拉RTSP流推出RTMP直播流?
  • 原文地址:https://www.cnblogs.com/liuning8023/p/2752761.html
Copyright © 2011-2022 走看看