亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

一種計算機程序語言的編譯方法和編譯器與流程

文檔序號:12305064閱讀:307來源:國知局
一種計算機程序語言的編譯方法和編譯器與流程

本發(fā)明涉及編譯器領(lǐng)域,尤其涉及一種計算機程序語言的編譯方法和編譯器。



背景技術(shù):

在工業(yè)控制領(lǐng)域中,iec61131-3是通用的國際標(biāo)準(zhǔn),其定義了結(jié)構(gòu)化文本(st,structuredtext)語言的語法和文法,通常預(yù)處理器先對st語言程序進(jìn)行預(yù)處理,然后編譯器在將預(yù)處理之后的st語言程序編譯為二進(jìn)制中間指令,解析器和處理器分別進(jìn)行解析執(zhí)行。

在st語言中,for語句是使用頻率較高的語句,st語言定義的for語句文法為:

for<index:=expr1>to<expr2>by<expr3>do

<statementlist>

end_for;

其中,index為索引值,expr1為初始值表達(dá)式,expr2為終止值表達(dá)式,expr3為循環(huán)增量表達(dá)式,statementlist為循環(huán)執(zhí)行語句。

由于該文法中的expr3為表達(dá)式,和pascal的for語句、c語言的for語句在文法定義方面有較大差別,無法使用已經(jīng)成熟的循環(huán)語句編譯方法。在現(xiàn)有的st語言的for語句中,由于無法預(yù)知上下界和循環(huán)增量表達(dá)式是實際遞增還是遞減,在每次循環(huán)前計算expr1、expr2、expr3,比較并判斷循環(huán)條件是否繼續(xù),具體地,分別比較expr3大于等于expr1并且expr3小于expr2,expr3大于等于expr2并且expr3小于expr1,可見,上述方法需要進(jìn)行4次比較,這樣,勢必會影響指令的運行效率,也就是說,現(xiàn)有的st語言for語句的編譯方法會導(dǎo)致指令的運行效率低下的技術(shù)問題。



技術(shù)實現(xiàn)要素:

有鑒于此,本發(fā)明實施例期望提供一種計算機程序語言的編譯方法和編譯器,能夠解決st語言for語句的編譯方法會導(dǎo)致指令的運行效率低下的技術(shù)問題,提高st語言for語句的編譯效率,進(jìn)而提高了st語言的運行效率。

為達(dá)到上述目的,本發(fā)明的技術(shù)方案是這樣實現(xiàn)的:

第一方面,本發(fā)明實施例提供一種計算機程序語言的編譯方法,包括:對結(jié)構(gòu)化文本st語言的循環(huán)語句進(jìn)行預(yù)處理后,至少獲取所述循環(huán)語句的初始值表達(dá)式、終止值表達(dá)式、循環(huán)增量表達(dá)式和循環(huán)執(zhí)行語句;對所述初始值表達(dá)式和所述終止值表達(dá)式分別進(jìn)行編譯,得到初始值表達(dá)式的值和終止值表達(dá)式的值;將所述初始值表達(dá)式的值確定為所述循環(huán)語句的索引值;基于所述循環(huán)增量表達(dá)式的類型,從所述初始值表達(dá)式的值和所述終止值表達(dá)式的值中確定出所述循環(huán)語句的上界和所述循環(huán)語句的下界;基于所述循環(huán)語句的上界、所述循環(huán)語句的下界、所述循環(huán)語句的索引值和所述循環(huán)增量表達(dá)式,對所述循環(huán)執(zhí)行語句進(jìn)行編譯,得到所述循環(huán)語句的編譯結(jié)果。

在上述方案中,所述基于所述循環(huán)增量表達(dá)式的類型,從所述初始值表達(dá)式的值和所述終止值表達(dá)式的值中確定出所述循環(huán)語句的上界和所述循環(huán)語句的下界,包括:當(dāng)所述循環(huán)增量表達(dá)式的類型為常量時,從所述初始值表達(dá)式的值和所述終止值表達(dá)式的值中,確定出所述循環(huán)語句的上界預(yù)測值和所述循環(huán)語句的下界預(yù)測值;比較所述下界預(yù)測值是否大于所述上界預(yù)測值;若為是,終止所述循環(huán)語句;若為否,將所述上界預(yù)測值確定為所述循環(huán)語句的上界,且將所述上界預(yù)測值確定為所述循環(huán)語句的下界。

在上述方案中,所述當(dāng)所述循環(huán)增量表達(dá)式的類型為常量時,從所述初始值表達(dá)式的值和所述終止值表達(dá)式的值中,確定出所述循環(huán)語句的上界預(yù)測值和所述循環(huán)語句的下界預(yù)測值,包括:當(dāng)所述循環(huán)增量表達(dá)式的常量類型為正數(shù)常量時,將所述初始值表達(dá)式的值確定為所述循環(huán)語句的下界預(yù)測值,將所述終止值表達(dá)式的值確定為所述循環(huán)語句的上界預(yù)測值;當(dāng)所述循環(huán)增量表達(dá)式的常量類型為負(fù)數(shù)常量時,將所述初始值表達(dá)式的值確定為所述循環(huán)語句的上界預(yù)測值,將所述終止值表達(dá)式的值確定為所述循環(huán)語句的下界預(yù)測值。

