溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript與C++的差異是什么

發(fā)布時間:2023-04-03 16:23:14 來源:億速云 閱讀:90 作者:iii 欄目:開發(fā)技術

這篇文章主要介紹“JavaScript與C++的差異是什么”,在日常操作中,相信很多人在JavaScript與C++的差異是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”JavaScript與C++的差異是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

在正式開始向各位前端開發(fā)者介紹 C++ 語言之前,我們先討論一下 C++ 語言與 JavaScript 語言的差異(為了約束討論的范圍,這里就不提 HTML 和 CSS 了)。

C++ 語言于 1979 年由貝爾實驗室的 Bjarne Stroustrup(本賈尼·斯特勞斯特盧普)研發(fā),1983 年正式命名為 C++。而 JavaScript 于 1995 年由網(wǎng)景公司的 Brendan Eich(布蘭登·艾克)研發(fā)。可以說,這兩門語言都經(jīng)歷了時間的檢驗,各自擁有大量的擁躉,也都形成了獨立的社區(qū)和生態(tài)

本來兩門語言各有各的戰(zhàn)場,并沒什么交集,但自從 Node.js 框架出現(xiàn)之后,JavaScript 就擺脫了瀏覽器的樊籠,開始滲透進入系統(tǒng)應用的領域;WebAssembly 技術出現(xiàn)之后,C++ 也有了進入 Web 領域的渠道了(不談原生瀏覽器插件),所以,現(xiàn)在越來越多的開發(fā)者開始同時關注這兩門語言。

運行環(huán)境的差異

C++ 屬于編譯型語言編譯型語言就是指那些要事先把源代碼編譯成機器代碼才能在目標機器上運行的語言。

JavaScript 語言則屬于解釋型語言解釋型語言是指那些可以直接在目標機器的解釋器里運行的語言。

也就是說,如果我們用 C++ 語言開發(fā)了一個可執(zhí)行程序,那么這個程序可以在指定的機器上,不依賴任何其他程序運行。這里說的指定的機器,是編譯 C++ 代碼時指定的(比如編譯 C++ 代碼時要指定 x86 架構或 Arm 架構)。如下圖所示:

JavaScript與C++的差異是什么

JavaScript 語言則不同,開發(fā)者開發(fā)的 JavaScript 代碼可以在任何機器的 JavaScript 解釋器里運行。也就是說 JavaScript 運行時是要依賴解釋器的,Node.js 或者 Chrome 瀏覽器都內(nèi)置了 JavaScript 解釋器(也就是 V8 引擎)。

如下圖所示:

JavaScript與C++的差異是什么

V8 引擎內(nèi)部還有即時編譯器,并不是一個簡簡單單的 JavaScript 解釋器,但本小冊不討論 JavaScript 解釋引擎的 JIT 能力。Webpack 或 Rollup 等工具并沒有編譯 JavaScript 代碼,它們只完成了 JavaScript 代碼的捆扎和壓縮工作。

C++ 的編譯器里包含預處理器、鏈接器等工作部件,并不是一步到位就能把 C++ 代碼變成二進制可執(zhí)行程序的。另外,還有一些語言會先編譯成字節(jié)碼,再通過運行時環(huán)境執(zhí)行字節(jié)碼,比如 C# 或 Java 就是這類語言。這些內(nèi)容都超出了本小冊所討論的范疇,不再深入介紹。

這兩種語言運行在不同的環(huán)境中,可以說從根源上就是不一樣的。

執(zhí)行效率的差異

我們知道 C++ 開發(fā)的程序不依賴任何解釋器,可以直接訪問操作系統(tǒng) API ,控制目標機器的內(nèi)存和 CPU 。而 JavaScript 開發(fā)的程序要先經(jīng)過解釋器解釋,再通過解釋器訪問操作系統(tǒng)的 API ,控制目標機器的內(nèi)存和 CPU 。完成相同的任務 C++ 非常直接,而 JavaScript 則要繞很大一段路,這是 JavaScript 性能表現(xiàn)不及 C++ 的原因之一。

我們可以說 JavaScript 解釋器就是 JavaScript 的“保姆”,它負責看護著 JavaScript 的運行,由于有這么個“保姆”的存在,所以 JavaScript 語言設計得非常靈活。比如,JavaScript 開發(fā)者完全不用擔心垃圾收集的問題(變量超出作用域之后,它占用的內(nèi)存該如何釋放),“保姆”會幫開發(fā)者完成這項任務。

然而“保姆”在做垃圾收集工作時非常拖沓(遞歸查找未被引用的變量),而且不一定在最合適的時機完成任務(新生代內(nèi)存快滿時才有可能執(zhí)行垃圾收集),類似這樣的事還有很多,比如字符串操作、容器管控等,JavaScript 程序員都沒辦法深入底層控制細節(jié),這是 JavaScript 性能表現(xiàn)不及 C++ 的原因之二

關于字符串的處理,Chromium 的開發(fā)者曾說,網(wǎng)頁操作字符串的調(diào)用次數(shù)占內(nèi)存管理器調(diào)用總次數(shù)的一半以上,相信這些字符串操作有很大一部分都是由 JavaScript 造成的。

