首頁 web前端 js教程 node解釋執行js的過程分析

node解釋執行js的過程分析

Apr 03, 2018 pm 02:41 PM
javascript node 分析

這篇文章跟大家分享的內容是node解釋執行js的過程分析,有興趣的朋友可以看一看,有需要的朋友也可以參考一下

說明:node是單線程,非阻塞,事件驅動(類似內核中udev事件,可以參考監聽-回調機制)

以node-v8.10.0為對象,主要是src/node_main.cc和src/node.cc這兩個文件。

  1. 入口
        node-v8.10.0/src/node_main.cc --> 90 int main(int argc, char *argv[])
        呼叫node::Start( argc,。 ); });
              # 執行完*.js後執行匿名函數,實際上就是執行uv_tty_reset_mode()
          b:  4865   PlatformInit();##Inform 量處理函數註冊
          c:  4866   node::performance::performance_node_start = PERFORMANCE_NOW();
              封裝uv_hr. ##          匯出定義:deps/uv/include/uv.h:1457:UV_EXTERN uint64_t uv_hrtime(void);
              實作:deps/uv/src/unix .c:111:uint64_t 長度__hrtime
              定義:deps/uv/src/unix/internal.h:252:uint64_t uv__hrtime(uv_clocktype_t type);
         . uv_clocktype_t type) {
              總結:記錄node執行*.js腳本的開始運行時間點,類似的,記錄v8的開始運行時間點:
       ::   _Fstart ##      d:  4868   CHECK_GT(argc, 0);
              src/util.h:129:#define CHECK_GT(a, b) CHECK((a):129:#define CHECK_GT(a, b) CHECK((a) 185; v = uv_setup_args(argc, argv);
             定義:deps/uv/include/uv.h:1051:UV_EXTERN char** uv_setup_args(int argc, char** argv);#    4877 Init(&argc, const_cast(argv), &exec_argc, &exec_argv);
              4542 void Init(int* argc,##  char** argv,
              4544           int* exec_argc,
              4545           const char*** exec_argv) {
              46177_ )Argv()       4502   ParseArgs(argc, argv, exec_argc, exec_argv, &v8_argc, &v8_argv, is_env);
                4015 static void ParseArgs(int* argc,
                解析參數
       itialize(v8_thread_pool_size, uv_default_loop());
          i:  4902   V8::Initialize ();
              v8初始化
          j:  4905   const int exit_code =
          , exec_argv);
          k:  退出
              4908     v8_platform.StopTracingAgent ();
              4910   v8_initialized = false;
              4911   V8::Dispose()()#Nc18; ##          4921   delete[] exec_argv;
              4922   exec_argv = nullptr;
              4924   return exit_code;
    2. 分析1中的j部分
          a:  4814 inline                 int argc, const char* const* argv,
              第4816章 4824  4829   隔離- >SetAbortOnUncaughtExceptionCallback(ShouldAbortOnUncaughtException);
             831  isolate->SetFatalErrorHandler(OnFatalError);
                new Isolateobject,並設定相關參數。 #      c: 4843   int exit_code;
              4844   {
          46     隔離::作用域isolate_scope(隔離);
              4847     HandleScope handle_scope(iso晚) ;
              4848     IsolateDataisolate_data(isolate , event_loop, allocator.zero_fill_field());##   選擇c, argv, exec_argc, exec_argv);
              4850   }
                準備開始執行的參數,isolate物件。 char* const* argv,
              4747                  int exec_argc, const char* const* exec_argv) {
          e:環境準備
                4748   HandleScope handle_scope(isolate);#    context = Context::New(isolate);
                4750   Context::Scope context_scope(context);
           #.     4754   env.Start(argc, argv, exec_argc, exec_argv , v8_is_profiling);
                執行碼src/env.cc:18:void Environment::Start(int argc,
                    載入env
          f:  在d中的函數裡面有eventloop,沒有event的時候,就會退出node

    3.  分析核心部分
            4777   {
           ope     bool more;
            4780 PERFORMANCE_MARK(&env, LOOP_START);
            4781     執行{
            4782 UV_c     4783
            4784       v8_platform.DrainVMTa sks();
           14785 ## 4785 ## 4786更多= uv_loop_alive(env.event_loop());
            4787      if (more)
      789
            4790       EmitBeforeExit(&env);
            4 791 # /發出` beforeExit` 如果循環在發出
    之後變得活躍        4793       // event, or after running some callbacks.
            4794   調函數。
            4795     } while (more == true);
            4796     PERFORMANCE_MARK(&env, LOOP_EXIT);
            4797   }
          a:  處理event的核心函數uv_run
            宣告:deps/uv/include/uv.h:281:_runf.       實現:deps /uv/src/unix/core.c:348:int uv_run(uv_loop_t* loop, uv_run_mode mode) {
          b:  判斷loop是否時alive狀態:是否有handle、request-signal且handle沒有關閉。
             343 int uv_loop_alive(const uv_loop_t* loop) {
             344         336 static int uv__loop_alive(const uv_loop_t* loop) {
             337   return uv__has_active_handles(loop ) ||
             338          uv__has_active_reqs(loop) ||
            339  );      340 }
          c:  uv__has_active_handles(loop):
              deps/uv/src/ uv-common.h:145:#define uv__has_active_handles(loop)                             145 #define uv__has_active_handles(loop)                           146   ((loop)->active_handles > 0)
          d:  uv__has_active_reqs(loop ):
              129 #define                            \
              130   (QUEUE_EMPTY(&(loop)->active_reqs) == 0)







################################################################################################################################################################################################# #

以上是node解釋執行js的過程分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

WebSocket與JavaScript:實現即時監控系統的關鍵技術 WebSocket與JavaScript:實現即時監控系統的關鍵技術 Dec 17, 2023 pm 05:30 PM

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

Pi Node教學:什麼是Pi節點?如何安裝和設定Pi Node? Pi Node教學:什麼是Pi節點?如何安裝和設定Pi Node? Mar 05, 2025 pm 05:57 PM

PiNetwork節點詳解及安裝指南本文將詳細介紹PiNetwork生態系統中的關鍵角色——Pi節點,並提供安裝和配置的完整步驟。 Pi節點在PiNetwork區塊鏈測試網推出後,成為眾多先鋒積極參與測試的重要環節,為即將到來的主網發布做準備。如果您還不了解PiNetwork,請參考Pi幣是什麼?上市價格多少? Pi用途、挖礦及安全性分析。什麼是PiNetwork? PiNetwork項目始於2019年,擁有其專屬加密貨幣Pi幣。該項目旨在創建一個人人可參與

JavaScript與WebSocket:打造高效率的即時天氣預報系統 JavaScript與WebSocket:打造高效率的即時天氣預報系統 Dec 17, 2023 pm 05:13 PM

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

織夢CMS二級目錄打不開的原因分析 織夢CMS二級目錄打不開的原因分析 Mar 13, 2024 pm 06:24 PM

標題:解析織夢CMS二級目錄打不開的原因及解決方案織夢CMS(DedeCMS)是一款功能強大的開源內容管理系統,被廣泛應用於各類網站建設中。然而,有時在搭建網站過程中可能會遇到二級目錄無法開啟的情況,這給網站的正常運作帶來了困擾。在本文中,我們將分析二級目錄打不開的可能原因,並提供具體的程式碼範例來解決這個問題。一、可能的原因分析:偽靜態規則配置問題:在使用

如何在JavaScript中取得HTTP狀態碼的簡單方法 如何在JavaScript中取得HTTP狀態碼的簡單方法 Jan 05, 2024 pm 01:37 PM

JavaScript中的HTTP狀態碼取得方法簡介:在進行前端開發中,我們常常需要處理與後端介面的交互,而HTTP狀態碼就是其中非常重要的一部分。了解並取得HTTP狀態碼有助於我們更好地處理介面傳回的資料。本文將介紹使用JavaScript取得HTTP狀態碼的方法,並提供具體程式碼範例。一、什麼是HTTP狀態碼HTTP狀態碼是指當瀏覽器向伺服器發起請求時,服務

分析騰訊主要的程式語言是否為Go 分析騰訊主要的程式語言是否為Go Mar 27, 2024 pm 04:21 PM

標題:騰訊主要的程式語言是否為Go:一項深入分析騰訊作為中國領先的科技公司,在程式語言的選擇上一直備受關注。近年來,有人認為騰訊主要採用Go作為主要的程式語言。本文將對騰訊主要的程式語言是否為Go進行深入分析,並給出具體的程式碼範例來支持這一觀點。一、Go語言在騰訊的應用Go是一種由Google開發的開源程式語言,它的高效性、並發性和簡潔性受到眾多開發者的喜

分析靜態定位技術的優缺點 分析靜態定位技術的優缺點 Jan 18, 2024 am 11:16 AM

靜態定位技術的優勢與限制分析隨著現代科技的發展,定位技術已成為我們生活中不可或缺的一部分。而靜態定位技術作為其中的一種,具有其特有的優點與限制。本文將對靜態定位技術進行深入分析,以便更了解其應用現狀和未來的發展趨勢。首先,我們來看看靜態定位技術的優勢所在。靜態定位技術是透過對待定位物件進行觀測、測量和計算來實現位置資訊的確定。相較於其他定位技術,

See all articles