javascript的V8引擎的初步使用

这段时间在使用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   
#include 
#include 
#include 
#include 

#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::New(isolate);

		// 编译和运行“hello world”脚本
		Context::Scope context_scope(context);

		// 创建一个字符串包含JavaScript的脚本源码
		Local source = String::NewFromUtf8(isolate, "function sum(a, b){return a+b;}; 'Hello' + ', World! ' + sum(1,2);");

		// 编译脚本
		Local
                    
                    

你可能感兴趣的:(webpy)