在上述方案中,所述基于所述循環(huán)語句的上界、所述循環(huán)語句的下界、所述循環(huán)語句的索引值和所述循環(huán)增量表達(dá)式對所述循環(huán)執(zhí)行語句進(jìn)行編譯,得到所述循環(huán)語句的編譯結(jié)果,包括:當(dāng)所述循環(huán)增量表達(dá)式的常量類型為正數(shù)常量時,對所述循環(huán)執(zhí)行語句進(jìn)行編譯,得到對應(yīng)的編譯語句;比較所述循環(huán)語句的索引值與所述循環(huán)語句的上界是否相等;若為是,終止所述循環(huán)語句;若為否,根據(jù)所述循環(huán)語句的索引值與所述循環(huán)增量表達(dá)式的值,更新所述循環(huán)語句的索引值,重新對所述循環(huán)執(zhí)行語句進(jìn)行編譯,得到對應(yīng)的編譯語句,并再次比較所述循環(huán)語句的索引值與所述循環(huán)語句的上界是否相等;當(dāng)所述循環(huán)增量表達(dá)式的常量類型為負(fù)數(shù)常量時,對所述循環(huán)執(zhí)行語句進(jìn)行編譯,得到對應(yīng)的編譯語句;比較所述循環(huán)語句的索引值與所述循環(huán)語句的下界是否相等;若為是,終止所述循環(huán)語句;若為否,根據(jù)所述循環(huán)語句的索引值與所述循環(huán)增量表達(dá)式的值,更新所述循環(huán)語句的索引值,重新對所述循環(huán)執(zhí)行語句進(jìn)行編譯,得到對應(yīng)的編譯語句;并再次比較所述循環(huán)語句的索引值與所述循環(huán)語句的下界是否相等。

在上述方案中,所述基于所述循環(huán)增量表達(dá)式的類型,從所述初始值表達(dá)式的值和所述終止值表達(dá)式的值中確定出所述循環(huán)語句的上界和所述循環(huán)語句的下界,包括:當(dāng)所述循環(huán)增量表達(dá)式的類型為變量時,將所述初始值表達(dá)式的值確定為所述循環(huán)語句的上界預(yù)測值,且將所述終止值表達(dá)式的值確定為所述循環(huán)語句的下界預(yù)測值;比較所述上界預(yù)測值是否大于等于所述下界預(yù)測值;若為是,將所述上界預(yù)測值確定為所述循環(huán)語句的上界,且將所述下界預(yù)測值確定為所述循環(huán)語句的下界;若為否,將所述上界預(yù)測值確定為所述循環(huán)語句的下界,且將所述下界預(yù)測值確定為所述循環(huán)語句的上界。

在上述方案中,所述基于所述循環(huán)語句的上界、所述循環(huán)語句的下界、所述循環(huán)語句的索引值和所述編譯后的循環(huán)增量表達(dá)式對所述循環(huán)執(zhí)行語句進(jìn)行編譯,得到所述循環(huán)語句的編譯結(jié)果,包括:當(dāng)所述循環(huán)增量表達(dá)式的類型為變量時,對所述循環(huán)執(zhí)行語句進(jìn)行編譯,得到對應(yīng)的編譯語句;對所述循環(huán)增量表達(dá)式進(jìn)行編譯,得到所述循環(huán)增量表達(dá)式的值;根據(jù)所述循環(huán)語句的索引值與所述循環(huán)增量表達(dá)式的值,更新所述循環(huán)語句的索引值;比較更新后的所述循環(huán)語句的索引值是否大于所述循環(huán)語句的上界,若為是,終止所述循環(huán)語句;比較更新后的所述循環(huán)語句的索引值是否小于所述循環(huán)語句的下界,若為是,終止所述循環(huán)語句;否則,重新對所述循環(huán)執(zhí)行語句進(jìn)行編譯,得到對應(yīng)的編譯語句;并再次對所述循環(huán)增量表達(dá)式進(jìn)行編譯,得到所述循環(huán)增量表達(dá)式的值。

第二方面,本發(fā)明實施例提供一種編譯器,包括:獲取模塊,用于對結(jié)構(gòu)化文本st語言的循環(huán)語句進(jìn)行預(yù)處理后,至少獲取所述循環(huán)語句的初始值表達(dá)式、終止值表達(dá)式、循環(huán)增量表達(dá)式和循環(huán)執(zhí)行語句;第一編譯模塊,用于對所述初始值表達(dá)式和所述終止值表達(dá)式分別進(jìn)行編譯,得到初始值表達(dá)式的值和終止值表達(dá)式的值;第一確定模塊,用于將所述初始值表達(dá)式的值確定為所述循環(huán)語句的索引值;第二確定模塊,用于基于所述循環(huán)增量表達(dá)式的類型,從所述初始值表達(dá)式的值和所述終止值表達(dá)式的值中確定出所述循環(huán)語句的上界和所述循環(huán)語句的下界;第二編譯模塊,用于基于所述循環(huán)語句的上界、所述循環(huán)語句的下界、所述循環(huán)語句的索引值和所述循環(huán)增量表達(dá)式,對所述循環(huán)執(zhí)行語句進(jìn)行編譯,得到所述循環(huán)語句的編譯結(jié)果。

在上述方案中,所述第二確定模塊,包括:第一預(yù)測子模塊,用于當(dāng)所述循環(huán)增量表達(dá)式的類型為常量時,從所述初始值表達(dá)式的值和所述終止值表達(dá)式的值中,確定出所述循環(huán)語句的上界預(yù)測值和所述循環(huán)語句的下界預(yù)測值;第一比較子模塊,用于比較所述下界預(yù)測值是否大于所述上界預(yù)測值;第一終止子模塊,用于若為是,終止所述循環(huán)語句;第一確定子模塊,用于若為否,將所述上界預(yù)測值確定為所述循環(huán)語句的上界,且將所述上界預(yù)測值確定為所述循環(huán)語句的下界。

在上述方案中,所述第一預(yù)測子模塊,具體用于:當(dāng)所述循環(huán)增量表達(dá)式的常量類型為正數(shù)常量時,將所述初始值表達(dá)式的值確定為所述循環(huán)語句的下界預(yù)測值,將所述終止值表達(dá)式的值確定為所述循環(huán)語句的上界預(yù)測值;當(dāng)所述循環(huán)增量表達(dá)式的常量類型為負(fù)數(shù)常量時,將所述初始值表達(dá)式的值確定為所述循環(huán)語句的上界預(yù)測值,將所述終止值表達(dá)式的值確定為所述循環(huán)語句的下界預(yù)測值。

