V8 javascript引擎初步体验

NodeJS 简介:V8发动机 |V8 引擎 Javascript Chrome V8或 V8 是由 Google 开发的开源 Javascript 和 WebAssembly 引擎,用 C++ 编写。V8 引擎最初是为基于 Chromium 的浏览器和 Chrome 浏览器构建的,以提高 javascript 执行的性能,但最新版本可以在浏览器内部或外部执行 javascript 代码,从而实现服务器端脚本。如今,V8 引擎是Node.jsMongoDB等各种技术以及Electron等桌面应用程序的基础。 阅读详情

v8 引擎,不必多说,大名鼎鼎,迄今最快的js引擎。

这么好的东西,如果尽在浏览器中使用,太浪费了,也希望用到其他地方,比如一些客户端开发中。


闲言少讲,这就开始


下载源码

去官方网站:https://code.google.com/p/v8/

我喜欢用git,所以从这里下载

git clone git://github.com/v8/v8.git v8 && cd v8

编译

我为android平台编译的,折腾了好久,记录一些重点。你首先要看这个:http://code.google.com/p/v8/wiki/BuildingWithGYP

其实关键是

make dependencies
这需要花很长时间(呃,没办法,国内网速不给力,我下载了好几次)。。。


然后,在android上编译(其他平台?so easy,看文档), 你可以先看看D8OnAndroid (是android平台的一个js命令行吧,不明觉厉)的编译,不过没什么用处。

我自己的编译方法,是用交叉编译的

Cross-compiling

Similar to building with Clang, you can also use a cross-compiler. Just export your toolchain (CXX/LINK environment variables should be enough) and compile. For example:

export CXX=/path/to/cross-compile-g++
export LINK=/path/to/cross-compile-g++
make arm.release

(编译等待中.....)


完了之后,你就可以使用了。


在android上使用

首先,创建一个工程(怎么创建?这个。。。还是自己找吧),一个Activity工程就行,然后在工程目录下创建一个jni目录。

具体怎么使用ndk,我就不说,自己找吧,我说重点的:

1. 拷贝头文件和库文件

为了方便,我把头文件和库文件放在jni下的include和lib下。头文件直接从v8/include文件夹下拷贝就可以,库文件比较麻烦一些,必须拷贝这些:

libicudata.a  libicui18n.a  libicuuc.a  libv8.a  libv8_snapshot.a

你可以从v8/out目录下查找(用find吧,反正记不住具体在什么位置了) 少了编译时就会报找不到符合的错误(说多了都是泪啊)


2. 注意Android.mk的写法

在写Android.mk的时候,必须注意:

   1. 库的引用顺序很重要,顺序错了,一样找不到符号

   2. 要用stl,

Android.mk和Application.mk(STL需要的)的代码如下,给大家和参考,省得走弯路

Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_CFLAGS += -I$(LOCAL_PATH)/include
LOCAL_LDFLAGS += \
    $(LOCAL_PATH)/lib/libv8.a \
    $(LOCAL_PATH)/lib/libv8_snapshot.a \
    $(LOCAL_PATH)/lib/libicui18n.a \
    $(LOCAL_PATH)/lib/libicuuc.a \
    $(LOCAL_PATH)/lib/libicudata.a \
    /<path>/android-ndk-r9d//sources/cxx-stl/stlport/libs/armeabi/libstlport_static.a

LOCAL_MODULE := jswrapper
LOCAL_LDLIBS := -llog

LOCAL_SRC_FILES := \
    registers.cpp \
    JavaScriptContextWrap.cpp \
    javautils.cpp \
    JsJavaClassProxy.cpp \
    javawrap.cpp

#sample.cpp sample-jni.cpp \

LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

LOCAL_WHOLE_STATIC_LIBRARIES += android_support


include $(BUILD_SHARED_LIBRARY)

$(call import-module, android/support)
(我很笨啊,stl不全路径链接就找不到,呃,难道上天又一次中意我,要给我磨练吗......)

记得lib的顺序和stl噢。。。


Application.mk

APP_CFLAGS += -fexceptions
APP_CFLAGS += -frtti
APP_STL := stlport_static
#gnustl_static

编译用ndk-build就好了。


代码编写

至于jni部分的代码,我就不写了,不懂的baidu和google,你懂的。


