做一個好前端必須要知道的事——JS語言

編程語言按各種方法可以分爲各種類型,現在讓我們來看看JS屬於什麼類型語言

解釋型語言

按編譯執行過程,可以分爲編譯型語言和解釋型語言。比如

  • c 語言,必須先經過編譯生成目標文件,然後鏈接各個目標文件和庫文件,生成可執行文件。
  • Java、scala 則是先編譯成字節碼,然後解釋執行字節碼(可以理解爲編譯型語言也可以理解爲解釋型語言)。準確的理解,java 是編譯型語言,源代碼整個編譯成字節碼,java 字節碼,是解釋型語言。
  • Python 是解釋型語言,不過也可以先進行編譯,編譯成 python 的字節碼。
  • Javascript 是解釋型語言。目前貌似還沒有直接將 js 整個編譯然後才執行(有說法是 js 動態性太強,先整體編譯難度太大,執行性能不如解釋執行高)。

⚠️注意:解釋型語言也是需要編譯的。區分編譯型語言和解釋型語言,是看源代碼是否整個編譯成目標代碼然後執行還是編譯一段執行一段。
對於傳統編譯型語言來說,編譯步驟分爲:詞法分析、語法分析、語義檢查、代碼優化和字節生成。
但對於解釋型語言來說,通過詞法分析和語法分析得到語法樹後,就可以開始解釋執行了(根據語法樹和符號表生成機器碼)。
這也就解釋了爲什麼都說 js 是解釋執行的,讀一句執行一句,但是實際上 js 中還沒執行到的代碼語法錯誤導致整個 js 不會執行的問題。例如:

console.log('不會被console出來');
= // 這裏的語法錯誤導致了上面的代碼也不會執行

其實js變量提升的現象也很明顯的證明了js是先編譯而後執行的
在瀏覽器中,多個<script>標籤中的 js 代碼,是分段編譯的(所以,某一個<script>標籤中的語法錯誤不會導致另一個<script>中的代碼不執行)但是全局對象是共享的。

動態語言

按語言按變量的類型在編譯時確定還是運行時確定可以分爲靜態語言和動態語言。比如

  • java,String s = null; 變量 s 的類型在編譯時就可以確定爲字符串類型。
  • python,變量不需要聲明,變量的類型在第一次賦值時由值的類型確定。
  • js,let val;let = ‘1’; 變量 val 在運行 val=’1’時才能確定爲字符串類型。

弱類型語言

按變量的類型是否在運行時可以改變分爲強類型語言和弱類型語言。比如

  • Java、scala 是強類型語言,變量一旦聲明,它的類型以後不能被改變。
  • Python 是強類型語言。
  • Js 是弱類型語言。比如 let v = ‘1’;v=1;v=true;這在 js 中是合法的。

非常靈活的語言

按語言範式可以分爲聲明式、命令式、函數式語言。

  • 聲明式編程,告訴計算機我要做什麼,而不是如何做。在更高層面寫代碼,更關心的是目標,而不是底層算法實現的過程。例如 css, 正則表達式,sql 語句,html, xml…
  • 命令式編程,告訴計算機如何做,而不管我想要做什麼。解決某一問題的具體算法實現。例如 java、c。
  • 函數式編程,將計算機運算看做是數學中函數的計算,並且避免了狀態以及變量的概念。

很多語言並不是單純的支持某一種範式,像 java8 也添加了部分對函數式的支持。
js 是一個非常靈活的語言,支持命令式和函數式編程。

各種類型語言的優缺點

  • 一般編譯型語言性能比解釋型語言高。但是由於編譯型語言需要先進行編譯。
  • 解釋型語言的好處是,部署到線上的是源代碼,可以直接修改線上環境的代碼,解決一些 bug。比如我們有時候直接修改線上的 js 代碼。
  • 編譯型語言通常會用 xml 做配置文件,因爲我們通常不會改編譯後的字節碼。解釋型語言的配置,直接寫在源代碼裏更方便,用 xml 做配置就顯得多餘。
  • 靜態語言,有利於編譯時檢查。比如 java、在 ide 中爲對象的一個不存在的屬性賦值能在編譯時檢查出錯誤。
  • Js 是動態語言。對象的某個屬性是否存在,在編譯時無法確定。這導致某些錯誤要到運行時纔可能發現。所以一般 js 程序的正確性,更需要單元測試保證
  • 強類型語言由於類型在聲明之後不允許改變,所以能實現編譯時類型檢查。動態語言和弱類型語言,則更靈活,實現相同功能的代碼量通常更少或者更容易實現複雜功能。當然可讀性可維護性方面不如靜態語言和強類型語言。
此文整理自前同事@zhoujiaping的分享
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章