用「程式設計語言」寫的程式稱為原始程式。原始碼是指未經編譯的,按照一定的程式設計語言規範書寫的文本文件,是指一系列人類可讀的電腦語言指令,通常由高級語言編寫。電腦原始程式的最終目的是將人類可讀的文字翻譯成為電腦可以執行的二進位指令,這個過程叫做編譯,透過編譯器完成。
本教學操作環境:windows7系統、Dell G3電腦。
用「程式設計語言」寫的程式稱為原始程式。
什麼是原始程式
原始程式又稱原始程式碼,是指未經編譯的,依照一定的程式設計語言規範書寫的文本文件,指一系列人類可讀的電腦語言指令,通常由高階語言編寫。
在現代程式語言中,原始程式可以是以書籍或錄音帶或其他載體的形式出現,但最常用的格式是文字文件,這種典型格式的目的是為了編譯出電腦程式。
電腦原始程式的最終目的是將人類可讀的文字翻譯成為電腦可以執行的二進位指令,這個過程叫做編譯,透過編譯器完成。
原始程式檔案類型是指原始程式儲存時所使用的殊編碼方式,便於讀取、辨識。文字檔案是最常用的一種檔案類型,但許多高階語言和組合語言都有自己的檔案類型,一般習慣以高階語言或組合語言的檔案類型保存,主要是為了以後編譯器編譯方便。
高階程式設計語言(也稱為高階語言)的出現使得電腦程式設計語言不再過度地倚賴某種特定的機器或環境。這是因為高階語言在不同的平台上會被編譯成不同的機器語言,而不是直接被機器執行。最早出現的程式語言之一FORTRAN的一個主要目標,就是實現平台獨立。
作用
原始程式碼主要功用有如下2種作用:
產生目標程式碼,即電腦可以辨識的代碼。
對軟體進行說明,即對軟體的編寫進行說明。為數不少的初學者,甚至少數有經驗的程式設計師,都忽略軟體說明的編寫;因為這部分雖然不會在產生的程式中直接顯示,也不參與編譯。但說明對軟體的學習、分享、維護和軟體重複使用都有巨大的好處。因此,書寫軟體說明在業界被認為是能創造優秀程序的良好習慣,有些公司也硬性規定必須書寫。
需要指出的是,對於編譯語言來說,例如C/C /Java,原始碼的修改不能改變已經產生的目標程式碼。如果需要目標程式碼做出相應的修改,必須重新編譯。但目前有許多流行的腳本語言,例如Perl/Python都不需要重新編譯,修改完程式碼可以直接執行看到修改的結果。
程式碼組合
原始程式碼作為軟體的特殊部分,可能被包含在一個或多個檔案中。一個程式不必用同一種格式的原始碼書寫。例如,一個程式如果有C語言函式庫的支持,那麼就可以用C語言;而另一部分為了達到比較高的運作效率,則可以用組譯語言來寫。就目前的情況而言,很少有需要直接用組譯語言來寫的軟體了,因為很多時候編譯器產生的最佳化程式的運作效率已經很好了,更多的時候是用C/C 這樣的編譯語言來寫核心需要速度的部分,用Perl/Python/Lua等這樣的動態語言來做核心的擴展,例如介面,管理配置等等。這樣既不會損失效率,也增加了程式的彈性。
較為複雜的軟體,一般需要數十種甚至上百種的原始碼的參與。為了降低種複雜度,必須引入一個可以描述各個原始碼之間聯繫,並且如何正確編譯的系統。在這樣的背景下,版本控制系統(VCS)誕生了,並成為研發者對程式碼修訂的必備工具之一。
還有另一個組合:將為一種平台編寫的軟體移植到另一個平台上,例如將Windows下的軟體移植到Linux或MacOS下,專業術語叫做軟體移植。一般可以運行在多個平台下的軟體叫做跨平台軟體。
將高階語言原始程式加工為目標程式
#能將高階語言編寫的原始程式加工為目標程式的系統軟體是“編譯程式」。
編譯程式(Compiler,compiling program),也稱為編譯器,是指把用高階程式設計語言書寫的原始程序,翻譯成等價的機器語言格式目標程式的翻譯程式。編譯程式屬於採用生成性實現途徑實現的翻譯程式。它以高階程式設計語言書寫的原始程式作為輸入,而以組合語言或機器語言表示的目標程式作為輸出。編譯出的目標程式通常還要經歷運行階段,以便在執行程式的支援下運行,加工初始數據,算出所需的計算結果。
編譯程序必須分析原始程序,然後綜合成目標程序。首先,檢查原始程式的正確性,並把它分解成若干基本成分;其次,再根據這些基本成分建立相應等價的目標程序部分。為了完成這些工作,編譯程式要在分析階段建立一些表格,改造原始程式為中間語言形式,以便在分析和綜合時易於引用和加工。
編譯程序的特點:
編譯程式必須分析原始程序,然後綜合成目標程序。首先,檢查原始程式的正確性,並把它分解成若干基本成分;其次,再根據這些基本成分建立相應等價的目標程序部分。為了完成這些工作,編譯程式要在分析階段建立一些表格,改造原始程式為中間語言形式,以便在分析和綜合時易於引用和加工。
資料結構分析和綜合時所使用的主要資料結構,包括符號表、常數表和中間語言程式。符號表由原始程式中所使用的標識符連同它們的屬性組成,其中屬性包括種類(如變數、陣列、結構、函數、過程等)、類型(如整數、實型、字串、複型、標號等),以及目標程序所需的其他資訊。常數表由原始程式中用的常數組成,其中包括常數的機內表示,以及分配給它們的目標程式位址。中間語言程式是將原始程式翻譯為目標程式前引入的一種中間形式的程序,其表示形式的選擇取決於編譯程式以後如何使用和加工它。常用的中間語言形式有波蘭表示、三元組、四元組、間接三元組等。
分析部分原始程式的分析是經過詞法分析、語法分析和語意分析三個步驟實現的。詞法分析由詞法分析程序(又稱掃描程序)完成,其任務是識別單字(即標識符、常數、保留字,以及各種運算符、標點符號等)、造符號表和常數表,以及將原始程式換碼為編譯程式易於分析和加工的內部形式。語法分析程式是編譯程式的核心部分,其主要任務是根據語言的語法規則,檢查原始程式是否合乎語法。如不合乎語法,則輸出語法出錯訊息;如合乎語法,則分解原始程式的語法結構,建構中間語言形式的內部程式。文法分析的目的在於掌握單字是怎麼組成語句的,以及語句又是如何組成程式的。語意分析程序是進一步檢查合法程序結構的語意正確性,其目的是確保標識符和常數的正確使用,把必要的資訊收集和保存到符號表或中間語言程式中,並進行對應的語意處理。
編譯程式的工作過程
編譯程式也叫編譯系統,是把用高階語言寫的面向過程的原始程式翻譯成目標程式的語言處理程序。編譯程式把一個原始程式翻譯成目標程式的工作流程分為五個階段:詞法分析;語法分析;中間程式碼生成;程式碼最佳化;目標程式碼生成。主要是進行詞法分析和語法分析,又稱為原始程式分析,分析過程中發現有語法錯誤,給出提示訊息。
(1) 詞法分析
詞法分析的任務是對由字元組成的單字進行處理,從左到右逐個字元地對原始程式進行掃描,產生一個個的單字符號,把作為字串的原始程式改造成為單字符號字串的中間程式。執行詞法分析的程序稱為詞法分析程式或掃描器。
原始程式中的單字符號經掃描器分析,一般產生二元式:單字種別;單字本身的值。單字種別通常用整數編碼,如果一個種別只含一個單字符號,那麼對這個單字符號,種別編碼就完全代表它本身的值了。若一個種別含有許多個單字符號,那麼,對於它的每個單字符號,除了給出種別編碼以外,還應給出自身的值。
詞法分析器一般來說有兩種方法建構:手工建構和自動生成。手工構造可使用狀態圖進行工作,自動產生使用確定的有限自動機來實現。
(2) 文法分析
編譯程式的語法分析器以單字符號作為輸入,分析單字符號字串是否形成符合語法規則的語法單位,如表達式、賦值、循環等,最後看是否構成一個符合要求的程序,按該語言所使用的語法規則分析檢查每個語句是否有正確的邏輯結構,程式是最終的一個語法單位。編譯程式的語法規則可用上下文無關文法來刻畫。
語法分析的方法分為兩種:自上而下分析法和自下而上分析法。由上而下就是從文法的開始符號出發,向下推導,推出句子。而自下而上分析法採用的是移進歸約法,基本思想是:用一個寄存符號的先進後出棧,把輸入符號一個一個地移進棧裡,當棧頂形成某個產生式的一個候選式時,即把棧頂的這一部分歸約成該產生式的左鄰符號。
(3) 中間程式碼產生
中間程式碼是原始程式的一種內部表示,或稱為中間語言。中間程式碼的作用是可使編譯程式的結構在邏輯上更為簡單明確,特別是可使目標程式碼的最佳化比較容易實現。中間代碼即為中間語言程序,中間語言的複雜性介於原始程式語言和機器語言之間。中間語言有多種形式,常見的有逆波蘭記號、四元式、三元式和樹。
(4) 程式碼最佳化
程式碼最佳化是指對程式進行多種等價變換,使得從變換後的程式出發,能產生更有效的目標程式碼。所謂等價,是指不改變程式的運作結果。所謂有效,主要指目標程式碼運行時間較短,且佔用的儲存空間較小。這種變換稱為最佳化。
有兩類最佳化:一類是對語法分析後的中間程式碼進行最佳化,它不依賴特定的電腦;另一類是在產生目標程式碼時進行的,它在很大程度上依賴具體的計算機。對於前一類最佳化,根據它所涉及的程序範圍可分為局部最佳化、循環最佳化和全域最佳化三個不同的層級。
(5) 目標程式碼產生
目標程式碼產生是編譯的最後一個階段。目標程式碼產生器把語法分析後或最佳化後的中間程式碼轉換成目標程式碼。目標程式碼有三種形式:
① 可以立即執行的機器語言程式碼,所有位址都重定位;
② 待組裝的機器語言模組,當需要執行時,由連線裝入程式把它們和某些執行程式連接起來,轉換成能執行的機器語言程式碼;
③ 彙編語言程式碼,須經過彙編程式彙編後,成為可執行的機器語言程式碼。
目標程式碼產生階段應考慮直接影響到目標程式碼速度的三個問題:一是如何產生較短的目標程式碼;二是如何充分利用電腦中的暫存器,減少目標程式碼存取儲存單元的次數;三是如何充分利用電腦指令系統的特點,以提高目標程式碼的品質。
更多相關知識,請造訪常見問題欄位!
以上是用什麼寫的程式稱為原始程式的詳細內容。更多資訊請關注PHP中文網其他相關文章!