在上述方案中,所述第二編譯模塊,具體用于:當(dāng)所述循環(huán)增量表達(dá)式的常量類型為正數(shù)常量時,對所述循環(huán)執(zhí)行語句進(jìn)行編譯,得到對應(yīng)的編譯語句;比較所述循環(huán)語句的索引值與所述循環(huán)語句的上界是否相等;若為是,終止所述循環(huán)語句;若為否,根據(jù)所述循環(huán)語句的索引值與所述循環(huán)增量表達(dá)式的值,更新所述循環(huán)語句的索引值,重新對所述循環(huán)執(zhí)行語句進(jìn)行編譯,得到對應(yīng)的編譯語句,并再次比較所述循環(huán)語句的索引值與所述循環(huán)語句的上界是否相等;當(dāng)所述循環(huán)增量表達(dá)式的常量類型為負(fù)數(shù)常量時,對所述循環(huán)執(zhí)行語句進(jìn)行編譯,得到對應(yīng)的編譯語句;比較所述循環(huán)語句的索引值與所述循環(huán)語句的下界是否相等;若為是,終止所述循環(huán)語句;若為否,根據(jù)所述循環(huán)語句的索引值與所述循環(huán)增量表達(dá)式的值,更新所述循環(huán)語句的索引值,重新對所述循環(huán)執(zhí)行語句進(jìn)行編譯,得到對應(yīng)的編譯語句;并再次比較所述循環(huán)語句的索引值與所述循環(huán)語句的下界是否相等。

在上述方案中,所述第二確定模塊,具體還用于:當(dāng)所述循環(huán)增量表達(dá)式的類型為變量時,將所述初始值表達(dá)式的值確定為所述循環(huán)語句的上界預(yù)測值,且將所述終止值表達(dá)式的值確定為所述循環(huán)語句的下界預(yù)測值;比較所述上界預(yù)測值是否大于等于所述下界預(yù)測值;若為是,將所述上界預(yù)測值確定為所述循環(huán)語句的上界,且將所述下界預(yù)測值確定為所述循環(huán)語句的下界;若為否,將所述上界預(yù)測值確定為所述循環(huán)語句的下界,且將所述下界預(yù)測值確定為所述循環(huán)語句的上界。

在上述方案中,所述第二編譯模塊,具體還用于:當(dāng)所述循環(huán)增量表達(dá)式的類型為變量時,對所述循環(huán)執(zhí)行語句進(jìn)行編譯,得到對應(yīng)的編譯語句;對所述循環(huán)增量表達(dá)式進(jìn)行編譯,得到所述循環(huán)增量表達(dá)式的值;根據(jù)所述循環(huán)語句的索引值與所述循環(huán)增量表達(dá)式的值,更新所述循環(huán)語句的索引值;比較更新后的所述循環(huán)語句的索引值是否大于所述循環(huán)語句的上界,若為是,終止所述循環(huán)語句;比較更新后的所述循環(huán)語句的索引值是否小于所述循環(huán)語句的下界,若為是,終止所述循環(huán)語句;否則,重新對所述循環(huán)執(zhí)行語句進(jìn)行編譯,得到對應(yīng)的編譯語句;并再次對所述循環(huán)增量表達(dá)式進(jìn)行編譯,得到所述循環(huán)增量表達(dá)式的值。

本發(fā)明實施例所提供的計算機程序語言的編譯方法和編譯器,首先,對st語言的循環(huán)語句進(jìn)行預(yù)處理后至少獲取循環(huán)語句的初始值表達(dá)式、終止值表達(dá)式、循環(huán)增量表達(dá)式和循環(huán)執(zhí)行語句,對初始值表達(dá)式和終止值表達(dá)式分別進(jìn)行編譯,得到初始值表達(dá)式的值和終止值表達(dá)式的值,然后將初始值表達(dá)式的值確定為循環(huán)語句的索引值,基于循環(huán)增量表達(dá)式的類型,從初始值表達(dá)式的值和終止值表達(dá)式的值中確定出循環(huán)語句的上界和循環(huán)語句的下界;這樣,預(yù)確定出循環(huán)語句的上界和循環(huán)語句的下界,避免了在對循環(huán)執(zhí)行語句的編譯中確定循環(huán)語句的上界和循環(huán)語句的下界,減少了編譯過程中,為了確定出循環(huán)語句的上界和循環(huán)語句的下界對上下界進(jìn)行大小比較的次數(shù),那么,基于循環(huán)語句的上界、循環(huán)語句的下界、循環(huán)語句的索引值和循環(huán)增量表達(dá)式,對循環(huán)執(zhí)行語句進(jìn)行編譯,得到循環(huán)語句的編譯結(jié)果,使得st語言for語句運行的過程中,能夠解決現(xiàn)有的st語言for語句的編譯方法所導(dǎo)致指令的運行效率低下的技術(shù)問題,從而提高st語言for語句的編譯效率,進(jìn)而提高了st語言的運行效率。

附圖說明

圖1為本發(fā)明實施例中計算機程序語言的編譯方法的流程示意圖;

圖2為本發(fā)明實施例中計算機程序語言的編譯方法的一種可選的流程示意圖;

圖3為本發(fā)明實施例中計算機程序語言的編譯方法的另一種可選的流程示意圖;

圖4為本發(fā)明實施例中編譯器的結(jié)構(gòu)示意圖。

具體實施方式

下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進(jìn)行清楚、完整地描述。

本發(fā)明實施例提供一種計算機程序語言的編譯方法,圖1為本發(fā)明實施例中計算機程序語言的編譯方法的流程示意圖;該方法應(yīng)用于編譯器中,如圖1所示,該計算機程序語言的編譯方法包括:

