程序員寫(xiě)的代碼是如何轉為可以運行的應用程序呢?
為什么要轉為可運行的應用程序,而不直接運行代碼?
應用程序能否再轉回可供閱讀的代碼呢?
帶著(zhù)這幾個(gè)疑問(wèn),我們今天講一下編譯的原理。
一、編譯的作用
高級語(yǔ)言在把源程序轉換為可執行的應用程序的時(shí)候,需要先對完整的源程序做詞法分析、語(yǔ)法分析等一系列檢測,所有語(yǔ)法都沒(méi)有問(wèn)題后,一次性把所有源代碼翻譯成機器碼,這種從源代碼翻譯成機器碼的過(guò)程被稱(chēng)為“編譯”,C、C 等語(yǔ)言就是采用了編譯方式。
編譯是為了將容易被人閱讀的源程序轉化為不容易被人閱讀,卻更容易被機器識別的機器代碼。而且編譯器所生成代碼的正確性和質(zhì)量直接影響到所有經(jīng)編譯器生成的軟件,因此編譯器是計算機科技領(lǐng)域中的一個(gè)非常重要的組成部分。
二、編譯器的結構
編譯器工作過(guò)程中需要經(jīng)過(guò)很多個(gè)步驟才能將源程序轉化為應用程序,這些步驟包括:詞法分析、語(yǔ)法分析、語(yǔ)義分析、生成中間代碼、機器無(wú)關(guān)代碼優(yōu)化、代碼生成、機器相關(guān)代碼優(yōu)化。每一個(gè)步驟的實(shí)現都包含了很多很深奧的科學(xué)識別。由于篇幅的原因,我就不一一介紹這個(gè)步驟的作用和實(shí)現方法了,感興趣的同學(xué)可以自行搜索。
三、編譯技術(shù)應用
一個(gè)高級程序設計語(yǔ)言降低了編程的難度、提高了編程的效率,但是也導致了較低的效率,每一種編譯語(yǔ)言都要對應一種編譯器,以便將源程序翻譯為機器可識別的目標程序。
四、最早的編譯器
那到底是先有高級程序設計語(yǔ)言,還是先有編譯器呢?這個(gè)問(wèn)題是有答案的,不像先有蛋還是先有雞。最早的編程語(yǔ)言是機器碼,難以編寫(xiě),難以閱讀,為了解決這個(gè)問(wèn)題才發(fā)展出了匯編語(yǔ)言。相對于機器碼來(lái)說(shuō),匯編已經(jīng)算是一種高級語(yǔ)言了,為了將匯編語(yǔ)言翻譯為機器碼,人們用機器碼寫(xiě)了第一款編譯器,然后進(jìn)行了多次迭代,才出現了功能更加強大的編譯器。
五、反編譯與反匯編
高級語(yǔ)言翻譯為應用程序時(shí),不同語(yǔ)言的編譯器有不同的處理方式,有些是翻譯為機器碼,代表語(yǔ)言有C/C ,有些是翻譯為中間代碼,再由運行環(huán)境進(jìn)行解釋執行,代表語(yǔ)言有java/C#。翻譯為機器碼的應用程序難以反編譯出原始代碼,只能轉為匯編語(yǔ)言進(jìn)行閱讀,因此這個(gè)過(guò)程被稱(chēng)為反匯編。而翻譯為中間代碼的應用程序,可以通過(guò)一些工具軟件進(jìn)行編譯的逆向操作,稱(chēng)為反編譯,反編譯后的源程序與程序人員所寫(xiě)的原始程序幾近相同。
六、編譯器病毒
編譯器就像一個(gè)制造軟件的工廠(chǎng),工廠(chǎng)被病毒感染,制作出的軟件也很可能是被感染過(guò)的。2015年出現的非官方下載的xcode中的編譯器被植入惡意代碼,導致很多大公司的APP中招。消息一經(jīng)傳出,大眾嘩然,好在沒(méi)有導致大面積的財產(chǎn)損失。
聯(lián)系客服