摘要:一般的程序,是無(wú)法直接執(zhí)行的,因?yàn)橹荒茏R(shí)別機(jī)器指令。所以要想執(zhí)行一個(gè)程序,首先要將高級(jí)語(yǔ)言編寫的程序翻譯為匯編代碼,再將匯編代碼翻譯為機(jī)器指令,這樣才能識(shí)別并執(zhí)行。
編譯器
編譯器是一個(gè)程序,作用是將一門語(yǔ)言翻譯成另一門語(yǔ)言。
一般的程序,CPU 是無(wú)法直接執(zhí)行的,因?yàn)?CPU 只能識(shí)別機(jī)器指令。所以要想執(zhí)行一個(gè)程序,首先要將高級(jí)語(yǔ)言編寫的程序翻譯為匯編代碼,再將匯編代碼翻譯為機(jī)器指令,這樣 CPU 才能識(shí)別并執(zhí)行。
示例:
// CPU 無(wú)法識(shí)別 10 + 5 // 翻譯成匯編語(yǔ)言 push 10 push 5 add // 最后翻譯為機(jī)器指令 匯編代碼和機(jī)器指令一一對(duì)應(yīng) // 機(jī)器指令由 1 和 0 組成,以下指令非真實(shí)指令,只做演示用 0011101001010101 1101010011100101 0010100111100001
學(xué)會(huì)編譯原理有什么好處?
對(duì)編譯過(guò)程內(nèi)部原理的掌握將會(huì)使你成為更好的高級(jí)程序員。
詞法分析程序其實(shí)就是保存在文本文件中的一系列字符,詞法分析的作用是將這一系列字符按照某種規(guī)則分解成一個(gè)個(gè)字元(token,也稱為終結(jié)符),忽略空格和注釋。
示例:
// 程序代碼 10 + 5 + 6 // 詞法分析后得到的 token 10 + 5 + 6終結(jié)符
終結(jié)符就是語(yǔ)言中用到的基本元素,一般不能再被分解。
四則運(yùn)算中的終結(jié)符包括符號(hào)和整數(shù)常量(暫不支持一元操作符)。
符號(hào):+ - * / ( )
整數(shù)常量:12、1000、111...
詞法分析代碼實(shí)現(xiàn)function lexicalAnalysis(expression) { const symbol = ["(", ")", "+", "-", "*", "/"] const re = /d/ const tokens = [] const chars = expression.trim().split("") let token = "" chars.forEach(c => { if (re.test(c)) { token += c } else if (c == " " && token) { tokens.push(token) token = "" } else if (symbol.includes(c)) { if (token) { tokens.push(token) token = "" } tokens.push(c) } }) if (token) { tokens.push(token) } return tokens } console.log(lexicalAnalysis("100 + 23 + 34 * 10 / 2")) // ["100", "+", "23", "+", "34", "*", "10", "/", "2"]
編譯原理實(shí)戰(zhàn)入門:用 JavaScript 寫一個(gè)簡(jiǎn)單的四則運(yùn)算編譯器(一)詞法分析
編譯原理實(shí)戰(zhàn)入門:用 JavaScript 寫一個(gè)簡(jiǎn)單的四則運(yùn)算編譯器(二)語(yǔ)法分析
編譯原理實(shí)戰(zhàn)入門:用 JavaScript 寫一個(gè)簡(jiǎn)單的四則運(yùn)算編譯器(三)模擬執(zhí)行
編譯原理實(shí)戰(zhàn)入門:用 JavaScript 寫一個(gè)簡(jiǎn)單的四則運(yùn)算編譯器(四)結(jié)語(yǔ)
完整源碼
參考資料:計(jì)算機(jī)系統(tǒng)要素文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/105166.html
摘要:四則運(yùn)算編譯器,雖然說(shuō)功能很簡(jiǎn)單,只能編譯四則運(yùn)算表達(dá)式。再?gòu)?fù)雜的編譯器再簡(jiǎn)單的編譯器,功能上是差不多的,只是復(fù)雜的編譯器實(shí)現(xiàn)上會(huì)更困難。每一章都是理論與實(shí)踐結(jié)合的經(jīng)典,從計(jì)算機(jī)硬件知識(shí)到軟件體系,再到編譯原理和操作系統(tǒng)。 四則運(yùn)算編譯器,雖然說(shuō)功能很簡(jiǎn)單,只能編譯四則運(yùn)算表達(dá)式。但是編譯原理前端部分幾乎都有涉及,詞法分析,語(yǔ)法分析,還有代碼生成。 再?gòu)?fù)雜的編譯器、再簡(jiǎn)單的編譯器,功能...
摘要:棧在內(nèi)存中,棧的特點(diǎn)是只能在同一端進(jìn)行插入和刪除的操作,即只有和兩種操作。指令的作用是將一個(gè)操作數(shù)推入棧中。指令的作用是執(zhí)行兩次操作,彈出兩個(gè)操作數(shù)和,然后執(zhí)行,再將結(jié)果到棧中。 現(xiàn)在來(lái)模擬一下 CPU 執(zhí)行機(jī)器指令的情況,由于匯編代碼和機(jī)器指令一一對(duì)應(yīng),所以我們可以創(chuàng)建一個(gè)直接執(zhí)行匯編代碼的模擬器。在創(chuàng)建模擬器前,先來(lái)講解一下相關(guān)指令的操作。 棧 在內(nèi)存中,棧的特點(diǎn)是只能在同一端進(jìn)行...
摘要:語(yǔ)法分析對(duì)輸入的文本按照語(yǔ)法規(guī)則進(jìn)行分析并確定其語(yǔ)法結(jié)構(gòu)的一種過(guò)程,稱為語(yǔ)法分析。遞歸下降分析法遞歸下降分析法,也稱為自頂向下分析法。表達(dá)式代碼生成我們通常用的四則運(yùn)算表達(dá)式是中綴表達(dá)式,但是對(duì)于計(jì)算機(jī)來(lái)說(shuō)中綴表達(dá)式不便于計(jì)算。 四則運(yùn)算的語(yǔ)法規(guī)則(語(yǔ)法規(guī)則是分層的) x* 表示 x 出現(xiàn)零次或多次 x | y 表示 x 或 y 將出現(xiàn) ( ) 圓括號(hào),用于語(yǔ)言構(gòu)詞的分組 以下規(guī)則...
摘要:實(shí)現(xiàn)狀態(tài)機(jī)可能產(chǎn)生四種輸入元素,其中只有兩種,狀態(tài)機(jī)的第一個(gè)狀態(tài)就是根據(jù)第一個(gè)輸入字符來(lái)判斷進(jìn)入了哪種狀態(tài)用函數(shù)表示狀態(tài),用表示狀態(tài)的遷移關(guān)系,用值表示下一個(gè)狀態(tài)。運(yùn)行狀態(tài)機(jī)輸出結(jié)果四語(yǔ)法分析語(yǔ)法分析根據(jù)每一個(gè)產(chǎn)生式來(lái)寫一個(gè)函數(shù)。 筆記說(shuō)明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時(shí)間開(kāi)的一個(gè)專欄,每天10分鐘,重構(gòu)你的前端知識(shí)體系,筆者主要整理學(xué)習(xí)過(guò)程的一些要點(diǎn)...
閱讀 3263·2021-11-23 09:51
閱讀 1059·2021-08-05 09:58
閱讀 696·2019-08-29 16:05
閱讀 1002·2019-08-28 18:17
閱讀 3060·2019-08-26 14:06
閱讀 2753·2019-08-26 12:20
閱讀 2196·2019-08-26 12:18
閱讀 3091·2019-08-26 11:56