头文件?用一个 "v8.h"就好了。

1. 初始化

v8::V8::InitializeICU();

(完了?是的,就这么简单)

2. 创建Isolate和Context

    isolate_ = v8::Isolate::New();
    isolate_->Enter();
    v8::HandleScope handle_scope(isolate_);

    v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New(isolate_);
    
    //create Log object
    v8::Handle<v8::ObjectTemplate> log = v8::ObjectTemplate::New(isolate_);
    log->Set(v8::String::NewFromUtf8(isolate_, "e"),
            v8::FunctionTemplate::New(isolate_, js_func_log_e));
    log->Set(v8::String::NewFromUtf8(isolate_, "i"),
            v8::FunctionTemplate::New(isolate_, js_func_log_i));
    log->Set(v8::String::NewFromUtf8(isolate_, "v"),
            v8::FunctionTemplate::New(isolate_, js_func_log_v));
    log->Set(v8::String::NewFromUtf8(isolate_, "d"),
            v8::FunctionTemplate::New(isolate_, js_func_log_d));
    global->Set(v8::String::NewFromUtf8(isolate_, "Log"), log);

    //TODO others
    global->Set(v8::String::NewFromUtf8(isolate_, "import_java_class"), 
            v8::FunctionTemplate::New(isolate_, js_func_import_java_class));
    
    
    context_.Reset(isolate_, v8::Context::New(isolate_, NULL, global));

内容有点多哈。别着急,听我慢慢道来。

首先,创建一个v8::Isolate, 用v8::Isolate::New()。 isolate是什么东东?这个嘛,其实我也不太清楚,大概类似一个虚拟机,所有的javascript对象都在这个isolate上,不太的isolate老死不相往来。

然后需要调用一下isolate_->Enter(),当然要销毁时,调用一下isolate_->Leave()。

对了,v8是c++的,成员方法首字母都是大写的。

第二,我们可以创建一个ObjectTemplate了。ObjectTemplate望文生义,是对象的模版,怎么说呢,对应到C++和java里面,你可以认为是静态类,有一堆静态方法。

各位请先看最后一句:v8::Context::New(isolate_, NULL, global)。这句话注册一个全局的模版,也就是说,如果我在global中注册一个print函数,那么可以直接在js中这样写:

print ("Hi, I\'m from native");

我们的例子里面,是注册了一个Log的子ObjectTempl,Log又包含e, i,  v, d几个方法,其实就是对应的android.util.Log.e, i, v, d。


注册方法是调用Set,C++函数指针需要用

v8::FunctionTemplate::New
来包装。这些知道就行了,不必深究(其实我也不懂 尴尬)


还有一点必须说明:上面的代码实际上是一个类的一部分,这里有两个成员变量:

    v8::Persistent<v8::Context> context_;
    v8::Isolate* isolate_;
isolate直接使用指针,而Context必须用Persistent,这是一个可以持久保持对象的指针(防止被v8当垃圾回收了),使用方法是用 Rest:

    context_.Reset(isolate_, v8::Context::New(isolate_, NULL, global));

3. 定义一个函数 

凡事先看代码:(我用js_func_log_x来实现js_func_log_i等函数的公共部分)

void js_func_log_x(int level, const v8::FunctionCallbackInfo<v8::Value>& args) {
    if (args.Length() == 0) {
        return ;
    }
    
    //get tag
    char szTag[1024] = "";
    {
        v8::HandleScope handle_scope(args.GetIsolate());
        v8::String::Utf8Value str(args[0]);
        const char* cstr = ToCString(str);
        
        strcpy(szTag, cstr);
    }

    char szLog[1024*8] = "";

    bool first = true;
    int len = 0;
    for (int i = 1; i < args.Length(); i++)
    {
        v8::HandleScope handle_scope(args.GetIsolate());
        if (first) {
            first = false;
        } else {
            len += sprintf(szLog + len, " ");
        }
        v8::String::Utf8Value str(args[i]);
        const char* cstr = ToCString(str);
        len += sprintf(szLog + len, "%s", cstr);
    }

    __android_log_print(level, szTag, "%s", szLog);
}

args 包含了参数和运行时。在每次取参数处理参数时,必须调用

        v8::HandleScope handle_scope(args.GetIsolate());

