这段时间在使用javascript,常常地想javascript是怎么样运行呢?又是怎么样从JS代码转换为机器码呢?在深入了解JS运行机制之前,先来运行一下V8引擎也是入门的前奏。由于不能访问chrome浏览器开源网站,因此使用nodejs的代码,Node.js可以看作是javascritp的运行时环境(JsRE),一方面,它提供了多种可调用的例如读写文件,网络请求,系统信息等API。另一方面,因为CPU执行的是一系列的机器码,它还负责将js代码解释成机器码执行,这部分工作是由V8引擎完成。V8是node的心脏,其诞生之初的目标,就是为了提高js的执行效率,它甚至直接将js编译为本地机器码,以节省一般脚本程序解释执行的时间。所以使用nodejs代码,也可以使用它里面的V8引擎的。
至于怎么样编译nodejs,请参考nodejs的网站,经过编译之后,就会生成下面的lib文件:
v8_base_0.lib;v8_base_1.lib;v8_base_2.lib;v8_base_3.lib;v8_libbase.lib;v8_libplatform.lib;v8_nosnapshot.lib;icui18n.lib;icuucx.lib;icustubdata.lib;
然后再在项目里包含头文件目录:
D:\AI\sample\Nodejs_src\node-v6.11.3\deps\v8\include

接着使用VS2015社区版本,记得一定使用它,目前只支持这个编译器,并且只支持WIN7和之后的系统。
创建一个控制台应用程序,代码如下:

// TestV8.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <malloc.h>
#include <stdlib.h>
#include <memory>
#include <v8.h>
#include <libplatform/libplatform.h>#pragma comment(lib,"winmm.lib")using namespace v8;class ArrayBufferAllocator : public v8::ArrayBuffer::Allocator {
public:virtual void* Allocate(size_t length) {void* data = AllocateUninitialized(length);return data == NULL ? data : memset(data, 0, length);}virtual void* AllocateUninitialized(size_t length) { return malloc(length); }virtual void Free(void* data, size_t) { free(data); }
};int main(int argc, char* argv[])
{V8::InitializeICU();Platform* platform = platform::CreateDefaultPlatform();V8::InitializePlatform(platform);V8::Initialize();// 创建一个新的Isolate和并设置为当前使用v8::Isolate::CreateParams create_params;ArrayBufferAllocator buf;create_params.array_buffer_allocator = &buf;Isolate* isolate = Isolate::New(create_params);{Isolate::Scope isolate_scope(isolate);// 创建栈范围句柄HandleScope handle_scope(isolate);// 创建上下环境变量Local<Context> context = Context::New(isolate);// 编译和运行“hello world”脚本Context::Scope context_scope(context);// 创建一个字符串包含JavaScript的脚本源码Local<String> source = String::NewFromUtf8(isolate, "function sum(a, b){return a+b;}; 'Hello' + ', World! ' + sum(1,2);");// 编译脚本Local<Script> script = Script::Compile(source);// 运行脚本代码Local<Value> result = script->Run();// 输出脚本运行结果,从UTF8字符串转换为普通字符串并打印输出String::Utf8Value utf8(result);printf("%s\n", *utf8);}// 删除isolate,释放V8资源,删除平台资源。isolate->Dispose();V8::Dispose();V8::ShutdownPlatform();delete platform;platform = nullptr;return 0;
}

运行结果如下:

可以看js的脚本运行结果是 Hello, World! 3,后面的3是函数sum(a,b)的计算结果。

比特币源码入门教程

https://edu.csdn.net/course/detail/6998

深入浅出Matplotlib
https://edu.csdn.net/course/detail/6859

深入浅出Numpy
http://edu.csdn.net/course/detail/6149

Python游戏开发入门

http://edu.csdn.net/course/detail/5690

你也能动手修改C编译器

http://edu.csdn.net/course/detail/5582

