当前位置: 首页 > 科技观察

如何写一个JS运行时

时间:2023-03-17 01:39:11 科技观察

随着Node.js的出现和不断发展,其他新的JS运行时也在不断被淘汰,比如Deno、Just、Bun等。本文简单介绍如何编写一个JS运行时。与操作系统和编译器相比,编写一个JS运行时理论上不是一件难事,但编写一个优秀的、功能齐全的运行时却不是一件容易的事。事情。JS引擎要编写一个JS运行时,首先必须要有一个JS引擎来处理JS。大多数JS运行时都基于V8。当然你也可以使用其他的JS引擎。所以首先你需要选择一个JS引擎,然后下载代码并编译成功。有了JS引擎,你就可以通过它提供的一些API实现一个可以执行JS代码的软件。intmain(intargc,char*argv[]){setvbuf(stdout,nullptr,_IONBF,0);setvbuf(stderr,nullptr,_IONBF,0);v8::V8::InitializeICUDefaultLocation(argv[0]);v8::V8::InitializeExternalStartupData(argv[0]);std::unique_ptrplatform=platform::NewDefaultPlatform();v8::V8::InitializePlatform(platform.get());v8::V8::初始化();隔离::CreateParamscreate_params;create_params.array_buffer_allocator=ArrayBuffer::Allocator::NewDefaultAllocator();隔离*isolate=Isolate::New(create_params);{Isolate::Scopeisolate_scope(isolate);HandleScope句柄范围(隔离);Localglobal=ObjectTemplate::New(isolate);Localcontext=Context::New(isolate,nullptr,global);上下文::范围context_scope(context);本地<对象>globalInstance=context->Global();globalInstance->Set(context,String::NewFromUtf8Literal(isolate,"No",NewStringType::kNormal),不);//设置全局属性global指向全局对象globalInstance->Set(context,String::NewFromUtf8Literal(isolate,"global",NewStringType::kNormal),globalInstance).Check();{//打开文件intfd=open(argv[1],0,O_RDONLY);结构统计信息;//获取文件信息fstat(fd,&info);//分配内存来保存文件内容char*ptr=(char*)malloc(info.st_size+1);//ptr[info.st_size]='\0';读取(fd,(void*)ptr,info.st_size);//要执行的js代码Localsource=String::NewFromUtf8(isolate,ptr,NewStringType::kNormal,info.st_size).ToLocalChecked();//编译Local