s101:對st語言的循環(huán)語句進(jìn)行預(yù)處理后,至少獲取循環(huán)語句的初始值表達(dá)式、終止值表達(dá)式、循環(huán)增量表達(dá)式和循環(huán)執(zhí)行語句;

具體來說,預(yù)處理器先對st語言的循環(huán)(for)語句使用adobeflex平臺進(jìn)行詞法分析,使用語法分析器(bison)進(jìn)行語法分析形成語法樹,編寫c++代碼進(jìn)行語義分析,經(jīng)過分析后,編譯器可以獲取到for語句的初始值表達(dá)式(expr1)、終止值表達(dá)式(expr2)、循環(huán)增量表達(dá)式(expr3)和循環(huán)執(zhí)行語句(statementlist)。

這里,需要說明的是,當(dāng)循環(huán)增量表達(dá)式為常量時,經(jīng)過預(yù)處理后得到的是循環(huán)增量表達(dá)式的常量值。

s102:對初始值表達(dá)式和終止值表達(dá)式分別進(jìn)行編譯,得到初始值表達(dá)式的值和終止值表達(dá)式的值;

經(jīng)過預(yù)處理后得到初始值表達(dá)式和終止值表達(dá)式,為了確定出for語句的上下界,這里需要分別對初始值表達(dá)式和終止值表達(dá)式進(jìn)行編譯,計算出初始值表達(dá)式的值和終止值表達(dá)式的值。

s103:將初始值表達(dá)式的值確定為循環(huán)語句的索引值;

在s102中得到初始值表達(dá)式的值和終止值表達(dá)式的值之后,按照for語句的語法規(guī)則,將初始值表達(dá)式的值確定為for語句的索引值,在實際應(yīng)用中,將初始值表達(dá)式的值確定為for語句的索引值即為:將初始值表達(dá)式的值賦給for語句的索引值,這樣,便確定出了for語句的索引值。

其中,該for語句的索引值也可稱之為for語句的循環(huán)變量。

s104:基于循環(huán)增量表達(dá)式的類型,從初始值表達(dá)式的值和終止值表達(dá)式的值中確定出循環(huán)語句的上界和循環(huán)語句的下界;

為了實現(xiàn)對for語句的編譯,首先需要確定出for語句的上界和下界,為了確定出for語句的上界和下界,以下分三種情況來實現(xiàn):

首先,在一種可選的實施例中,圖2為本發(fā)明實施例中計算機程序語言的編譯方法的另一種可選的流程示意圖,如圖2所示,s104可以包括:

s201:當(dāng)循環(huán)增量表達(dá)式的類型為常量時,從初始值表達(dá)式的值和終止值表達(dá)式的值中,確定出循環(huán)語句的上界預(yù)測值和循環(huán)語句的下界預(yù)測值;

在具體實施過程中,循環(huán)增量表達(dá)式的常量類型還可以包括正數(shù)常量和負(fù)數(shù)常量,那么,在確定for語句的上界和下界的過程又分為以下兩種情況來實現(xiàn):

在一種可選的實施例中,s201可以包括:

當(dāng)循環(huán)增量表達(dá)式的常量類型為正數(shù)常量時,將初始值表達(dá)式的值確定為循環(huán)語句的下界預(yù)測值,將終止值表達(dá)式的值確定為循環(huán)語句的上界預(yù)測值;

具體來說,當(dāng)經(jīng)過預(yù)處理之后確定出循環(huán)增量表達(dá)式的常量類型為正數(shù)常量時,說明for語句的循環(huán)條件是實際遞增的,那么,先對for語句的上下界進(jìn)行預(yù)測:將初始值表達(dá)式的值確定為for語句的下界預(yù)測值,將終止值表達(dá)式確定為for語句的上界預(yù)測值。

在另一種可選的實施例中,s201還可以包括:

當(dāng)循環(huán)增量表達(dá)式的常量類型為負(fù)數(shù)常量時,將初始值表達(dá)式的值確定為循環(huán)語句的上界預(yù)測值,將終止值表達(dá)式的值確定為循環(huán)語句的下界預(yù)測值。

具體來說,當(dāng)經(jīng)過預(yù)處理之后確定出循環(huán)增量表達(dá)式的常量類型為負(fù)數(shù)常量時,說明for語句的循環(huán)條件是實際遞減的,那么,先對for語句的上下界進(jìn)行預(yù)測:將初始值表達(dá)式的值確定為for語句的上界預(yù)測值,將終止值表達(dá)式確定為for語句的下界預(yù)測值。

s202:比較下界預(yù)測值是否大于上界預(yù)測值;

s203:若為是,終止循環(huán)語句;

s204:若為否,將上界預(yù)測值確定為循環(huán)語句的上界,且將上界預(yù)測值確定為循環(huán)語句的下界。

這里,經(jīng)過預(yù)處理后,編譯器確定出循環(huán)增量表達(dá)式的值為常量時,即確定出循環(huán)增量表達(dá)式的類型為常量時,先對for語句的上界和下界進(jìn)行預(yù)測,具體地,從初始值表達(dá)式的值和終止值表達(dá)式的值中確定出for語句的上界預(yù)測值和下界預(yù)測值。

在確定出for語句的上界預(yù)測值和下界預(yù)測值之后,比較下界預(yù)測值是否大于上界預(yù)測值,若比較結(jié)果為是,終止for語句,若比較結(jié)果為否,則將上界預(yù)測值賦給for語句的上界,將下界預(yù)測值賦給for語句的下界。

以上,便可以確定出了當(dāng)循環(huán)增量表達(dá)式的類型為常量的兩種情況下for語句的上界和下界。

其次,在另一種可選的實施例中,即第三種情況下當(dāng)循環(huán)增量表達(dá)式的類型為變量時,s104可以包括:

將初始值表達(dá)式的值確定為循環(huán)語句的上界預(yù)測值,且將終止值表達(dá)式的值確定為循環(huán)語句的下界預(yù)測值;

比較上界預(yù)測值是否大于等于下界預(yù)測值;

