程序解釋與編譯

?1.程序的解釋執行方式

程序語言強寫的計策機指令序列稱為“源程序”,計算機并不能直接執行用高級語言編寫的源程序,源程序必須通過“翻譯程序”翻譯成機器指令的形式,計算機才能項別和執行。源程序的翻譯有兩種方式:解釋執行和編譯執行。不同的程序語言,有不同的翻譯程序,這些翻譯程序稱為程序解釋器(也稱為虛擬機)或程序編譯器(簡稱為編譯器)。

1)程序的解釋執行過程

解釋程序的工作過程如下:首先,由語言解釋器(如Python)進行初始化準備工作。然后語言解釋器從源程序中讀取一個語句(指令),并對指令進行語法檢查,如果程序語法有錯,則輸出錯誤信息;否則,將源程序語句翻譯成機器執行指令,并執行相應的機器操作。返回后檢查解釋工作是否完成,如果未完成,語言解釋器繼續解釋下一語句,直至整個程序執行完成。否則,進行必要的善后處理工作。

語言解釋器一般包含在開發軟件或操作系統內,如IE瀏覽器帶有.Net腳本語言解釋功能;也有些語言解釋器是獨立的,如Python解釋器就包含在Python軟件包中。

2)解釋程序的特點

解釋程序的優點是實現簡單,交互性較好。動態程序語言(如Python、PHP、JavaScript、R、MATLIB等)一般采用解釋執行方式。
解釋程序有以下缺點:一是程序運行效率低,如源程序中出現循環語句時,解釋程序也要重復地解釋并執行這一組語句;二是程序的獨立性不強,不能在操作系統下直接運行,因為操作系統不一定提供這個語言的解釋器;三是程序代碼保密性不強,例如,要發布Python開發項目,實際上就是發布Python源代碼。

?2.程序的編譯執行方式

程序員編寫好源程序后,由編譯器將源程序翻譯成計算機可執行的機器代碼。程序編譯完成后就不再需要再次編譯了,生成的機器代碼可以反復執行。

源程序編譯是一個復雜的過程,這一過程分為以下步驟:源程序→預處理→詞法分析→語法分析→語義分析→生成中間代碼→代碼優化→生成目標程序→程序連接→生成可執行程序。事實上,某些步驟可能組合在一起進行。

在編譯過程中,源程序的各種信息被保存在不同表格里,編譯工作的各個階段都涉及構造、查找或更新有關表格。如果編譯過程中發現源程序有錯誤,編譯器會報告錯誤的性質和發生錯誤的代碼行,這些工作稱為出錯處理。

1)預處理

一個源程序有時可能分成幾個模塊存放在不同的文件里,預處理的工作之一是將這些源程序匯集到一起;其次,為了加快編譯速度,編譯器往往需要提前對一些頭文件及程序代碼進行預處理,以便在源程序正式編譯時節省系統資源開銷。例如,C語言的預處理包括文件合并、宏定義展開、文件包含、條件編譯等內容。

2)詞法分析

編譯器的功能是解釋程序文本的語義,不幸的是計算機很難理解文本,文本文件對計算機來說就是字節序列,為了理解文本的含義,就需要借助詞法分析程序。詞法分析是將源程序的字符序列轉換為標記(Token)序列的過程。詞法分析的過程是編譯器一個字符一個字符地讀取源程序,然后對源程序字符流進行掃描和分解,從而識別出一個個獨立的單詞或符號(分詞)。在詞法分析過程中,編譯器還會對標記進行分類。
單詞是程序語言的基本語法單位,一般有四類單詞:一是語言定義的關鍵字或保留字(如if、for等);二是標識符(如x、i、list等);三是常量(如0、3.14159等);四是運算符和分界符(如十、一、*、/、=、;等)。如何進行“分詞”是詞法分析的重要工作。

3)語法分析

