Babel運行原理

来源:http://www.cnblogs.com/zhizu/archive/2017/10/21/7705260.html
-Advertisement-
Play Games

前言 之前翻博客園的時候,看到有人朋友分享阿裡巴巴的面試題,其中有一道題就是關於ES6轉ES5 原理的,當時我看到感覺到自己離去阿裡巴巴的路還很遠啊,像我們大部分做開發的時候,都只知其然不知 其所以然,本著好學的態度我也去網上搜了下關於Babel es6轉es5的原理,但是很多都是枯燥難懂,整理了一 ...


   前言

      之前翻博客園的時候,看到有人朋友分享阿裡巴巴的面試題,其中有一道題就是關於ES6轉ES5

原理的,當時我看到感覺到自己離去阿裡巴巴的路還很遠啊,像我們大部分做開發的時候,都只知其然不知

其所以然,本著好學的態度我也去網上搜了下關於Babel es6轉es5的原理,但是很多都是枯燥難懂,整理了一下午

把自己的收穫和大家分享一下,有不對的地方請各位大神指正.

  Babel運行原理

    再說es6怎樣轉es5之前我們首先要來說一下Babel的運行原理,知道運行原理,我們也就不難理解

為什麼Babel能這麼強大.

    Babel工作分為三個階段:

      1.解析:將代碼字元串解析成抽象語法樹

      2.變換:將抽象語法樹

      3.根據變換後的抽象語法樹再生成代碼字元串

    舉個例子:

    

if(1>0){
  alert('hi')  
}

    用圖像更簡單地表達上面的結構:

    

       第1步轉換的過程中可以驗證語法的正確性,同時由字元串變為對象結構後更有利於精準地分析以及進行代碼結構調整。

     第2步原理,就是遍歷這個對象所描述的抽象語法樹,遇到哪裡需要做一下改變,就直接在對象上進行操作,比如我把IfStatement給改成WhileStatement就達到了把條件判斷改成迴圈的效果。

     第3步,遞歸遍歷這顆語法樹,然後生成相應的代碼

   第二步和第三步大家都很好理解,現在我來著重講解第一步.

      解析第一步分為兩個步驟:

        1.分詞:將整個代碼字元串分割成 語法單元 數組

        2.語義分析:在分詞結果的基礎之上分析 語法單元之間的關係

      分詞的過過程從邏輯來講並不難解釋,但是這是個精細活,要考慮清楚所有的情況。還是以一個代碼為例:

      

if (1 > 0) {
  alert("if \"1 > 0\"");
}

        我們希望得到的分詞是:

'if'     ' '       '('    '1'      ' '    '>'    ' '    ')'    ' '    '{'
'\n  '   'alert'   '('    '"if \"1 > 0\""'    ')'    ';'    '\n'   '}'

          這拆分過程其實沒啥可取巧的,就是簡單粗暴地一個字元一個字元地遍歷,然後分情況討論,整個實現方法就是順序遍歷和大量的條件判斷.

    語義分析就是把辭彙進行立體的組合,確定有多重意義的詞語最終是什麼意思、多個詞語之間有什麼關係以及又應該再哪裡斷句等。

    語義分析的過程又是個遍歷語法單元的過程,不過相比較而言更複雜,因為分詞過程中,每個語法單元都是獨立平鋪的,而語法分析中,語句和表達式會以樹狀的結構互相包含。針對這種情況我們可以用棧,也可以用遞歸來實現。

    

   結語

 

      真正看下來,其實沒有哪個地方的原理特別高深莫測,就是精細活,需要考慮到各種各樣的情況。總之要做一個完整的語法解釋器需要的是十分的細心與耐心。

 

  本篇博客是根據 百度外賣前端 進行的總結原博客 https://zhuanlan.zhihu.com/p/27289600 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 為什麼是03,因為我是從今天才意識到輸出也是學習過程中很重要的一環,所以從今天開始,我會把每天學到的新知識記錄下來,溫故而知新。 重申下,每篇文章都是我當天學習的記錄,因本人是小白,水平有限,難免出現紕漏,後續會及時改正。歡迎各位指出錯誤!!! 1,首先來看看overflow的5個基本屬性: 1-1 ...
  • //數據結構對比 增查改刪 { //map、set和Object let item = {t:1}; let map = new Map(); let set = new Set(); let obj = {}; //增 map.set('t',1); set.add(item); obj['t']... ...
  • //數據結構對比 增查改刪 { //map和array對比 let map = new Map(); let array = []; //增 map.set('t',1); array.push({t:1}); console.info('map-array',map,array) //{"t"=>... ...
  • ElementUI的表格要求的數據類型為字典數組。我使用了python3寫後端,那麼從資料庫取數據時添加一行cursorclass=pymysql.cursors.DictCursor即可。取出後我將其存入redis資料庫方便之後取用。取用時使用eval()函數再傳到前端即可。 前端放置Pagina ...
  • 介紹 責任鏈模式(Chain of responsibility)是使多個對象都有機會處理請求,從而避免請求的發送者和接受者之間的耦合關係。將對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理他為止。 請求以後,從第一個對象開始,鏈中收到請求的對象要麼親自處理它,要麼轉發給鏈中的下一個候選者 ...
  • 久違的一文了,有一個多月沒有更新我這個博文了,太懶了;今天突然想起來就把這一文寫了。上回簡單說了下ES6的語法,這回我就做了一個sass的綜合項目練習,我用sass寫了一個頁面。只是一個頁面佈局的練習,沒怎麼運用到js。先貼個代碼先: 這個app.js的代碼。 這個 function.scss,在s ...
  • 1. 前言 最近學習ABP架構 搭建ASP.NET Core with Angular遇到了些問題,折騰了一個禮拜最終在今天解決了,想想這個過程的痛苦就想利用博客記錄下來。其實一直想寫博客,但因為 時間忙和惰性一直沒有寫。之前也遇到些問題,費了很大勁最後解決了,但過了好久又遇到類似問題,但想不起來之 ...
  • 一, onmouseover 和 onmouseout 事件 onmouseover 和 onmouseout 事件可用於在用戶的滑鼠移至 HTML 元素上方或移出元素時觸發函數。 一個小例:滑鼠未在上面前 移到上面後 二, onmousedown、onmouseup 以及 onclick 事件 o ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...