若為是,將上界預(yù)測值確定為循環(huán)語句的上界,且將下界預(yù)測值確定為循環(huán)語句的下界;

若為否,將上界預(yù)測值確定為循環(huán)語句的下界,且將下界預(yù)測值確定為循環(huán)語句的上界。

經(jīng)過預(yù)處理后得到循環(huán)增量表達(dá)式的類型不是常量,而是常規(guī)表達(dá)式時,即確定循環(huán)增量表達(dá)式的類型為變量時,此時,不能確定出for語句的循環(huán)條件是實際遞增還是實際遞減,所以先對for語句的上下界進(jìn)行預(yù)測:將初始值表達(dá)式的值確定為for語句的上界預(yù)測值,且將終止值表達(dá)式的值確定為for語句的下界預(yù)測值。

在得到上下界預(yù)測值之后,比較上述上界預(yù)測值是否大于等于下界預(yù)測值,若為是,則將上界預(yù)測值賦給for語句的上界,若為否,則將下界預(yù)測值賦給for語句的下界,以此來確定for語句的上下界。

s105:基于循環(huán)語句的上界、循環(huán)語句的下界、循環(huán)語句的索引值和循環(huán)增量表達(dá)式,對循環(huán)執(zhí)行語句進(jìn)行編譯,得到循環(huán)語句的編譯結(jié)果。

在s103確定出for語句的索引值,在s104中確定出for語句的上下界,下面,基于上述確定出來的for語句的上界、下界、索引值和循環(huán)增量表達(dá)式來對循環(huán)執(zhí)行語句進(jìn)行編譯,在具體實施過程中,s105可以根據(jù)循環(huán)增量表達(dá)式的類型分為以下三種情況來實現(xiàn):

在一種可選的實施例中,第一種情況:當(dāng)循環(huán)增量表達(dá)式的常量類型為正數(shù)常量時,s105可以包括:

對循環(huán)執(zhí)行語句進(jìn)行編譯,得到對應(yīng)的編譯語句;

比較循環(huán)語句的索引值與循環(huán)語句的上界是否相等;

若為是,終止循環(huán)語句;

若為否,根據(jù)循環(huán)語句的索引值與循環(huán)增量表達(dá)式的值,更新循環(huán)語句的索引值,重新對循環(huán)執(zhí)行語句進(jìn)行編譯,得到對應(yīng)的編譯語句,并再次比較循環(huán)語句的索引值與循環(huán)語句的上界是否相等。

具體來說,在確定出循環(huán)增量表達(dá)式的值為正數(shù)時,說明for語句的循環(huán)條件為實際遞增的,那么,先對循環(huán)執(zhí)行語句進(jìn)行編譯得到對應(yīng)的編譯語句,然后比較循環(huán)語句的索引值與循環(huán)語句的上界是否相等,若為是,說明此次實際遞增的循環(huán)已經(jīng)達(dá)到循環(huán)條件的上界,所以終止循環(huán)語句,若為否,說明此次實際遞增的循環(huán)未達(dá)到循環(huán)條件的上界,應(yīng)當(dāng)更新循環(huán)語句的索引值,最后重新對循環(huán)執(zhí)行語句進(jìn)行編譯,得到對應(yīng)的編譯語句,并再次比較循環(huán)語句的索引值與循環(huán)語句的上界是否相等,這樣,即完成對循環(huán)語句的編譯。

在另一種可選的實施例中,第二種情況:當(dāng)循環(huán)增量表達(dá)式的常量類型為負(fù)數(shù)常量時,s105可以包括:

對循環(huán)執(zhí)行語句進(jìn)行編譯,得到對應(yīng)的編譯語句;

比較循環(huán)語句的索引值與循環(huán)語句的下界是否相等;

若為是,終止循環(huán)語句;

若為否,根據(jù)循環(huán)語句的索引值與循環(huán)增量表達(dá)式的值,更新循環(huán)語句的索引值,重新對循環(huán)執(zhí)行語句進(jìn)行編譯,得到對應(yīng)的編譯語句;并再次比較循環(huán)語句的索引值與循環(huán)語句的下界是否相等。

具體來說,在確定出循環(huán)增量表達(dá)式的值為負(fù)數(shù)時,說明for語句的循環(huán)條件為實際遞減的,那么,先對循環(huán)執(zhí)行語句進(jìn)行編譯得到對應(yīng)的編譯語句,然后比較循環(huán)語句的索引值與循環(huán)語句的下界是否相等,若為是,說明此次實際遞減的循環(huán)已經(jīng)達(dá)到循環(huán)條件的下界,所以終止循環(huán)語句,若為否,說明此次實際遞減的循環(huán)未達(dá)到循環(huán)條件的下界,應(yīng)當(dāng)更新循環(huán)語句的索引值,最后重新對循環(huán)執(zhí)行語句進(jìn)行編譯,得到對應(yīng)的編譯語句;并再次比較循環(huán)語句的索引值與循環(huán)語句的下界是否相等,這樣,即完成對循環(huán)語句的編譯。

在另一種可選的實施例中,第三種情況:當(dāng)循環(huán)增量表達(dá)式的類型為變量時,s105可以包括:

對循環(huán)執(zhí)行語句進(jìn)行編譯,得到對應(yīng)的編譯語句;

對循環(huán)增量表達(dá)式進(jìn)行編譯,得到循環(huán)增量表達(dá)式的值;

根據(jù)循環(huán)語句的索引值與循環(huán)增量表達(dá)式的值,更新循環(huán)語句的索引值;

比較更新后的循環(huán)語句的索引值是否大于循環(huán)語句的上界,若為是,終止循環(huán)語句;

比較更新后的循環(huán)語句的索引值是否小于循環(huán)語句的下界,若為是,終止循環(huán)語句;

