av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

聊聊No.js---基于V8和io_uring的JS運(yùn)行時(shí)

前言:閱讀Node.js的源碼已經(jīng)有一段時(shí)間了,最近也看了一下新的JS運(yùn)行時(shí)Just的一些實(shí)現(xiàn),就產(chǎn)生了自己寫(xiě)一個(gè)JS運(yùn)行時(shí)的想法,雖然幾個(gè)月前就基于V8寫(xiě)了一個(gè)簡(jiǎn)單的JS運(yùn)行時(shí),但功能比較簡(jiǎn)單,這次廢棄了之前的代碼,重新寫(xiě)了一遍,寫(xiě)這個(gè)JS運(yùn)行時(shí)的目的最主要是為了學(xué)習(xí),事實(shí)也證明,寫(xiě)一個(gè)JS運(yùn)行時(shí)的確可以學(xué)到很多東西。本文介紹運(yùn)行時(shí)No.js的一些設(shè)計(jì)和實(shí)現(xiàn),取名No.js一來(lái)是受Node.js的影響,二來(lái)是為了說(shuō)明不僅僅是JS,也就是利用V8拓展了JS的功能,同時(shí),前端開(kāi)發(fā)者要學(xué)習(xí)的知識(shí)也不僅僅是JS了。

1 為什么選io_uring

io_uring是Linux下新一代的高性能異步IO框架,也是No.js的核心。在No.js中,io_uring用于實(shí)現(xiàn)事件循環(huán)。為什么不選用epoll呢?因?yàn)閑poll不支持文件IO,如果選用epoll,還需要自己實(shí)現(xiàn)一個(gè)線程池,還需要實(shí)現(xiàn)線程和主線程的通信,以及線程池任務(wù)和事件循環(huán)的融合,No.js希望把事件變得純粹,簡(jiǎn)單。而io_uring是支持異步文件IO的,并且io_uring是真正的異步IO框架,支持的功能也非常豐富,比如在epoll里我們監(jiān)聽(tīng)一個(gè)socket后,需要把socket fd注冊(cè)到epoll中,等待有連接時(shí)執(zhí)行回調(diào),然后調(diào)用accept獲取新的fd,而io_uring直接就幫我們獲取新的fd,io_uring通知我們的時(shí)候,我們就已經(jīng)拿到新的fd了,epoll時(shí)代,epoll通知我們可以做什么事情了,然后我們自己去做,io_uring時(shí)代,io_uring通知我們什么事情完成了。

2 No.js框架的設(shè)計(jì)

No.js目前的實(shí)現(xiàn)比較清晰簡(jiǎn)單,所有的功能都通過(guò)c和c++實(shí)現(xiàn),然后通過(guò)V8暴露給JS實(shí)現(xiàn)。No.cc是初始化的入口,core目錄是所有功能實(shí)現(xiàn)的地方,core下面按照模塊功能劃分。下面我們看看整體的框架實(shí)現(xiàn)。

 
 
 
  1. int main(int argc, char* argv[]) { 
  2.   // ... 
  3.   Isolate* isolate = Isolate::New(create_params); 
  4.   { 
  5.     Isolate::Scope isolate_scope(isolate); 
  6.     HandleScope handle_scope(isolate); 
  7.     // 創(chuàng)建全局對(duì)象 
  8.     Local global = ObjectTemplate::New(isolate); 
  9.     // 創(chuàng)建執(zhí)行上下文 
  10.     Local context = Context::New(isolate, nullptr, global); 
  11.     Environment * env = new Environment(context); 
  12.     Context::Scope context_scope(context); 
  13.     // 創(chuàng)建No,核心對(duì)象 
  14.     Local No = Object::New(isolate); 
  15.     // 注冊(cè)c、c++模塊 
  16.     register_builtins(isolate, No); 
  17.     // 獲取全局對(duì)象 
  18.     Local globalInstance = context->Global(); 
  19.     // 設(shè)置全局屬性 
  20.     globalInstance->Set(context, String::NewFromUtf8Literal(isolate, "No",  
  21.     NewStringType::kNormal), No); 
  22.     // 設(shè)置全局屬性global指向全局對(duì)象 
  23.     globalInstance->Set(context, String::NewFromUtf8Literal(isolate,  
  24.       "global",  
  25.       NewStringType::kNormal), globalInstance).Check(); 
  26.     { 
  27.       // 打開(kāi)文件 
  28.       int fd = open(argv[1], O_RDONLY); 
  29.       struct stat info; 
  30.       // 取得文件信息 
  31.       fstat(fd, &info); 
  32.       // 分配內(nèi)存保存文件內(nèi)容 
  33.       char *ptr = (char *)malloc(info.st_size + 1); 
  34.       read(fd, (void *)ptr, info.st_size); 
  35.       // 要執(zhí)行的js代碼 
  36.       Local source = String::NewFromUtf8(isolate, ptr, 
  37.                           NewStringType::kNormal, 
  38.                           info.st_size).ToLocalChecked(); 
  39.  
  40.       // 編譯 
  41.       Local