語法分析過程是把詞法分析產生的單詞,根據程序語言的語法規則,生成抽象語法樹(AST),語法樹是程序語句的樹形結構表示,編譯器將利用語法樹進行語法規則分析。語法樹的每一個節點都代表著程序代碼中的一個語法結構,例如包、類型、標識符、表達式、運算符、返回值等。后續的工作是對抽象語法樹進行分析。

符號表是由一組符號地址和符號信息構成的表格。符號表中登記的信息在編譯的不同階段都要用到。在語法分析中,符號表登記的內容將用于語法分析檢查;在語義分析中,符號表所登記的內容將用于語義檢查和產生中間代碼;在目標代碼生成階段,當對符號名進行地址分配時,符號表是地址分配的依據。

4)語義分析

語義分析是對源程序的上下文進行檢查,審查有無語義錯誤。語義分析主要任務有靜態語義審查、上下文相關性審查、類型匹配審查、數據類型轉換、表達式常量折疊等。
源程序中有些語句按照語法規則判斷是正確的,但是它不符合語義規則。例如,使用了沒有聲明的變量;或者對一個過程名賦值;或者調用函數時參數類型不合適;或者參加運算的兩個變量類型不匹配等。當源程序不符合語言規范時,編譯器會報告出錯信息。
表達式常量折疊就是對常量表達式計算求值,并用求得的值來替換表達式,放入常量表。例如,s=1+2折疊之后為常量3,這也是一種編譯優化。

5)生成中間代碼

語義分析正確后,編譯器會生成相應的中間代碼。中間代碼是一種介于源程序和目標代碼之間的中間語言形式,它的目的是:便于后面做優化處理,便于程序的移植。中間代碼常見形式有四元式、三元式、逆波蘭表達式等。由中間代碼很容易生成目標代碼。

6)代碼優化

代碼優化的目的是為了得到高質量的目標程序。

7)生成目標程序

生成目標程序不僅與編譯技術有關,而且與機器硬件結構關系密切。例如,充分利用機器的硬件資源,減少對內存的訪問次數;根據機器硬件特點(如多核CPU)調整目標代碼,提高執行效率。生成目標程序的過程實際上是把中間代碼翻譯成匯編指令的過程。

8)鏈接程序

目標程序還不能直接執行,因為程序中可能還有許多沒有解決的問題。例如,源程序可能調用了某個庫函數等。鏈接程序的主要工作就是將目標文件和函數庫彼此連接,生成一個能夠讓操作系統執行的機器代碼文件(軟件)。

9)生成可執行程序(機器代碼)

機器代碼生成是編譯過程的最后階段。機器代碼生成不僅僅需要將前面各個步驟所生成的信息(語法樹、符號表、目標程序等)轉化成機器代碼寫入到磁盤中,編譯器還會進行少量的代碼添加和轉換工作。經過上述過程后,源程序最終轉換成可執行文件了。

?3.程序編譯失敗的主要原因

完美的程序不會一次就寫成功,都需要經過反復修改、調試和編譯。Google和香港科技大學的研究人員分析了Google工程師的2600萬次編譯,分析了編譯失敗的常見原因:一是編譯失敗率與編譯次數、開發者經驗無關;二是大約65%的Java編譯錯誤與依賴有關,如編譯器無法找到一個符號(占編譯錯誤的43%),或者是包文件不存在;在C++編譯中,53%的編譯錯誤是使用了未聲明的標識符和不存在的類變量。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/207379.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/207379.shtml
英文地址,請注明出處:http://en.pswp.cn/news/207379.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網絡編程基礎api

1. IP 協議 1.1 IP 分片 (1)IP 分片和重組主要依靠 IP 頭部三個字段:數據報標識、標志和片偏移 以太網幀的 MTU 是 1500 字節; 一個每個分片都有自己的 IP 頭部,它們都具有相同的標識值,有不同的片偏移…

css 十字分割線(含四等分布局)