否則,重新對循環(huán)執(zhí)行語句進(jìn)行編譯,得到對應(yīng)的編譯語句;并再次對循環(huán)增量表達(dá)式進(jìn)行編譯,得到循環(huán)增量表達(dá)式的值。

具體來說,在確定出循環(huán)增量表達(dá)式的值為變量時,說明for語句的循環(huán)條件是動態(tài)變化的,那么,先對循環(huán)執(zhí)行語句進(jìn)行編譯得到對應(yīng)的編譯語句,然后對循環(huán)增量表達(dá)式進(jìn)行編譯以得到循環(huán)增量表達(dá)式的值,從而根據(jù)循環(huán)語句的索引值與循環(huán)增量表達(dá)式的值更新循環(huán)語句的索引值,最后,比較更新后的循環(huán)語句的索引值是否大于循環(huán)語句的上界,若為是,說明更新后的循環(huán)語句的索引值已經(jīng)達(dá)到循環(huán)條件的上界,所以終止循環(huán)語句,比較更新后的循環(huán)語句的索引值是否小于循環(huán)語句的下界,若為是,說明更新后的循環(huán)語句的索引值已達(dá)到循環(huán)條件的下界,所以終止循環(huán)語句,若為否,最后重新對循環(huán)執(zhí)行語句進(jìn)行編譯,得到對應(yīng)的編譯語句;并再次對循環(huán)增量表達(dá)式進(jìn)行編譯,得到循環(huán)增量表達(dá)式的值,這樣,即完成對循環(huán)語句的編譯。

其中,根據(jù)上述各表達(dá)式的字長,可以確定出各表達(dá)式的最大整數(shù)和最小整數(shù)。

下面舉實例來對上述計算機程序語言的編譯方法進(jìn)行說明。

圖3為本發(fā)明實施例中計算機程序語言的編譯方法的另一種可選的流程示意圖,如圖3所示,

s301:對for語句進(jìn)行預(yù)處理,得到初始值表達(dá)式、終止值表達(dá)式、循環(huán)增量表達(dá)式和循環(huán)執(zhí)行語句;

具體來說,先對for語句繼續(xù)預(yù)處理,即圖3中的下述for語句進(jìn)行預(yù)處理:

for<index:=expr1>to<expr2>by<expr3>do

<statementlist>

end_for;

其中,對expr1進(jìn)行編譯得到初始值表達(dá)式(initial_value),對expr2進(jìn)行編譯終止值表達(dá)式(end_value),對expr3進(jìn)行編譯循環(huán)增量表達(dá)式(increment)。

s302:判斷循環(huán)增量表達(dá)式的類型;

s304:當(dāng)循環(huán)增量表達(dá)式的類型為正數(shù)常量時,采用優(yōu)化模式1:向上計數(shù)安全編譯模式;

具體來說,當(dāng)expr3的值為正數(shù)常量時,編譯結(jié)果如下:

其中,上述gt表示大于指令,jnz表示非0跳轉(zhuǎn)指令,asgn表示賦值指令,eq表示是否相等指令,add表示加法指令,jmp表示無條件跳轉(zhuǎn)指令。

當(dāng)for語句的上界是最大整數(shù)時,將避免索引值在最后的測試前引起上溢,該指令序列能確保索引值不被賦值為超出范圍的值,并保證該循環(huán)執(zhí)行語句代碼除非至少執(zhí)行一次,否則永不執(zhí)行,確保了向上計數(shù)模式的for語句的正確終止。

s305:當(dāng)循環(huán)增量表達(dá)式的類型為負(fù)數(shù)常量時,采用優(yōu)化模式2:向下計數(shù)安全編譯模式;

具體來說,當(dāng)expr3的值為負(fù)數(shù)常量時,編譯結(jié)果如下:

其中,lt表示小于指令;當(dāng)for語句的下界是最小整數(shù)時,將避免索引值在最后的測試前引起下溢,該指令序列能確保索引值不被賦值為超出范圍的值,并保證該循環(huán)執(zhí)行語句代碼除非至少執(zhí)行一次,否則永不執(zhí)行,確保了向下計數(shù)模式的for語句的正確終止。

s306:當(dāng)循環(huán)增量表達(dá)式的類型為常規(guī)表達(dá)式時,采用優(yōu)化模式3:動態(tài)確定上下限編譯模式。

具體來說,當(dāng)expr3的值為常規(guī)表達(dá)式時,編譯結(jié)果如下:

其中,jz表示為0跳轉(zhuǎn)指令,先計算for語句的上下界表達(dá)式,在循環(huán)指令執(zhí)行前動態(tài)確定上下界,在循環(huán)執(zhí)行的指令段中,先執(zhí)行循環(huán)執(zhí)行語句,之后計算循環(huán)增量表達(dá)式,更新索引值,判斷索引值是否大于上界或小于下界,若為是,則跳出循環(huán),將現(xiàn)有的索引值與上下界進(jìn)行四次比較減少為兩次,減少循環(huán)過程中的比較指令。

采用本發(fā)明實施例,在語義分析階段,提取循環(huán)增量表達(dá)式的類型,對于常用的正、負(fù)常量整數(shù)模式,采用優(yōu)化和安全的向上計數(shù)、向下計數(shù)翻譯模式,對于常規(guī)的表達(dá)式,采用在循環(huán)前動態(tài)調(diào)整上下界的翻譯模式,顯著提高了for語句指令序列的執(zhí)行效率,適用于對實時性要求高的工業(yè)控制領(lǐng)域。

