您好,登錄后才能下訂單哦!
這篇文章主要介紹“JavaScript與C++的差異是什么”,在日常操作中,相信很多人在JavaScript與C++的差異是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”JavaScript與C++的差異是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
在正式開始向各位前端開發者介紹 C++ 語言之前,我們先討論一下 C++ 語言與 JavaScript 語言的差異(為了約束討論的范圍,這里就不提 HTML 和 CSS 了
)。
C++ 語言于 1979 年由貝爾實驗室的 Bjarne Stroustrup(本賈尼·斯特勞斯特盧普)研發,1983 年正式命名為 C++。而 JavaScript 于 1995 年由網景公司的 Brendan Eich(布蘭登·艾克)研發。可以說,這兩門語言都經歷了時間的檢驗,各自擁有大量的擁躉,也都形成了獨立的社區和生態。
本來兩門語言各有各的戰場,并沒什么交集,但自從 Node.js 框架出現之后,JavaScript 就擺脫了瀏覽器的樊籠,開始滲透進入系統應用的領域;WebAssembly 技術出現之后,C++ 也有了進入 Web 領域的渠道了(不談原生瀏覽器插件),所以,現在越來越多的開發者開始同時關注這兩門語言。
C++ 屬于編譯型語言
,編譯型語言就是指那些要事先把源代碼編譯成機器代碼才能在目標機器上運行的語言。
JavaScript 語言則屬于解釋型語言
,解釋型語言是指那些可以直接在目標機器的解釋器里運行的語言。
也就是說,如果我們用 C++ 語言開發了一個可執行程序,那么這個程序可以在指定的機器上,不依賴任何其他程序運行。這里說的指定的機器,是編譯 C++ 代碼時指定的(比如編譯 C++ 代碼時要指定 x86 架構或 Arm 架構)。如下圖所示:
JavaScript 語言則不同,開發者開發的 JavaScript 代碼可以在任何機器的 JavaScript 解釋器里運行。也就是說 JavaScript 運行時是要依賴解釋器的,Node.js 或者 Chrome 瀏覽器都內置了 JavaScript 解釋器(也就是 V8 引擎)。
如下圖所示:
V8 引擎內部還有即時編譯器,并不是一個簡簡單單的 JavaScript 解釋器,但本小冊不討論 JavaScript 解釋引擎的 JIT 能力。Webpack 或 Rollup 等工具并沒有編譯 JavaScript 代碼,它們只完成了 JavaScript 代碼的捆扎和壓縮工作。
C++ 的編譯器里包含預處理器、鏈接器等工作部件,并不是一步到位就能把 C++ 代碼變成二進制可執行程序的。另外,還有一些語言會先編譯成字節碼,再通過運行時環境執行字節碼,比如 C# 或 Java 就是這類語言。這些內容都超出了本小冊所討論的范疇,不再深入介紹。
這兩種語言運行在不同的環境中,可以說從根源上就是不一樣的。
我們知道 C++ 開發的程序不依賴任何解釋器,可以直接訪問操作系統 API ,控制目標機器的內存和 CPU 。而 JavaScript 開發的程序要先經過解釋器解釋,再通過解釋器訪問操作系統的 API ,控制目標機器的內存和 CPU 。完成相同的任務 C++ 非常直接,而 JavaScript 則要繞很大一段路,這是 JavaScript 性能表現不及 C++ 的原因之一
。
我們可以說 JavaScript 解釋器就是 JavaScript 的“保姆”,它負責看護著 JavaScript 的運行,由于有這么個“保姆”的存在,所以 JavaScript 語言設計得非常靈活。比如,JavaScript 開發者完全不用擔心垃圾收集的問題(變量超出作用域之后,它占用的內存該如何釋放),“保姆”會幫開發者完成這項任務。
然而“保姆”在做垃圾收集工作時非常拖沓(遞歸查找未被引用的變量),而且不一定在最合適的時機完成任務(新生代內存快滿時才有可能執行垃圾收集),類似這樣的事還有很多,比如字符串操作、容器管控等,JavaScript 程序員都沒辦法深入底層控制細節,這是 JavaScript 性能表現不及 C++ 的原因之二
。
關于字符串的處理,Chromium 的開發者曾說,網頁操作字符串的調用次數占內存管理器調用總次數的一半以上,相信這些字符串操作有很大一部分都是由 JavaScript 造成的。
另外,JavaScript 的設計者把 JavaScript 設計成單線程執行的語言(盡管各個 JS 運行環境都提供了多線程機制,比如:Web Worker 和 Worker thread,但這并不意味著 JavaScript 本身擁有多線程的能力),當 JavaScript 完成大量計算工作的任務時,比如編解碼、大數據格式化等,JavaScript 的運行線程就會被阻塞,無法再處理其他任務了,只有當前任務執行完成之后,才能再繼續執行掛起的任務。而 C++ 則沒有這方面的限制,開發者可以很從容地使用多線程技術完成并行任務的處理邏輯。這是 JavaScript 性能表現不及 C++ 的原因之三
。
類似的原因還有很多,但更多的時候一個應用程序性能的優劣還是取決于開發者的編碼水平,C++ 表現再好,開發者能力不足,也會寫出性能表現差勁的應用程序。
一開始 C++ 語言只是 C 語言的增強版,C++ 語言最初的名字就是 C With Classes,顧名思義就是具備類型特性的 C 語言。后來經過長時間的發展,C++ 變成了一個支持多種語言范式的編程語言,它同時支持過程范式、面向對象范式、函數范式、泛型范式、元編程范式等編程范式。所以,開發者可以使用不同的編程風格用 C++ 開發應用程序。
JavaScript 的發展路線則非常簡單,很長時間以來 JavaScript 都是以函數式編程范式為主,JavaScript Class 關鍵字出現之前,想要使用 JavaScript 封裝對象還要使用如下這樣蹩腳的方法:
function Person(name) { this.name = name; this.run = () => { console.log(`${this.name} run`); }; } let person = new Person("allen"); person.run();
自從 JavaScript 引入了 class 、extends 等關鍵字之后,再加上 TypeScript 語言的幫助,它在面向對象領域的發展越來越好,目前 JavaScript 語言開發者主要使用函數泛式和面向對象泛式開發應用程序。
另外,C++ 在創建一份數據(變量、參數、返回值等)時,需要顯式指明該數據的類型。通常情況下(未經類型轉換操作),這些數據的類型一旦被定義,那么它永遠就是該數據類型,在程序的整個生命周期也不再改變。因此,我們說 C++ 是強類型的語言。
JavaScript 在創建一份數據時并不強制定義數據的類型,數據的類型也會隨著環境的改變而改變,給數據賦予不同的值,數據將得到不同的類型。不需要經過明確的類型轉換操作。因此,我們說 JavaScript 是弱類型的語言。
除此之外,C++ 語言細節特別多,JavaScript 則比較少,雖然兩門語言都支持面向對象編程范式和函數式編程范式,但在這兩個方向上 C++ 的語法細節比 JavaScript 語法細節多了一倍恐怕還不止,這也是社區里抱怨 C++ 難學、學習曲線陡峭、坑多的原因之一。
C++ 的長處更多在于它對許多問題都是很好的解決途徑,而不在于它對某個特定問題是最好的解決途徑。C++ 最有實力的地方并不是它的某個獨到之處特別偉大,而在于它在事物的大范圍變化中的表現都很不錯。
除了這些風格上的差異之外,JavaScript 與 C++ 還有很多差異,我們將在后續的章節中細細介紹。
由于 JavaScript 是在解釋器內執行的,所以解釋器提供了什么能力,JavaScript 就擁有什么能力。比如:JavaScript 在瀏覽器內可以通過 WebGPU 訪問 GPU 硬件,但無法訪問客戶端的文件系統。
JavaScript 在 Node.js 環境下可以通過 Node.js 內置的 fs 模塊訪問客戶端的文件系統,卻沒辦法直接訪問 GPU 硬件。無論 JavaScript 在瀏覽器中運行,還是在 Node.js 環境中運行,都沒辦法直接創建操作系統服務。
除此之外,不同的解釋器解釋 JavaScript 的方式也不一樣,同樣的代碼在不同的解釋器環境中可能擁有不同的能力表現,這種現象在瀏覽器發展的早期,標準尚未確定時非常常見。
C++ 則不同,C++ 編譯后的程序是二進制的,可以直接在操作系統上運行的,并不像 JavaScript 一樣受制于解釋器,也就是說客戶端操作系統提供了什么 API 它就擁有什么能力。無論是訪問文件系統,還是訪問設備硬件,都沒有任何阻礙。
另外在一些嵌入式設備上,內存和 CPU 硬件資源有限,JavaScript 語言在這類設備上運行會顯得力不從心,畢竟 JavaScript 內存占用較高,執行效率較差,C++ 語言則可以在這類設備上表現得很好。
到此,關于“JavaScript與C++的差異是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。