(why?I don't known 。。。。)

从Value中取字符串,则需要用ToCString,他也很简单:

static const char* ToCString(const v8::String::Utf8Value& value) {
  return *value ? *value : "<string conversion failed>";
}

正经的给v8使用的函数是这样的:

void js_func_log_i(const v8::FunctionCallbackInfo<v8::Value>& args) {
    js_func_log_x(ANDROID_LOG_INFO, args);
}

void js_func_log_v(const v8::FunctionCallbackInfo<v8::Value>& args) {
    js_func_log_x(ANDROID_LOG_VERBOSE, args);
}

void js_func_log_d(const v8::FunctionCallbackInfo<v8::Value>& args) {
    js_func_log_x(ANDROID_LOG_DEBUG, args);
}

void js_func_log_e(const v8::FunctionCallbackInfo<v8::Value>& args) {
    js_func_log_x(ANDROID_LOG_ERROR, args);
}

好了,初体验到此结束


一些重要的知识点

1. 关联一个对象到Isolate上

Isolate可以有多个,如果有一个对象关联到Isolate,该如何从Isolate找到该对象呢?

使用Isolate的GetData/SetData

比如

JavaWrapper* JavaWrapper::fromIsolate(Isolate* isolate) {
    if (isolate == NULL) {
        return NULL;
    }

    void *data = isolate->GetData(ISOLATE_SLOT_JAVA_WRAPPER);

    JavaWrapper* javawrap = reinterpret_cast<JavaWrapper*>(data);
    
    return javawrap && javawrap->isolate_ == isolate ? javawrap : NULL;

}

JavaWrapper::JavaWrapper(Isolate* isolate)
:isolate_(isolate)
{
    isolate_->SetData(ISOLATE_SLOT_JAVA_WRAPPER, (void*)this);
}

2. 怎样从v8::Value中得到其他类型的参数

v8::Value是个复合对象,我们可以这样做:

    for (int i = 0; i < count; i++) {
        HandleScope handle_scope(args.GetIsolate());
        Local<Value> v = args[i];

        if (v->IsUndefined() || v->IsNull()) {
            types[i] = JsJavaClassProxy::NullClass();
            values[i] = JsJavaClassProxy::NullObject();
            LOGV(" arg(%d) is null\n", i);
        } else if (v->IsTrue() || v->IsFalse()) {
            types[i] = JsJavaClassProxy::BooleanClass();
            jboolean jv = (jboolean)(v->IsTrue() ? true : false);
            values[i] = jreflect::ValueOf(env, jv);
            LOGV(" arg(%d) is boolean:%d", i, jv);
        } else if (v->IsString()) {
            types[i] = JsJavaClassProxy::StringClass();
            String::Utf8Value str(v);
            const char* cstr = ToCString(str);
            values[i] = env->NewStringUTF(cstr);
            LOGV(" arg(%d) is String:%s", i, cstr);
        } else if (v->IsBoolean()) {
            types[i] = JsJavaClassProxy::BooleanClass();
            jboolean jv = v->ToBoolean()->Value();
            values[i] = jreflect::ValueOf(env, jv);
            LOGV(" arg(%d) is boolean:%d", i, jv);
        } else if (v->IsInt32() || v->IsUint32()) {
            types[i] = JsJavaClassProxy::IntClass();
            jint jv = v->ToInt32()->Value();
            values[i] = jreflect::ValueOf(env, jv);
            LOGV(" arg(%d) is int:%d", i, jv);
        } else if (v->IsNumber()) {
            types[i] = JsJavaClassProxy::DoubleClass();
            jdouble jv = v->ToNumber()->Value();
            values[i] = jreflect::ValueOf(env, jv);
            LOGV(" arg(%d) is double:%f", i, jv);
        } /** TODO MORE **/ else {
            LOGE("Invalidate Arg type!");
            ASSERT(false);
        }
    }
更多的,从v8.h中看就可以了。


好了,先到这里吧。




WHAT - V8 引擎和 JavaScript 编译原理 在浏览器上,V8 引擎主要用于执行 JavaScript 代码。作为浏览器中的 JavaScript 引擎,V8 负责解释和执行 JavaScript 代码,并将其转换为计算机可以理解和执行的指令。以下是 V8 在浏览器中的主要应用:执行网页中的 JavaScript 代码、提供高性能的 JavaScript 执行环境(JIT和优化技术)、支持最新的 JavaScript 特性和标准、提供浏览器开发者工具。 阅读详情

相关推荐

Google V8 JavaScript引擎在服务器端的使用

v8简介: V8是一个由丹麦Google开发的开源JavaScript引擎,用于Google Chrome中 V8在执行之前将JavaScript编译成了机器码,而非位元组码或是直译它,以此提升效能。更进一步,使用了如内联缓存(inline caching)等方法来提高性能。有了这些功能,JavaScript程序与V8引擎的速度媲美二进制编译。 V8对外的API接口是C++的

runnerchen1的专栏 5828

Node.js Addon(1)

最新的node.js Addon和以前不同,外接函数使用void FunctionName(const FunctionCallbackInfo& args)。 形参和返回都使用args来获得: 1、FunctionCallbackInfo重载了'[]',可以通过'[]'取出。取出时应先对args的长度(Length())进行判断。 获取isolate,全局管理指针。 // 使用 Hand

raoliping12345678的专栏 550

javascript v8执行引擎源码

javascript v8执行引擎源码,v8是google chrome浏览器的javascript执行引擎,也是世界上最快的javascript执行引擎;

nodejs写一个接口传参_为Node.js编写C/C++模块之【参数传递和返回】

作者:小黑上篇文章中介绍了nodejs与C/C++模块的结合,那么怎么来和模块之间收发数据,这是本文即将介绍的内容。如果你打算学习使用v8引擎,那么你应该详细的看看。如果你想看看本文到底说了些啥,那么,请直接看总结部分。一、开发前准备然后选一个文件夹,给今天的分享建立一个工程目录,我这里取名为/addon_3_11并在工程目录中新建立一个binding.gyp文件,内容暂时为空吧,之后有用。方便测...

weixin_42509803的博客 1065

word2vector入门教程

摘要: 网上已经有许多对w2v的介绍了,这里只是做一个简单的概括。下面这篇文章我认为是关于W2V写的比较好的文章,读者有兴趣可以先参考一下: w2v参考文章1 另外一篇是关于Skip-Gram和CBow的介绍。 Skip-Gram&CBOW 逻辑比较清晰的综述文章: 综述文章 数学原理很清晰很短的一篇文章(也有关于负采样的简单说明) 参考文章 1.什么

SCUT_Sam 1万+

Java开发者的福音:Aspose 25.10全系列(Cells/Words/PDF/Slides)最新版破解与集成保姆级教程

本文为Java开发者提供了Aspose 25.10全系列组件(Cells/Words/PDF/Slides)的最新版破解与集成保姆级教程。通过详细的Maven依赖配置、字节码修改技术绕过限制,以及Spring Boot项目中的实战集成指南,帮助开发者高效实现Office文档处理功能,提升开发效率。

weixin_30919429的博客 345

使用C++开发nodejs扩展模块

Node.js 是基于 C++ 开发的(底层用 chrome v8 做 js 引擎 && libuv 完成事件循环机制),因此它的所有底层头文件暴露的 API 也都是适用于 C++ 的。上一节中提到 nodejs 模块寻径的时候会默认找 .node 为后缀名的模块,实际上这是个 C++ 模块的二进制文件,即编译好之后的 C++ 模块,本质上是个动态链接库。例如 (Windows dll/Linux so/Unix dylib)

一名高级工程师的博客 2971

自动换挡频率计的设计精髓:如何用数字电路优雅地解决量程切换难题

本文深入解析了自动换挡频率计的设计精髓,重点探讨如何利用数字电路优雅解决量程切换难题。通过74系列通用数字集成电路构建智能化的自动量程切换系统,详细介绍了状态检测、决策逻辑和档位执行等核心模块的设计方法,并对比了不同实现方案的优劣,为电子测量领域的工程师提供了实用的硬件设计参考。

weixin_27869497的博客 407

v8学习---添加js全局函数

#include using namespace v8; void test(const v8::FunctionCallbackInfo& args) { printf("Hello Headool\n"); } int main() { Isolate* isolate = Isolate::GetCurrent(); HandleScope handleSco

headool的专栏 2401

内存优化--LOGBACK导致内存告警

一.故事背景 由于开辟新市场需要,开发了新的项部署在海外平台,其中最消耗内存的功能是消费kafka消息(最开始预计一天有1千万的量),部署完之后运行一段时间发现出现内存告警问题。 二.分析问题 出现内存告警,(新项目是低配置机器 2C4G * 2台)第一个念头是去查看堆空间设置的情况,看到jvm启动命令中堆空间都是直接指定大小,说明问题不是出在堆空间 -Xmx3g -Xms3g 先不管这些,去查看总的内存使用情况,发现总的内存空间使用将近有92% = 3.68G,那么这多出来使用的0.6

qq_33199919的博客 6052

ABB机器人与S7-1200PLC实现位置坐标数据发送和接收的具体方法

ABB机器人与S7-1200PLC实现位置坐标数据发送和接收的具体方法

Robot_PLC_HMI_Automation 2916

CocosCreator 源码​callbacks-invoker.js详解

CocosCreator 源码​callbacks-invoker.js详解。

weixin_50892911的博客 240

【读代码】从claude skills到superpowers项目

最近claude skills成了大热门,今天一起看下GitHub 上的开源技能框架,他将“工作流”封装为“技能” (Skills)。本文尝试剖析该项目的技能粒度定义、多技能关联架构、应用逻辑等。与传统的 Function Calling 不同,Superpowers 中的 Skill 定义粒度并非“原子操作”,而是**“认知模式” (Cognitive Mode) 或“工作阶段”**。

kakaZhui的博客 1920

【Node.js】深入理解 V8 JavaScript 引擎

V8 是由 Google 开发的开源 JavaScript 引擎,用 C++ 编写,最初用于 Chrome 浏览器,现在广泛用于其他项目,包括 Node.js 和 Deno。核心特点高性能:通过即时编译 (JIT) 和优化技术提升 JavaScript 执行效率。跨平台支持:运行在 Linux、Windows 和 macOS 等多个平台。多语言支持:支持 JavaScript 和 WebAssembly。

佚名程序员 2806

3D点云-CVPR 2020-PF-Net: Point Fractal Network for 3D Point Cloud Completion

是一种专门为三维点云补全设计的深度学习模型。点云补全实际上和图片补全是一个逻辑,都是采用GAN模型的思想来进行补全,在图片补全中,将部分像素点删除并且标记,然后卷积特征提取预测、判别器判别,来训练模型,生成的像素点与原来像素点比较完成模型的训练。而PF-Net就是采用GAN的思想在3D点云上的应用。

404 Not Found 2369

学 Simulink——基于递推最小二乘法(RLS)的工业电机转动惯量 J在线辨识仿真

Te 估算 = 1.5·p·(ψ·iq + (Ld-Lq)·id·iq)回归量:φ(k)=−ω˙(k), y(k)=Te​(k), θ=J。仿真:电机加速 0→1500rpm,观测 J^(k)→Jnom​。(可选) Jtrue​切 0.04(双惯量负载)→ 看跟踪。电机机械运动方程:Te​−TL​=J⋅ω˙+B⋅ω。J^(0)=0.005→收敛至0.02kg⋅m2✔。Te​:电磁转矩(Nm),已知(来自电流环输出)仅需 Te​,ω(驱动器已有)→ 无额外传感 ✔。

amy_mhd的博客 45

【V8引擎】 V8引擎如何运行JS的

V8 是一个由 Google 开发的开源 JavaScript引擎,目前用在 Chrome 浏览器和 Node.js中,其核心功能是执行和解析我们编写的JavaScript代码。

xh1506101064的博客 1623

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

什么是V8 JavaScript引擎?

V8 是由 Google 开发的高性能开源 JavaScript 和 WebAssembly 引擎。它最早于 2008 年发布,旨在提升 Chrome 浏览器的性能。V8 连接 JavaScript 代码与底层硬件,它将 JavaScript 代码编译成机器码,从而大幅提升执行速度。此外,V8 还支持 WebAssembly,这使得应用开发者能够在 Web 上高效运行复杂的应用程序。

有我更精彩的博客 2841

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

什么是 V8 JavaScript 引擎

基本概念与作用说明V8 的工作原理主要特性完整且丰富的代码示例示例一:在 Node.js 中使用 V8 引擎示例二:性能测试示例三:内存管理示例四:调试信息示例五:异步执行不同角度的功能使用思路性能优化内存管理并发执行调试和性能分析实际工作开发中的使用技巧V8 JavaScript 引擎是Google开发的一款高性能JavaScript引擎,最初设计用于Chrome浏览器,但现在已经广泛应用于其他领域,如Node.js服务器环境。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1583

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Javascript引擎——v8引擎

本文详细解析了现代JavaScript引擎(以V8为例)的工作机制。引擎采用两阶段设计:首先将源码解析为AST并生成字节码,实现快速启动;然后通过解释器执行字节码并收集运行时信息,JIT编译器对热点代码进行分层优化。关键点包括:1)字节码平衡启动速度与执行效率;2)解释器收集类型信息为优化提供依据;3)JIT基于类型反馈进行激进优化;4)投机优化与去优化机制确保正确性。这种架构使JavaScript兼具开发灵活性和接近原生的执行性能。