另外,JavaScript 的設計者把 JavaScript 設計成單線程執(zhí)行的語言(盡管各個 JS 運行環(huán)境都提供了多線程機制,比如:Web Worker 和 Worker thread,但這并不意味著 JavaScript 本身擁有多線程的能力),當 JavaScript 完成大量計算工作的任務時,比如編解碼、大數(shù)據(jù)格式化等,JavaScript 的運行線程就會被阻塞,無法再處理其他任務了,只有當前任務執(zhí)行完成之后,才能再繼續(xù)執(zhí)行掛起的任務。而 C++ 則沒有這方面的限制,開發(fā)者可以很從容地使用多線程技術完成并行任務的處理邏輯。這是 JavaScript 性能表現(xiàn)不及 C++ 的原因之三

類似的原因還有很多,但更多的時候一個應用程序性能的優(yōu)劣還是取決于開發(fā)者的編碼水平,C++ 表現(xiàn)再好,開發(fā)者能力不足,也會寫出性能表現(xiàn)差勁的應用程序。

編程風格的差異

一開始 C++ 語言只是 C 語言的增強版,C++ 語言最初的名字就是 C With Classes,顧名思義就是具備類型特性的 C 語言。后來經(jīng)過長時間的發(fā)展,C++ 變成了一個支持多種語言范式的編程語言,它同時支持過程范式、面向?qū)ο蠓妒健⒑瘮?shù)范式、泛型范式、元編程范式等編程范式。所以,開發(fā)者可以使用不同的編程風格用 C++ 開發(fā)應用程序。

JavaScript 的發(fā)展路線則非常簡單,很長時間以來 JavaScript 都是以函數(shù)式編程范式為主,JavaScript Class 關鍵字出現(xiàn)之前,想要使用 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 語言的幫助,它在面向?qū)ο箢I域的發(fā)展越來越好,目前 JavaScript 語言開發(fā)者主要使用函數(shù)泛式和面向?qū)ο蠓菏介_發(fā)應用程序。

另外,C++ 在創(chuàng)建一份數(shù)據(jù)(變量、參數(shù)、返回值等)時,需要顯式指明該數(shù)據(jù)的類型。通常情況下(未經(jīng)類型轉換操作),這些數(shù)據(jù)的類型一旦被定義,那么它永遠就是該數(shù)據(jù)類型,在程序的整個生命周期也不再改變。因此,我們說 C++ 是強類型的語言。

JavaScript 在創(chuàng)建一份數(shù)據(jù)時并不強制定義數(shù)據(jù)的類型,數(shù)據(jù)的類型也會隨著環(huán)境的改變而改變,給數(shù)據(jù)賦予不同的值,數(shù)據(jù)將得到不同的類型。不需要經(jīng)過明確的類型轉換操作。因此,我們說 JavaScript 是弱類型的語言

除此之外,C++ 語言細節(jié)特別多,JavaScript 則比較少,雖然兩門語言都支持面向?qū)ο缶幊谭妒胶秃瘮?shù)式編程范式,但在這兩個方向上 C++ 的語法細節(jié)比 JavaScript 語法細節(jié)多了一倍恐怕還不止,這也是社區(qū)里抱怨 C++ 難學、學習曲線陡峭、坑多的原因之一。

C++ 的長處更多在于它對許多問題都是很好的解決途徑,而不在于它對某個特定問題是最好的解決途徑。C++ 最有實力的地方并不是它的某個獨到之處特別偉大,而在于它在事物的大范圍變化中的表現(xiàn)都很不錯。

除了這些風格上的差異之外,JavaScript 與 C++ 還有很多差異,我們將在后續(xù)的章節(jié)中細細介紹。

程序能力的差異

由于 JavaScript 是在解釋器內(nèi)執(zhí)行的,所以解釋器提供了什么能力,JavaScript 就擁有什么能力。比如:JavaScript 在瀏覽器內(nèi)可以通過 WebGPU 訪問 GPU 硬件,但無法訪問客戶端的文件系統(tǒng)。

JavaScript 在 Node.js 環(huán)境下可以通過 Node.js 內(nèi)置的 fs 模塊訪問客戶端的文件系統(tǒng),卻沒辦法直接訪問 GPU 硬件。無論 JavaScript 在瀏覽器中運行,還是在 Node.js 環(huán)境中運行,都沒辦法直接創(chuàng)建操作系統(tǒng)服務。

除此之外,不同的解釋器解釋 JavaScript 的方式也不一樣,同樣的代碼在不同的解釋器環(huán)境中可能擁有不同的能力表現(xiàn),這種現(xiàn)象在瀏覽器發(fā)展的早期,標準尚未確定時非常常見。

C++ 則不同,C++ 編譯后的程序是二進制的,可以直接在操作系統(tǒng)上運行的,并不像 JavaScript 一樣受制于解釋器,也就是說客戶端操作系統(tǒng)提供了什么 API 它就擁有什么能力。無論是訪問文件系統(tǒng),還是訪問設備硬件,都沒有任何阻礙。

另外在一些嵌入式設備上,內(nèi)存和 CPU 硬件資源有限,JavaScript 語言在這類設備上運行會顯得力不從心,畢竟 JavaScript 內(nèi)存占用較高,執(zhí)行效率較差,C++ 語言則可以在這類設備上表現(xiàn)得很好。

到此,關于“JavaScript與C++的差異是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI