編譯型與解釋型編程語言的區別

来源:https://www.cnblogs.com/superwuchaofan/archive/2022/08/04/16550375.html
-Advertisement-
Play Games

Java 的集合體系 Java集合可分為兩大體系:Collection 和 Map 1.常見的Java集合如下: Collection介面:單列數據,定義了存取一組對象的方法的集合 List:元素有序(指的是存取時,與存放順序保持一致)、可重覆的集合 Set:元素無序、不可重覆的集合 Map介面:雙 ...


前面我們知道了高級編程語言電腦是不能直接識別的,需要通過翻譯成機器碼然後交由電腦執行。

根據不同的翻譯機制,又分為編譯型和解釋型。

註意,翻譯源代碼是一個非常複雜的過程,大致包括詞法分析,語法分析,語義分析,性能優化,目標代碼生成等五個步驟。在初學階段沒有必要研究這個,如果感興趣可以閱讀《編譯原理》一書。

接下來我會使用通用的語言和類比的方式講解編譯和解釋。

編譯型

如果把高級編程語言編寫的代碼比作一篇英文文章,電腦比作一個不懂英文的人。那麼,為了讓這個人閱讀這篇文章,可以找一名懂英文的翻譯將這篇文章整體翻譯成中文版。然後他就可以隨時隨地的閱讀這篇翻譯後的文章。

編譯的過程其實跟上面翻譯的過程很像。

編譯型編程語言就是通過編譯器(英文翻譯)將源代碼(編譯型編程語言編寫的程式,類比英文文章)編譯(翻譯)成可執行文件(翻譯後的文章)。

1658829684074

可執行文件可以在任何支持的平臺上,脫離編譯環境運行。因為可執行程式就是機器碼,所以它的執行效率高。但是編譯型編程語言一般是不能跨平臺的,也就是說不能在不同的操作系統間任意切換, 並且修改程式也非常不方便,只要源代碼修改了,都需要重新編譯生成新的可執行文件。C語言,C++就是典型的編譯型編程語言。

解釋型

接上面的類比,翻譯這篇英文文章,還可以通過隨身電子詞典,逐字逐句的邊看邊翻譯。

解釋型編程語言就是通過解釋器(電子詞典)將源代碼(解釋型編程語言編寫的程式)逐行解釋成機器碼,然後交由電腦執行。

1658904942703

解釋型編程語言編寫的程式離不開解釋器,因為是邊翻譯邊執行所以相對效率不高,但是修改起來非常方便,只要源代碼修改了,下一次執行就是修改後的代碼。解釋型編程語言大都可以跨平臺運行,這歸功於解釋器。Python,php就是典型的解釋型編程語言。

關於Python

Python屬於典型的解釋型編程語言,支持所有常見的平臺,例如Linux,Windows,Mac OS, Android, FreeBSD等等,只要在不同的平臺上安裝了對應的解釋器,代碼就可以正確運行,一般不需要擔心任何相容性問題,真正做到了"一次編寫,到處運行"。

另外,關於執行效率,你可能會看到很多人說python的執行效率差。那隻是相對而言,隨著硬體性能的提升,和很多優化手段,python在某些時候執行效率甚至會超過c語言,所以忘記這個效率問題,全心全意的學習python吧。

總結

總結編譯型編程語言與解釋型語言的區別如下表:

類型 原理 優點 缺點
編譯型語言 通過專門的編譯器,將所有源代碼一次性轉換成特定平臺(Windows、Linux 等)執行的機器碼(以可執行文件的形式存在)。 一次編譯,多次運行,脫離編譯環境,並且運行效率高。 可移植性差,不夠靈活。
解釋型語言 由專門的解釋器,根據需要將部分源代碼臨時轉換成特定平臺的機器碼。 跨平臺性好,通過不同的解釋器,將相同的源代碼解釋成不同平臺下的機器碼。 一邊執行一邊轉換,效率不搞。

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

