機器語言 彙編語言 C C++ Java C# javaScript Go 編譯型語言 解釋型語言

最開始的時候只有機器語言,即二進制,程序是由二進制語言編寫的,而後cpu不斷的讀取二進制語言 而後執行命令,最後輸出的也是二進制java

後來出現了彙編語言,可是cpu不認識彙編語言,因此使用匯編語言編寫的程序,最後會通過一道工序轉換爲機器語言(這應該算是最初的即時編譯)linux

後來出現的C語言,由於彙編語言,只能完成簡單的操做,像數據類型 內存操做等彙編語言並無定義,而這是大型系統所必須的一些元素,用戶使用C語言編寫好程序以後,會通過編譯器編譯成cpu能夠執行的機器語言文件,可是不一樣系統對於二進制的支持還不同,因此你須要單獨爲linux和windows分別編譯一下。webpack

在後出現了C++,由於C語言雖然好,可是在作多人合做的大規模項目的時候,使用面向對象思想能夠極高的提升生產力,因此C++在C語言基礎上創造了類 命名空間 繼承等概念,C++的編譯和C語言同樣程序員

再後來出現了Java,由於在Java出現的時候 Java是但願在物聯網行業有所建樹的,可是物聯網行業不一樣的物理設備所搭載的系統是不同的,程序員不可能爲每個系統都編寫一次程序,因而Java創造了jvm虛擬機,用戶須要首先安裝jvm虛擬機 而後才能夠執行java程序,前面咱們知道C和C++是編譯型語言,那Java呢?Java是編譯加解釋型語言,由於Java在代碼完成以後,須要先編譯成.class文件,而後.class文件在運行的時候,仍是被jvm不斷的解釋執行web

在後面出現了C#語言,一樣C#也須要一個相似JVM虛擬機的環境,即CLR,C#語言在代碼編寫完成以後,也會編譯成一箇中間語言,而後中間語言在執行的時候會被CLR解釋成機器語言windows

而後出現了javaScript,javaScript一直生成本身是解釋性語言,這是由於javaScript不須要編譯,代碼寫好以後,直接在瀏覽器打開,而後瀏覽器裏面的JS引擎會不斷的將JS代碼翻譯成機器代碼,可是如今的ES6瀏覽器是沒法識別的,須要通過webpack babel等工具進行轉化成ES5語言,那這一步算不算編譯呢?瀏覽器

GO語言的出現號稱要取代Java在服務器端的地位,由於它具備堪比C++的執行效率,Java的執行效率是不如C++的,由於Java是解釋型的,而C++是編譯型的,GO語言不只具備C++的效率,還拋棄了C++複雜的語法,和Java同樣簡單。服務器

這裏再說一下V8引擎和Node.js:babel

  V8引擎的出現使得JS的執行效率大大提升,由於以前JS代碼在解釋執行的時候是把jS代碼轉換爲一種中間字節碼,而後再把中間字節碼轉換爲機器碼,之因此多一步是由於在轉換爲字節碼轉化,能夠在字節碼層面對程序作不少優化,而V8引擎直接跳過字節碼把JS直接轉換爲機器碼雖然減小了時間可是也失去了優化的機會,可是這一步隨時 V8引擎會用過其餘措施來彌補,這就是V8引擎快速的緣由。併發

  Node.js創建在V8引擎之上,之因此用Node.js編寫服務器端代碼而不是Java編寫服務器端代碼的緣由是,Node.js的單線程機制,由於JS自己是單線程的,這是由瀏覽器環境決定的,因此JS是使用事件機制來處理異步的,即JS在處理大批量操做的時候不會在此處等待,而是將回調函數掛起,而後繼續執行,等到操做完成以後,回調函數會被放到時間隊列中等待執行。這樣作有一個好處是 服務器端不須要針對每個請求都開闢一個內存去維護他,Java是會爲每個請求單獨開一個內存來維護的,直到請求結束,這塊內存不會被釋放,試想 在面對高併發的時候,一樣的併發數 也許Java被充爆了,可是Node.js依然運行良好,可是Node.js的自己的單線程機制決定了他沒法利用多核的優點,這能夠經過pm2的負載均衡來解決。

相關文章
相關標籤/搜索