核心技術 偽類選擇器含義li:nth-child(2)第2個 lili:nth-child(n)所有的lili:nth-child(2n)所有的第偶數個 lili:nth-child(2n1)所有的第奇數個 lili:nth-child(-n5)前5個 lili:nth-last-child(-n5)最后5個 lili:nth-child(7n)選中7的倍數 border-right: 3px solid white;borde…

EasyExcel-最簡單的讀寫excel工具類

前言&#xff1a; easyExcel 的官網文檔給的示例非常全&#xff0c;可以參考https://easyexcel.opensource.alibaba.com/docs/current/quickstart/read 在此我貼出自己的工具類&#xff0c;可以直接用 導包 <dependency><groupId>com.alibaba</groupId><…

機器學習第15天:GBDT模型

??主頁 Nowl &#x1f525;專欄《機器學習實戰》 《機器學習》 &#x1f4d1;君子坐而論道&#xff0c;少年起而行之 ?? 文章目錄 GBDT模型介紹 Boosting 殘差 GBDT的缺點 python代碼實現 代碼 模型參數解釋 結語 GBDT模型介紹 GBDT&#xff08;Gradient Boos…

vivado $clog2函數

對于.v文件在vivado中是不支持&#xff0c;但是可以修改為.sv或更改文件屬性使用sytemverilog來支持。 /*** Math function: $clog2 as specified in Verilog-2005** clog2 0 for value 0* ceil(log2(value)) for value > 1** This implementatio…

php+mysql期末作業小項目

目錄 1、登錄界面 2、注冊界面 3、主界面 4、學生表界面 5 、查詢學生界面?編輯 6、修改學生信息界面?編輯 7、刪除學生信息界面 8、添加學生信息界面 9、后臺數據庫?編輯 一個簡單的php?mysql項目學生信息管理系統&#xff0c;用于廣大學子完成期末作業的參考&…

測試架構工程師需要具備哪些能力 ?

前言 相比于我們常見的研發架構師&#xff0c;測試架構師是近幾年才出現的一個崗位&#xff0c;當然崗位title其實沒有特殊的含義&#xff0c;在我看來測試架構師其實更像對某一類人的抽象稱呼和對其復合能力的期待及認可。 在聊這篇文章的主題之前&#xff0c;先來看這樣一個…

算法訓練營Day4(鏈表)

語言 采用的Java語言&#xff0c;一些分析也是用于Java&#xff0c;請注意。 24. 兩兩交換鏈表中的節點 24. 兩兩交換鏈表中的節點 - 力扣&#xff08;LeetCode&#xff09; 解題 這道題就是考驗鏈表的基礎操作&#xff0c;但是有個語言方面的知識需要去掌握&#xff0c;就是|…

TCP通信

第二十一章 網絡通信 本章節主要講解的是TCP和UDP兩種通信方式它們都有著自己的優點和缺點 這兩種通訊方式不通的地方就是TCP是一對一通信 UDP是一對多的通信方式 接下來會一一講解 TCP通信 TCP通信方式呢 主要的通訊方式是一對一的通訊方式&#xff0c;也有著優點和缺點…

如何在Android平板上遠程連接Ubuntu服務器使用code-server代碼開發

目錄 1.ubuntu本地安裝code-server 2. 安裝cpolar內網穿透 3. 創建隧道映射本地端口 4. 安卓平板測試訪問 5.固定域名公網地址 6.結語 1.ubuntu本地安裝code-server 準備一臺虛擬機,Ubuntu或者centos都可以&#xff0c;這里以VMwhere ubuntu系統為例 下載code server服務…

el-table 表格多選(后端接口搜索分頁)實現已選中的記憶功能。實現表格數據和已選數據(前端分頁)動態同步更新。

實現效果&#xff1a;&#xff08;可拉代碼下來看&#xff1a;vue-demo: vueDemo&#xff09; 左側表格為點擊查詢調用接口查詢出來的數據&#xff0c;右側表格為左側表格所有選擇的數據&#xff0c;由前端實現分頁。 兩個el-table勾選數據聯動更新 實現邏輯&#xff1a; el-…