-Advertisement-
Play Games
更多相關文章
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
  • “生產環境伺服器變慢?如何診斷處理” 這是最近一些工作5年以上的粉絲反饋給我的問題,他們去一線大廠面試,都被問到了這一類的問題。 今天給大家分享一下,面試過程中遇到這個問題,我們應該怎麼回答。 這個問題高手部分的回答,我整理到了一個10W字的文檔裡面,大家可以在我的主頁加V領取。 來看看高手的回答。 ...
  • 1、jsp表達式和EL標簽 1.1 獲取值的區別 1.用法el表達式更加簡潔 2.獲取參數不存在時,jsp表達式時null,el表達式是空; <% request.setAttribute("userName", "kh96"); %> <p>獲取作用域中存在的值:userName_jsp = <% ...
  • SpringBoot 2.7.2 學習系列,本節通過實戰內容講解如何集成 MyBatisPlus 本文在前文的基礎上集成 MyBatisPlus,並創建資料庫表,實現一個實體簡單的 CRUD 介面。 MyBatis Plus 在 MyBatis 做了增強,內置了通用的 Mapper,同時也有代碼生成 ...
  • 最近在研究所做網路終端測試的項目,包括一些嵌入式和底層數據幀的封裝調用。之前很少接觸對二進位原始數據的處理與封裝,所以在此進行整理。 ...
  • 跨域指的是瀏覽器不能執行其他網站的腳本。它是由瀏覽器的同源策略造成的,是瀏覽器對JavaScript施加的安全限制。在做前後端分離項目的時候就需要解決此問題。 ...
  • 在眾多編程語言中,Python的社區生態是其中的佼佼者之一。幾乎所有的技術痛點,例如優化代碼提升速度,在社區內都有很多成功的解決方案。本文分享的就是一份可以令 Python 變快的工具清單,值得瞭解下。 一、序言 這篇文章會提供一些優化代碼的工具。會讓代碼變得更簡潔,或者更迅速。 當然這些並不能代替 ...
  • 動態數組底層是如何實現的 引言: 提到數組,大部分腦海裡一下子想到了一堆東西 int long short byte float double boolean char String 沒錯,他們也可以定義成數組 但是,上面都是靜態的 不過,咱們今天學習的可是動態的(ArrayList 數組) 好接下 ...
一周排行
    -Advertisement-
    Play Games
  • Github / Gitee QQ群(1群) : 813100564 / QQ群(2群) : 579033769 視頻教學 介紹 MiniWord .NET Word模板引擎,藉由Word模板和數據簡單、快速生成文件。 Getting Started 安裝 nuget link : https:// ...
  • Array.Sort Array類中相當實用的我認為是Sort方法,相比起冗長的冒泡排序,它的出現讓排序更加的簡化 結果如下: 還可以聲明一個靜態方法用來專門調用指定數組排序,從名為 array 的一維數組中 a 索引處開始,到 b 元素 從小到大排序。 註意: a + b 不能大於 array 的 ...
  • 前言 在上一篇文章CLR類型系統概述里提到,當運行時掛起時, 垃圾回收會執行堆棧遍歷器(stack walker)去拿到堆棧上值類型的大小和堆棧根。這裡我們來翻譯BotR里一篇專門介紹Stackwalking的文章,希望能加深理解。 順便說一句,StackWalker在中文里似乎還沒有統一的翻譯,J ...
  • 使用過 nginx 的小伙伴應該都知道,這個中間件是可以設置跨域的,作為今天的主角,同樣的 反向代理中間件的 YARP 毫無意外也支持了跨域請求設置。 有些小伙伴可能會問了,怎樣才算是跨域呢? 在 HTML 中,一些標簽,例如 img、a 等,還有我們非常熟悉的 Ajax,都是可以指向非本站的資源的 ...
  • 什麼是Git Git 是一個開源的分散式版本控制系統,用於敏捷高效地處理任何或小或大的項目。 Git 是 Linus Torvalds 為了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟體。 Git 與常用的版本控制工具 CVS, Subversion 等不同,它採用了分散式版本庫的 ...
  • 首先CR3是什麼,CR3是一個寄存器,該寄存器內保存有頁目錄表物理地址(PDBR地址),其實CR3內部存放的就是頁目錄表的記憶體基地址,運用CR3切換可實現對特定進程記憶體地址的強制讀寫操作,此類讀寫屬於有痕讀寫,多數驅動保護都會將這個地址改為無效,此時CR3讀寫就失效了,當然如果能找到CR3的正確地址... ...
  • 說明 onlyoffice為一款開源的office線上編輯組件,提供word/excel/ppt編輯保存操作 以下操作均基於centos8系統,officeonly鏡像版本7.1.2.23 鏡像下載地址:https://yunpan.360.cn/surl_y87CKKcPdY4 (提取碼:1f92 ...
  • 二叉樹查找指定的節點 前序查找的思路 1.先判斷當前節點的no是否等於要查找的 2.如果是相等,則返回當前節點 3.如果不等,則判斷當前節點的左子節點是否為空,如果不為空,則遞歸前序查找 4.如果左遞歸前序查找,找到節點,則返回,否繼續判斷,當前的節點的右子節點是否為空,如果不為空,則繼續向右遞歸前 ...
  • ##Invalid bound statement (not found)出現原因和解決方法 ###前言: 想必各位小伙伴在碼路上經常會碰到奇奇怪怪的事情,比如出現Invalid bound statement (not found),那今天我就來分析以下出現此問題的原因。 其實出現這個問題實質就是 ...
  • ###一、背景知識 爬蟲的本質就是一個socket客戶端與服務端的通信過程,如果我們有多個url待爬取,只用一個線程且採用串列的方式執行,那隻能等待爬取一個結束後才能繼續下一個,效率會非常低。 需要強調的是:對於單線程下串列N個任務,並不完全等同於低效,如果這N個任務都是純計算的任務,那麼該線程對c ...