javascript的V8引擎的初步使用相关推荐

  1. javascript清除map所占内存_【原创.54期】 JavaScript的V8引擎初探

    本文主要就下面三块内容展开 栈和堆空间 垃圾回收 解释器和编译器 一.栈空间和堆空间 先回顾下基本知识 1.静态语言就是强类型?二者的关系 (1-1)静态语言, 使用前 要确定数据类型 (1-2)动态 ...

  2. JavaScript怎么安装_几句话说清楚JavaScript、V8引擎、NodeJS、NMP,到底是什么东东...

    小程序开发如火如荼,如果你是程序员,你还不懂小程序的开发,恐怕会被同行认为太LOW了吧!不过,新入行小程序开发者确实会被新的名词搞得一头雾水. 比如JavaScript不是在浏览器端运行吗,怎么还可以 ...

  3. JavaScript引擎—V8引擎

    为什么需要Javascript引擎? 随着JS承担的工作越来越多,早就已超越创造出的初衷(表单验证)的范畴,因此需要快速的解析和执行JavaScript脚本 V8引擎由此而生 JavaScript引擎 ...

  4. JavaScript工作原理(二):V8引擎和5招高效代码

    本系列的第一篇文章重点介绍了引擎,运行时和调用栈的概述.第二篇文章将深入V8的JavaScript引擎的内部.我们还会提供一些关于如何编写更好的JavaScript代码的技巧. 概述 JavaScri ...

  5. JavaScript 工作原理(二)-如何在 V8 引擎中书写最优代码的 5 条小技巧(译)

    From:https://segmentfault.com/a/1190000014770145 原文请查阅这里,略有删减. 本系列持续更新中,Github 地址请查阅这里. 这是 JavaScrip ...

  6. JavaScript V8引擎编译

    下载: 1. 找到下载源代码的Google网站. 2.提示使用svn命令下载源文件.svn是subversion的意思.请下载subversion控制台客户端. 3.执行提示的命令,即可下载. 编译: ...

  7. 实现Chrome Devtools调试JavaScript V8引擎

    摘要: 最近开发小程序JavaScript的运行时,通过在客户端嵌入JavaScript V8引擎来实现.前端同学需要调试JavaScript代码,正好Chrome浏览器的Devtools是与V8的I ...

  8. Javascript性能优化【内联缓存】 V8引擎特性

    javascript 是单线程.动态类型语言,那么我们在编码时候如何编写性能最优代码呢?下面将讲解V8引擎的内联优化.利用内联缓存这个特性我们可以编写更加优秀的代码. 什么是内联缓存 引用官方的描述: ...

  9. javascript V8引擎垃圾收集机制

    V8引擎使用的垃圾收集机制是标记清除,那么javascript在垃圾收集会阻塞其他程序执行.V8引擎使用了增量标记的方式进行优化 增量标记 V8不是直接对整个栈堆遍历标记,而是标记一部分堆后回复正常执 ...

最新文章

  1. 【Python基础】用Python制作漂亮的流动桑基图
  2. Re:从零开始的Vue项目搭建
  3. 详解Mysql中的JSON系列操作函数
  4. 收藏 | 神经网络debug 6大技巧!
  5. linux 僵尸进程 fwrite,Linux之僵尸进程
  6. Spring Security Oauth2 认证(获取token/刷新token)流程
  7. cd40系列芯片_CD40系列74系列芯片
  8. 红巨星转场特效预设AE插件 Red Giant Universe 6.0.1 WIN
  9. 电阻的寄生电感、寄生电容
  10. 绕过tp路由器管理密码_TP LINK路由器的登陆网址是什么?
  11. hdu2017青岛网络赛Pythagoras(Tree of primitive Pythagorean triples)
  12. RHEL 7 常用命令
  13. 工程车辆监控管理系统方案
  14. 【Superset】Jinja模板功能及设置动态参数
  15. tl wdr5660虚拟服务器,TP-Link TL-WDR5600路由器端口映射怎么设置
  16. android 心率计算器,运动状态最佳心率计算器 (Target-Heart-Rate Calculator)
  17. java 使用JNA连接天敏VC4000采集卡
  18. 中国软件行业协会成立25周年庆典 《程序员》荣获杰出传媒奖
  19. 一千万条数据去重_Mysql千万级数据快速去重
  20. 电磁场与电磁波——静电场

热门文章

  1. SAP ABAP ME23N标准采购订单打印输出配置开发
  2. 干货长文《对抗中的主动防御》
  3. c#-线程-取消架构-Task-简单实验
  4. java性能调优jstat使用方法
  5. 华为Watch Buds耳机为什么降噪不好?
  6. vscode下载慢解决办法
  7. 系统结构-并行算法FORK JOIN
  8. 母牛python_使用Python解决母牛问题
  9. PHP之微信头像加水印
  10. js判断身份证号码是否正确