不会后端的前端不是一个好全栈 1682

推荐项目:V8 JavaScript 引擎 PHP 扩展 - V8JS

V8JS 是一个开源的 PHP 扩展,它允许在 PHP 环境中使用 Google 的 V8 JavaScript 引擎执行 JavaScript 代码。通过 V8JS,您可以将 JavaScript 用于后端服务、脚本任务或与 PHP 应用程序集成。 ## V8JS 可以用来做什么? 1. 在服务器端运行 JavaScript 代码 2. 在 PHP 中调用 JavaScript 函数库 3....

gitblog_00020的博客 1551

【JS】V8 引擎原理

文章目录认识JS引擎V8引擎原理在这里插入图片描述 **流程图分析:**V8引擎架构 认识JS引擎 为什么需要 JS 引擎? 1. `高级编程语言`都有转化成`最终的机械指令`来执行的 2. 我们平时编写的js,无论你交给`浏览器或Node`执行,最后都是需要被CPU执行的 3. 但CPU只认识自己的指令集,实际上是机械语言,才能被CPU所执行 4. 所以我们需要JS引擎将JS代码翻译成CPU指令来执行 常见的 JS 引擎有: 5. SpiderMonkey:第一款JS引擎,由Brendar Ei

qq_45677671的博客 3018

