精华内容
下载资源
问答
  • Mac OS编译V8引擎源码

    千次阅读 2018-10-08 17:11:15
    目录Mac OS编译V8引擎源码准备工作1.设置代理2.安装Xcode 和 Xcode Command Line Tools3.安装 depot_tools下载V8源码1.安装 depot_tools 构建系统的所有依赖2.获取 V8 源码(包含了所有分支和依赖)编译V8源码1. v8...

    Mac OS编译V8引擎源码

    准备工作

    1.设置代理

    这里使用的shadowsocks,用于稳定的翻墙
    为命令行设置http代理

    export http_proxy=http://127.0.0.1:1087;
    export https_proxy=http://127.0.0.1:1087;
    

    2.安装Xcode 和 Xcode Command Line Tools

    可以在Mac App Store 安装

    注意: Xcode Command Line Tools可能存在大坑
    详见下面可能存在问题部分

    3.安装 depot_tools

    1. git depot_tools 库
      git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
      
    2. 添加到环境变量中
      使用vim或其他工具打开文件
      sudo vim ~/.bash_profile
      
      添加depot_tools 的路径
      export PATH=/<替换为你的depot_tools存放路径>/depot_tools:"$PATH" 
      
      保存环境变量
      source ~/.bash_profile
      

    下载V8源码

    1.安装 depot_tools 构建系统的所有依赖

    运行:

    	gclient sync
    

    2.获取 V8 源码(包含了所有分支和依赖)

    	fetch v8
    	cd v8
    

    编译V8源码

    1. v8gen 生成 ninja 构建文件:

    	tools/dev/v8gen.py x64.release
    

    2. 编译源码,生成可执行文件,目标系统 x64:

    	ninja -C out.gn/x64.release
    

    测试

    使用py脚本测试编译后的文件是否有问题,测试可以不进行

    	tools/run-tests.py --gn
    

    可能存在问题

    v8gen 生成 ninja 构建文件时出现如下错误:

    $ tools/dev/v8gen.py x64.release -vv
    ################################################################################
    /usr/bin/python -u tools/mb/mb.py gen -f infra/mb/mb_config.pyl -m developer_default -b x64.release out.gn/x64.release
    
      Writing """\
      is_debug = false
      target_cpu = "x64"
      """ to ~/projects/v8/out.gn/x64.release/args.gn.
    
      ~/projects/v8/buildtools/mac/gn gen out.gn/x64.release --check
        -> returned 1
      ERROR at //build/config/mac/mac_sdk.gni:61:5: Script returned non-zero exit code.
          exec_script("//build/mac/find_sdk.py", find_sdk_args, "list lines")
          ^----------
      Current dir: ~/projects/v8/out.gn/x64.release/
      Command: python -- ~/projects/v8/build/mac/find_sdk.py --print_sdk_path 10.10
      Returned 1.
      stderr:
    
      Traceback (most recent call last):
        File "~/projects/v8/build/mac/find_sdk.py", line 89, in <module>
          print main()
        File "~/projects/v8/build/mac/find_sdk.py", line 57, in main
          sdks = [re.findall('^MacOSX(10\.\d+)\.sdk$', s) for s in os.listdir(sdk_dir)]
      OSError: [Errno 2] No such file or directory: '/Library/Developer/CommandLineTools/Platforms/MacOSX.platform/Developer/SDKs'
    
      See //build/toolchain/mac/BUILD.gn:14:1: whence it was imported.
      import("//build/config/mac/mac_sdk.gni")
      ^--------------------------------------
      See //BUILD.gn:521:1: which caused the file to be included.
      action("js2c") {
      ^---------------
      GN gen failed: 1
    Traceback (most recent call last):
      File "tools/dev/v8gen.py", line 304, in <module>
        sys.exit(gen.main())
      File "tools/dev/v8gen.py", line 298, in main
        return self._options.func()
      File "tools/dev/v8gen.py", line 166, in cmd_gen
        gn_outdir,
      File "tools/dev/v8gen.py", line 208, in _call_cmd
        stderr=subprocess.STDOUT,
      File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 573, in check_output
        raise CalledProcessError(retcode, cmd, output=output)
    subprocess.CalledProcessError: Command '['/usr/bin/python', '-u', 'tools/mb/mb.py', 'gen', '-f', 'infra/mb/mb_config.pyl', '-m', 'developer_default', '-b', 'x64.release', 'out.gn/x64.release']' returned non-zero exit status 1
    
    

    解决方案:

    1.查看打印结果

    	xcode-select --print-path
    

    如果打印输出是:/Library/Developer/CommandLineTools
    而不是/Applications/Xcode.app/Contents/Developer
    则会报这个错误

    2.修改Xcode Command Line Tools版本

    修改Command Line Tools版本
    我这儿是sudo rm -rf /Library/Developer/CommandLineTools删了原先版本,然后直接选择了Xcode 9.2这个版本

    在这里插入图片描述

    参考文档
    1.GitHub v8源码
    2.GitHub v8 Building from Source
    3.Installing V8 on a Mac
    4.Show a helpful error message if the Xcode license agreement hasn’t been accepted
    5.Mac OS下V8引擎编译方法
    6.编译 V8 源码

    欢迎关注我的公众号,持续分析优质技术文章
    欢迎关注我的公众号

    展开全文
  • google V8引擎源码的makefile工程,V8 version 3.14.0.1。
  • V8 lib - result of "fetch V8" https://chromium.googlesource.com/chromium/tools/depot_tools.git 分两个压缩包
  • V8 lib - result of "fetch V8" https://chromium.googlesource.com/chromium/tools/depot_tools.git 分两个压缩包,此为第二个
  • V8引擎源码编译

    2016-04-06 22:10:03
    首先是V8的Git源码 https://github.com/v8/v8 原来V8是放在code.google.com上面的,后来被转移到了Github 可以使用git 来进行clone 官方文档的开始第一步是checkout depot tools 这里面简要描述一下...
    首先是V8的Git源码
    https://github.com/v8/v8
    原来V8是放在code.google.com上面的,后来被转移到了Github


    可以使用git 来进行clone
    官方文档的开始第一步是checkout depot tools

    这里面简要描述一下,depot tools是Google的一套工具包,这里面我们用到的是gclient,用来实现多中代码管理工具的继承环境,也就是说可以管理SVN、Git、CSV等不同的管理工具在一起,甚至把代码放到一起的工具。地址如下
    http://www.chromium.org/developers/how-tos/install-depot-tools(墙外你懂得)

    git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
    并把他加到环境变量中
    export PATH=`pwd`/depot_tools:"$PATH"
    以上是在Linux或Mac OS系统上的操作,如果是Windows自行加到环境变量中即可。


    这一步就是使用上面的工具来进行checkout v8的项目,同git clone原理,将V8代码pull到最新
    fetch v8
    git pull origin

    使用gclient将V8的一些依赖包进行检出下载
    gclient sync(墙外你懂得)

    在这个命令执行时,可能会提示
    client not configured; see 'gclient config'
    那么需要我们队gclient进行配置,方法如下,执行如下命令
    gclient config https://chromium.googlesource.com/v8/v8
    会在目录下生成.gclient的文件,里面的内容基本如下,也可自行创建.gclient,将下面代码粘贴到文件里
    solutions = [
    { "name" : "v8",
    "url" : "https://chromium.googlesource.com/v8/v8",
    "deps_file" : "DEPS",
    "managed" : True,
    "custom_deps" : {
    },
    "safesync_url": "",
    },
    ]
    cache_dir = None


    所有包都下载完以后,目录下面有一个叫做v8的文件夹,进入这个文件夹,在这个目录打开终端,执行
    build/gyp_v8 -Dtarget_arch=x64
    可以创建出xcode的项目工程,然后在build文件夹下就会有一个all.xcodeproj文件,即可使用xcode进行打开


    进入XCODE,菜单product-->build,即可进行编译


    参考俩官方资料,里面还有一些关于V8的其他东西,可以看看
    https://github.com/v8/v8/wiki/Using%20Git
    https://developers.google.com/v8/embed#audienc
    展开全文
  • 具体实现如下: function ArrayPush(){ var n = TO_UINT32(this.length); // 被push的对象的length var m = %_AraumentsLength(); // push的参数个数 for(var i=0; i<... this[i+n] = %_Arguments(i)...

    具体实现如下:

    function ArrayPush(){
        var n = TO_UINT32(this.length);  // 被push的对象的length
        var m = %_AraumentsLength();  // push的参数个数
        for(var i=0; i<m; i++){
            this[i+n] = %_Arguments(i);  // 复制元素  (1)
        }
        this.length = n + m;  // 修正length属性的值
        return this.length;
    }

    从上面的代码可以看出,Array.prototype.push实际上是一个属性复制的过程,把参数按照下标依次添加到被push的对象上面,同时修改了对象的length属性,不需要关注被修改的对象是数组还是类数组。

    因此,我们可以把任意类型的对象传入到Array.prototype.push中,比如下面这个例子:

    var a = {};
    Array.prototype.push.call(a, "first", "second");
    console.log(a);

    观察上面这个例子我们发现如果要实现javascript中call和apply的区别与联系中"借用其他对象的方法",需要满足下面的条件:

    1. 对象本身可以存取属性;
    2. 对象的length属性可读写;

    本篇博客参考自JavaScript设计模式与开发实践,[p33-p34] 

    展开全文
  • javascript v8执行引擎源码v8是google chrome浏览器的javascript执行引擎,也是世界上最快的javascript执行引擎;
  • JS引擎V8 Parser源码分析

    热门讨论 2012-05-07 13:06:56
    JS引擎V8 Parser源码分析
  • 重置v8时区 重置/刷新v8引擎的时区 安装 $ npm install reset-v8-timezone 作者 Prabhakar Patil
  • 谷歌浏览器的脚本引擎、JavaScript解释器:V8。checkout日期:2009-4-19
  • chrome_v8_js引擎源码导读分析 第一章 v8 之整体流程 第二章 v8 之全局环境配置及初始化 2.1 全局模板 2.2 库函数 2.3 初始化 第三章 v8 之前端建立语法树 3.1 v8 编译中重要的类 3.2 compile之前的查找 ...
  • V8 Javascript引擎库(libv8)主 ) V8是Google的开源Javascript引擎V8用C ++编写,并在Google Chrome(谷歌的开源浏览器)中使用。 V8实现了ECMA-262,第5版中指定的ECMAScript。 此扩展程序要求V8 6.9(已知...
  • 用于Crystal的V8 Javascript引擎。 安装 shards install //need to lucky-cli lucky install //need to ecosystem for v8 engine 用法 待办事项:在此处写下使用说明 发展历程 待办事项:在此处编写开发说明 贡献 ...
  • V8 JavaScript Engine V8 is Google's open source JavaScript engine. V8 implements ECMAScript as specified in ECMA-262. V8 is written in C++ and is used in Google Chrome, the open source browser from ...
  • 编写Python API,然后使用V8引擎从JavaScript调用它们。 >> > from v8py import Context >> > context = Context () >> > def print_hello (): ... print 'Hello, world!' >> > context . expose ( print_hello ) ...
  •  与express是基于node的封装不同,node是基于V8的一个应用,源码内容已经渗透到V8层面,因此这章简述一下我目前理解的V8引擎吧。  首先需要理解的是V8是一个JS代码运行平台,可以将JS代码编译执行。  本节就...

      原本打算是把node源码看得差不多了再去深入V8的,但是这两者基本上没办法分开讲。

      与express是基于node的封装不同,node是基于V8的一个应用,源码内容已经渗透到V8层面,因此这章简述一下我目前理解的V8引擎吧。

      首先需要理解的是V8是一个JS代码运行平台,可以将JS代码编译执行。

      本节就非常浅显的讲一下V8内部一些常见类,以及一个运行JS代码的简单demo。

      (由于研究V8引擎原理的人非常多,本人学识浅薄,可以去参考别人的博客)

    参考资料:

      1、很多大佬的博客

      2、V8引擎API文档:https://v8docs.nodesource.com/

      3、github:https://github.com/v8/v8

      

      本节先列举一些核心类,示例代码大部分来源于node中的源码。

    Isolate

      该类代表一个V8引擎实例,有自己独立的状态,用法如下。

    1、不能使用new关键字来生成一个实例,只能通过类方法Isolate::New(params)来创建。

    Isolate* const isolate = Isolate::New(params);

    2、该类的方法都是设置V8引擎的一些处理细节。

    // 添加error的信息监听器
    isolate->AddMessageListener(OnMessage);
    // 从名字能看出来 设置未捕捉中断异常的回调函数
    isolate->SetAbortOnUncaughtExceptionCallback(ShouldAbortOnUncaughtException);
    // 设置Microtask的执行方式(有三种)
    isolate->SetMicrotasksPolicy(v8::MicrotasksPolicy::kExplicit);
    // 设置致命错误的回调函数
    isolate->SetFatalErrorHandler(OnFatalError);
    // WebAssembly代码生成回调函数
    isolate->SetAllowWasmCodeGenerationCallback(AllowWasmCodeGenerationCallback);

    3、作为一个参数传入其余的V8工具类中。

    // 单线程运行V8的Isolate
    Locker locker(isolate);
    Isolate::Scope isolate_scope(isolate);

     

    Local/Persistent - Handle

      这个地方我之前一直比较混乱,因为有文章指出:Handle类定义在v8.h中,它是一个模板类,而且有两个派生类Local和Persistent。

      出处:https://blog.csdn.net/sunbxonline/article/details/20310897

      但是从源码来看,无论是Local<T>还是MaybeLocal<T>,均不继承于任何类(在V8中确实存在一个Handle的类,但是跟这两个没有继承关系)。

      这是因为V8版本不一致,所以我这里只讲当前版本的情况,源码注释如下:

    #if !defined(V8_IMMINENT_DEPRECATION_WARNINGS)
    // Handle is an alias for Local for historical reasons.
    template <class T>
    using Handle = Local<T>;
    #endif

      这两个类从作用上讲都是handle,但实际上并不继承于同一个父类。

    1、Local/Persistent是V8的两个类,指向底层的原始数据。

    2、所有对象的引用都需要被V8的垃圾回收管理,在管理中可能出现移动对象的情况(参考网上大量关于V8垃圾回收的博客),这会导致对象指针产生错误,所以不能直接使用原始的数据类型,诸如String,而需要使用Local<String>,Local被V8引擎管理,会在对象移动时更新指针指向,并在合适的时候进行回收。

    3、Persistent属于全局对象(可参考Global),独立于HanldeScope,可使用Reset方法清空。

     

    Value

      所以JS数据类型映射到C++的根类,继承关系如下:

      具体的内部实现后面做分析。 

     

    HandleScope

       一个管理handle的容器,在当前作用域开头声明一个HanldeScope,在域结束时会自动清理所有的handle。

    HandleScope handle_scope(isolate);

      嵌套使用时,作用域会自动进行切换。

     

    Context

      执行上下文,有自己独立的函数与对象。与Isolate相似,通过类方法New来生成。

    auto context = Context::New(isolate, nullptr, object_template);

      可通过内部Scope类来进行上下文的切换。

    Context::Scope context_scope(context);

     

    Script

      该类主要负责对JS代码字符串进行编译和执行,核心方法为Compile、Run。

      Script::Compile可以编译JS代码字符串,返回一个Local<Script>对象

      Script::Run可以执行编译后的JS代码,返回一个Handle<Value>对象

     

      另外,还有FunctionTemplate/ObjectTemplate可以封装C++的对象、函数提供给JS代码调用,示例代码如下:

    // 将C++的GetBinding函数包装提供给JS代码调用
    // NewFunctionTemplate是v8::FunctionTemplate::New()方法的包装
    v8::Local<v8::Function> get_binding_fn =
    env->NewFunctionTemplate(GetBinding)->GetFunction(env->context())
    .ToLocalChecked();

     

      基本上大部分用到的东西就是上面所列举的,GC暂时不讨论,以一个非常简单的网上案例把上面的东西串起来:

    // 创建一个Isolate实例
    Isolate::CreateParams params;
    Isolate* const isolate = Isolate::New(params);
    // 创建一个HandleScope管理handle
    HandleScope handle_scope(isolate);
    // 创建一个上下文执行环境
    Local<Context> context = Context::New(isolate);
    // 切换到当前上下文
    Context::Scope context_scope(context);
    // 新建一个Local
    // 类型可以类比JS的源字符串
    Local<String> source = v8::String::NewFromOneByte(isolate , "12345");
    // 编译该JS字符串
    MaybeLocal<v8::Script> script = v8::Script::Compile(context , source);
    // 执行上面返回的编译对象
    Local<Value> result = script.ToLocalChecked()->Run(context).ToLocalChecked();
    // 这个result就是对JS源字符串编译执行后的C++代码
    Local<String> str = result->ToString(context ).ToLocalChecked();

      这样,对V8引擎就有了一个基本的认识,可以帮助我们更好的学习nodejs源码。

    转载于:https://www.cnblogs.com/QH-Jimmy/p/9212923.html

    展开全文
  • JS V8 引擎中sort的源码

    千次阅读 2018-04-28 10:51:08
    function InnerArraySort(array, length, comparefn) { // In-place QuickSort algorithm. // For short (length &lt;= 22) arrays, insertion sort is used for efficiency. if (!IS_CALLABLE(comparefn))....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 447
精华内容 178
关键字:

v8引擎源码