低代碼開發到底是補品還是垃圾食品?

2023&#xff0c;低代碼徹底火了&#xff0c;甚至火到沒有點相關經驗&#xff0c;都不好意思出去面試的程度。 從業者對低代碼的發展充滿了想象&#xff0c;都認為未來低代碼的商業價值不可估量。 據Gartner的最新報告顯示&#xff0c;2023年全球低代碼開發技術市場規模預計將…

內部文件上傳以及渲染-接口API

文件上傳 地址http://172.16.0.118:8090/api/pm/base/affix/upload請求類型POSTContent-Type:text/plain;charsetutf-8參數 prjData {"prjId":"", "jobId":"3031b2c8-c809-4110-8e88-22c80a9c1ec0721aca89-96a1-4346-9b6e-022331d221d1Nec…

【EMNLP 2023】面向Stable Diffusion的自動Prompt工程算法BeautifulPrompt

近日&#xff0c;阿里云人工智能平臺PAI與華南理工大學朱金輝教授團隊合作在自然語言處理頂級會議EMNLP2023上發表了BeautifulPrompt的深度生成模型&#xff0c;可以從簡單的圖片描述中生成高質量的提示詞&#xff0c;從而使文生圖模型能夠生成更美觀的圖像。BeautifulPrompt通…

【MATLAB】MODWT分解+FFT+HHT組合算法

有意向獲取代碼&#xff0c;請轉文末觀看代碼獲取方式~也可轉原文鏈接獲取~ 1 基本定義 MODWT分解FFTHHT組合算法是一種綜合性的信號處理方法&#xff0c;它結合了經驗小波變換&#xff08;Empirical Wavelet Transform&#xff0c;EWT&#xff09;、快速傅里葉變換&#xff…

25.Oracle的回收站

oracle基礎系統學習目錄 01.CentOS7靜默安裝oracle11g 02.Oracle的啟動過程 03.從簡單的sql開始 04.Oracle的體系架構 05.Oracle數據庫對象 06.Oracle數據備份與恢復 07.用戶和權限管理 08.Oracle的表 09.Oracle表的分區 10.Oracle的同義詞與序列 11.Oracle的視圖 12.Oracle的…

愛智EdgerOS之深入解析如何應用愛智的視頻流模塊完成拉流

一、ONVIF 規范和常見視頻流傳輸協議 ① ONVIF 規范 隨著視頻監控產業鏈的成熟&#xff0c;市面上陸陸續續出現了各式各樣的網絡攝像設備&#xff0c;這些設備都需要通訊協議才能進行數據傳輸。早期廠商都采用私有協議&#xff0c;但是現在廠商分工明確&#xff0c;有的負責生…

程序員的技術成長攻略

推薦語&#xff1a;偶爾在公眾號看到的一篇文章&#xff0c;寫的非常好&#xff0c;在此分享給各位程序員兄弟&#xff0c;不光是對技術成長有幫助&#xff0c;其他領域也是同樣適用的&#xff01;建議反復閱讀&#xff0c;形成一套自己的技術成長策略。 原文地址&#xff1a;…

數據結構與算法:python棧和隊列的用法

python的棧和隊列其實都算作一個數組&#xff0c;棧從最后一個元素開始推出&#xff0c;隊列從第一個元素開始推出 # pop(0)刪除時間復雜度O(n) s [] #棧 q [] #隊列 s.append(1)#1入棧 q.append(1)#1入隊 s.pop()#出棧 q.pop(0)#出隊由于從第一個元素刪除需要挪動數組&…

【EI會議征稿】2024年粵港澳大灣區數字經濟與人工智能國際學術會議(DEAI2024)

2024年粵港澳大灣區數字經濟與人工智能國際學術會議(DEAI2024) 2024 Guangdong-Hong Kong-Macao Greater Bay Area International Conference on Digital Economy and Artificial Intelligence(DEAI2024) 2024年粵港澳大灣區數字經濟與人工智能國際學術會議(DEAI2024)由廣東科…