本發(fā)明實施例所提供的計算機程序語言的編譯方法,首先,對st語言的循環(huán)語句進(jìn)行預(yù)處理后至少獲取循環(huán)語句的初始值表達(dá)式、終止值表達(dá)式、循環(huán)增量表達(dá)式和循環(huán)執(zhí)行語句,對初始值表達(dá)式和終止值表達(dá)式分別進(jìn)行編譯,得到初始值表達(dá)式的值和終止值表達(dá)式的值,然后將初始值表達(dá)式的值確定為循環(huán)語句的索引值,基于循環(huán)增量表達(dá)式的類型,從初始值表達(dá)式的值和終止值表達(dá)式的值中確定出循環(huán)語句的上界和循環(huán)語句的下界;這樣,預(yù)確定出循環(huán)語句的上界和循環(huán)語句的下界,避免了在對循環(huán)執(zhí)行語句的編譯中確定循環(huán)語句的上界和循環(huán)語句的下界,減少了編譯過程中,為了確定出循環(huán)語句的上界和循環(huán)語句的下界對上下界進(jìn)行大小比較的次數(shù),那么,基于循環(huán)語句的上界、循環(huán)語句的下界、循環(huán)語句的索引值和循環(huán)增量表達(dá)式,對循環(huán)執(zhí)行語句進(jìn)行編譯,得到循環(huán)語句的編譯結(jié)果,使得st語言for語句運行的過程中,能夠解決現(xiàn)有的st語言for語句的編譯方法所導(dǎo)致指令的運行效率低下的技術(shù)問題,從而提高st語言for語句的編譯效率,進(jìn)而提高了st語言的運行效率。

基于同一發(fā)明構(gòu)思,本發(fā)明實施例還提供一種編譯器,圖4為本發(fā)明實施例中終端的結(jié)構(gòu)示意圖,如圖4所示,該編譯器包括:獲取模塊41、第一編譯模塊42、第一確定模塊43、第二確定模塊44和第二編譯模塊45;

其中,獲取模塊41,用于對結(jié)構(gòu)化文本st語言的循環(huán)語句進(jìn)行預(yù)處理后,至少獲取循環(huán)語句的初始值表達(dá)式、終止值表達(dá)式、循環(huán)增量表達(dá)式和循環(huán)執(zhí)行語句;第一編譯模塊42,用于對初始值表達(dá)式和終止值表達(dá)式分別進(jìn)行編譯,得到初始值表達(dá)式的值和終止值表達(dá)式的值;第一確定模塊43,用于將初始值表達(dá)式的值確定為循環(huán)語句的索引值;第二確定模塊44,用于基于循環(huán)增量表達(dá)式的類型,從初始值表達(dá)式的值和終止值表達(dá)式的值中確定出循環(huán)語句的上界和循環(huán)語句的下界;第二編譯模塊45,用于基于循環(huán)語句的上界、循環(huán)語句的下界、循環(huán)語句的索引值和循環(huán)增量表達(dá)式,對循環(huán)執(zhí)行語句進(jìn)行編譯,得到循環(huán)語句的編譯結(jié)果。

為了實現(xiàn)對for語句的編譯,首先需要確定出for語句的上界和下界,為了確定出for語句的上界和下界,以下分三種情況來實現(xiàn):

在一種可選的實施例中,上述第二確定模塊44,包括:第一預(yù)測子模塊,用于當(dāng)循環(huán)增量表達(dá)式的類型為常量時,從初始值表達(dá)式的值和終止值表達(dá)式的值中,確定出循環(huán)語句的上界預(yù)測值和循環(huán)語句的下界預(yù)測值;第一比較子模塊,用于比較下界預(yù)測值是否大于上界預(yù)測值;第一終止子模塊,用于若為是,終止循環(huán)語句;第一確定子模塊,用于若為否,將上界預(yù)測值確定為循環(huán)語句的上界,且將上界預(yù)測值確定為循環(huán)語句的下界。

在一種可選的實施例中,上述第一預(yù)測子模塊,具體用于:當(dāng)循環(huán)增量表達(dá)式的常量類型為正數(shù)常量時,將初始值表達(dá)式的值確定為循環(huán)語句的下界預(yù)測值,將終止值表達(dá)式的值確定為循環(huán)語句的上界預(yù)測值;當(dāng)循環(huán)增量表達(dá)式的常量類型為負(fù)數(shù)常量時,將初始值表達(dá)式的值確定為循環(huán)語句的上界預(yù)測值,將終止值表達(dá)式的值確定為循環(huán)語句的下界預(yù)測值。

以上,便確定出了當(dāng)循環(huán)增量表達(dá)式的類型為常量的兩種情況下for語句的上界和下界。

基于上述兩種情況下,為了得到循環(huán)語句的編譯結(jié)果,在一種可選的實施例中,上述第二編譯模塊45,具體用于:當(dāng)循環(huán)增量表達(dá)式的常量類型為正數(shù)常量時,對循環(huán)執(zhí)行語句進(jìn)行編譯,得到對應(yīng)的編譯語句;比較循環(huán)語句的索引值與循環(huán)語句的上界是否相等;若為是,終止循環(huán)語句;若為否,根據(jù)循環(huán)語句的索引值與循環(huán)增量表達(dá)式的值,更新循環(huán)語句的索引值,重新對循環(huán)執(zhí)行語句進(jìn)行編譯,得到對應(yīng)的編譯語句,并再次比較循環(huán)語句的索引值與循環(huán)語句的上界是否相等;當(dāng)循環(huán)增量表達(dá)式的常量類型為負(fù)數(shù)常量時,對循環(huán)執(zhí)行語句進(jìn)行編譯,得到對應(yīng)的編譯語句;比較循環(huán)語句的索引值與循環(huán)語句的下界是否相等;若為是,終止循環(huán)語句;若為否,根據(jù)循環(huán)語句的索引值與循環(huán)增量表達(dá)式的值,更新循環(huán)語句的索引值,重新對循環(huán)執(zhí)行語句進(jìn)行編譯,得到對應(yīng)的編譯語句,并再次比較循環(huán)語句的索引值與循環(huán)語句的下界是否相等。