【V8引擎】JavaScript变量提升

JavaScript使用var关键字声明变量为什么会存在变量提升?JavaScript函数为什么可以提前调用?JavaScript代码,在浏览器中又是如何被执行的?我们可以通过了解V8引擎的运行机制了解JS代码在浏览器中的编译过程,来解释为什么存在声明提升的情况。

m0_68324632的博客 1750

V8 javascript 引擎

V8是一个由丹麦Google开发的开源java script引擎,用于Google Chrome中。[2]Lars Bak是这个项目的组长。[3] V8在执行之前将java script编译成了机器码的,而非字节码或是直译它,以此提升效能。更进一步,使用了如内联缓存(inline caching)等方法来提高性能。有了这些功能,java script程序与V8引擎的速度媲美二进制编译。[4] V8组译器是基于Strongtalk组译器。[5] V8是Goo

男神的专栏 1736

JavaScript 与 V8 引擎的关系(一文讲透)

ECMAScript 标准:规定语法与语义(比如let/const、原型链、Promise 等)。引擎实现V8(Chrome、Node.js、Deno、Electron 等)(Firefox)(Safari)Chakra(老版 Edge)不同引擎都在努力“正确且更快”地执行同一门语言。

AngelCryToo的专栏 1638

V8 JS引擎

一.  Google开发V8Google (丹麦)研发小组在 2006 年开始研发 V8 ,部分的原因是 Google 对既有 JavaScript 引擎的执行速度不满意, 在2008年推出chrome, 巨大的速度优势, 迅速占领市场. 2017年chrome的市场占有达到59%. 二.  常见JS引擎JScript(IE6,IE7, IE8)Chakra(IE9,IE10, IE11, IE ...

小松鼠举栗子 1万+
上一篇: android精确绘制文字位置的方法
下一篇: PopupWindow的一些使用总结
漂流的代码
博客等级 码龄23年 188粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值