在一種可選的實施例中,即上述第三種情況:上述第二確定模塊44,具體還用于:當(dāng)循環(huán)增量表達(dá)式的類型為變量時,將初始值表達(dá)式的值確定為循環(huán)語句的上界預(yù)測值,且將終止值表達(dá)式的值確定為循環(huán)語句的下界預(yù)測值;比較上界預(yù)測值是否大于等于下界預(yù)測值;若為是,將上界預(yù)測值確定為循環(huán)語句的上界,且將下界預(yù)測值確定為循環(huán)語句的下界;若為否,將上界預(yù)測值確定為循環(huán)語句的下界,且將下界預(yù)測值確定為循環(huán)語句的上界。

基于上述第三種情況,為了得到循環(huán)語句的編譯結(jié)果,在一種可選的實施例中,上述第二編譯模塊45,具體還用于:當(dāng)循環(huán)增量表達(dá)式的類型為變量時,對循環(huán)執(zhí)行語句進(jìn)行編譯,得到對應(yīng)的編譯語句;對循環(huán)增量表達(dá)式進(jìn)行編譯,得到循環(huán)增量表達(dá)式的值;根據(jù)循環(huán)語句的索引值與循環(huán)增量表達(dá)式的值,更新循環(huán)語句的索引值;比較更新后的循環(huán)語句的索引值是否大于循環(huán)語句的上界,若為是,終止循環(huán)語句;比較更新后的循環(huán)語句的索引值是否小于循環(huán)語句的下界,若為是,終止循環(huán)語句;否則,重新對循環(huán)執(zhí)行語句進(jìn)行編譯,得到對應(yīng)的編譯語句;并再次對循環(huán)增量表達(dá)式進(jìn)行編譯,得到循環(huán)增量表達(dá)式的值。

這里需要指出的是:以上編譯器實施例項的描述,與上述方法描述是類似的,具有同方法實施例相同的有益效果,因此不做贅述。對于本發(fā)明編譯器實施例中未披露的技術(shù)細(xì)節(jié),本領(lǐng)域的技術(shù)人員請參照本發(fā)明方法實施例的描述而理解,這里不再贅述。

這里需要指出的是:

應(yīng)理解,說明書通篇中提到的“一個實施例”或“一實施例”意味著與實施例有關(guān)的特定特征、結(jié)構(gòu)或特性包括在本發(fā)明的至少一個實施例中。因此,在整個說明書各處出現(xiàn)的“在一個實施例中”或“在一實施例中”未必一定指相同的實施例。此外,這些特定的特征、結(jié)構(gòu)或特性可以任意適合的方式結(jié)合在一個或多個實施例中。應(yīng)理解,在本發(fā)明的各種實施例中,上述各過程的序號的大小并不意味著執(zhí)行順序的先后,各過程的執(zhí)行順序應(yīng)以其功能和內(nèi)在邏輯確定,而不應(yīng)對本發(fā)明實施例的實施過程構(gòu)成任何限定。上述本發(fā)明實施例序號僅僅為了描述,不代表實施例的優(yōu)劣。

需要說明的是,在本文中,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者裝置不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者裝置所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,并不排除在包括該要素的過程、方法、物品或者裝置中還存在另外的相同要素。

在本申請所提供的幾個實施例中,應(yīng)該理解到,所揭露的設(shè)備和方法,可以通過其它的方式實現(xiàn)。以上所描述的設(shè)備實施例僅僅是示意性的,例如,所述模塊的劃分,僅僅為一種邏輯功能劃分,實際實現(xiàn)時可以有另外的劃分方式,如:多個模塊或組件可以結(jié)合,或可以集成到另一個系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另外,所顯示或討論的各組成部分相互之間的耦合、或直接耦合、或通信連接可以是通過一些接口,設(shè)備或模塊的間接耦合或通信連接,可以是電性的、機械的或其它形式的。

上述作為分離部件說明的模塊可以是、或也可以不是物理上分開的,作為模塊顯示的部件可以是、或也可以不是物理單元;既可以位于一個地方,也可以分布到多個網(wǎng)絡(luò)單元上;可以根據(jù)實際的需要選擇其中的部分或全部模塊來實現(xiàn)本實施例方案的目的。

另外,在本發(fā)明各實施例中的各功能模塊可以全部集成在一個處理單元中,也可以是各模塊分別單獨作為一個單元,也可以兩個或兩個以上模塊集成在一個模塊中;上述集成的模塊既可以采用硬件的形式實現(xiàn),也可以采用硬件加軟件功能模塊的形式實現(xiàn)。

本領(lǐng)域普通技術(shù)人員可以理解:實現(xiàn)上述方法實施例的全部或部分步驟可以通過程序指令相關(guān)的硬件來完成,前述的程序可以存儲于計算機可讀取存儲介質(zhì)中,該程序在執(zhí)行時,執(zhí)行包括上述方法實施例的步驟;而前述的存儲介質(zhì)包括:移動存儲設(shè)備、只讀存儲器(readonlymemory,rom)、磁碟或者光盤等各種可以存儲程序代碼的介質(zhì)。

或者,本發(fā)明上述集成的模塊如果以軟件功能模塊的形式實現(xiàn)并作為獨立的產(chǎn)品銷售或使用時,也可以存儲在一個計算機可讀取存儲介質(zhì)中。基于這樣的理解,本發(fā)明實施例的技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻(xiàn)的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機軟件產(chǎn)品存儲在一個存儲介質(zhì)中,包括若干指令用以使得一臺計算機設(shè)備(可以是個人計算機、服務(wù)器、或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個實施例所述方法的全部或部分。而前述的存儲介質(zhì)包括:移動存儲設(shè)備、rom、磁碟或者光盤等各種可以存儲程序代碼的介質(zhì)。

以上所述,僅為本發(fā)明的具體實施方式,但本發(fā)明的保護(hù)范圍并不局限于此,任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到變化或替換,都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。因此,本發(fā)明的保護(hù)范圍應(yīng)以所述權(quán)利要求的保護(hù)范圍為準(zhǔn)。

當(dāng)前第1頁1 2 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1