TWI801836B - 將程式碼於不同程式語言間進行轉換及優化的方法 - Google Patents
將程式碼於不同程式語言間進行轉換及優化的方法 Download PDFInfo
- Publication number
- TWI801836B TWI801836B TW110112070A TW110112070A TWI801836B TW I801836 B TWI801836 B TW I801836B TW 110112070 A TW110112070 A TW 110112070A TW 110112070 A TW110112070 A TW 110112070A TW I801836 B TWI801836 B TW I801836B
- Authority
- TW
- Taiwan
- Prior art keywords
- block
- programming language
- statement
- syntax
- token
- Prior art date
Links
Images
Landscapes
- Stored Programmes (AREA)
- Machine Translation (AREA)
Abstract
一種程式碼的轉換及優化方法,包括:取得來源程式片段;取得來源程式片段對應的抽象語法樹;通過語法標記解析器遞迴巡訪抽象語法樹中的多個節點;依據被巡訪的節點查詢語法標記對應表以產生對應至目的程式語言的語法標記;通過語意組合器遞迴巡訪抽象語法樹中的多個區塊;將區塊的內容及語法標記與上一個被巡訪的區塊的內容及語法標記進行組合以產生並更新中間結果;於遞迴結束後基於中間結果產生目的程式片段;及,通過語意優化器巡訪目的程式片段中的複數語意組合,並對複數語意組合進行化簡以產生優化後目的程式片段。
Description
本發明涉及程式語言,尤其涉及一種將程式碼於不同的程式語言架構之間進行轉換並且進行優化的方法。
目前在工業自動化領域中,開發人員可以使用多種不同的程式語言來進行開發,而各種程式語言是分別針對不同學科背景人士與不同產業領域所各別提供的。
具體地,工業自動化領域中一般常見的程式語言,包括有傳統階梯圖(Ladder Diagram)、功能塊圖(Function Block Diagram)、連續功能圖(Continuous Function Chart)、順序功能圖(Sequential Function Chart)、結構化文字(Structured Text)、PASCAL、Java、C/C++/C#、Python、Objective-C、Lua等,並且一般可被區分為圖形程式語言及文字程式語言。
如上所述,各種不同的程式語言係分別具有不同的使用族群,因此並非所有的開發人員都會使用全部的程式語言。為了克服上述問題,目前市面上有部分的工控產品提供了可將程式碼在少數圖形程式語言之間進行轉換的轉換程序。
然而,現今市面上可見的轉換程序主要僅針對圖形程式語言所設計,無法將基於圖形程式語言架構所編寫完成的程式碼邏輯轉換為符合文字程式語言的架構並且具有同質性語意的程式碼,無法將基於文字程式語言架構所編寫完成的程式碼邏輯轉換為符合圖形程式語言的架構並且具有同質性語意的程式碼,並且也無法將程式碼在不同的文字程式語言架構之間進行互換。
再者,上述轉換程序僅能以一個完整的程序單元(Program Organization Units,POU)做為一個轉換單位,而無法進行程式片段的轉換,並且亦無法在轉換後對目的程式碼進行優化。因此,可能在語言轉換後產生較不恰當的程式碼,造成可編程邏輯控制器(Programmable Logic Controller,PLC)的暫存器、I/O點或記憶體的浪費,並且使得所產生的PLC檔案容量過大,進而提高了工業自動化產線整體的開發成本。
本發明之主要目的,在於提供一種將程式碼於不同程式語言間進行轉換及優化的方法,可令使用者擷取程式片段並在圖形程式語言與文字程式語言之間任意進行轉換以產生目的程式碼,並於轉換後自動對目的程式碼執行優化。
為了達成上述之目的,本發明的轉換及優化方法主要是應用於程式語言編輯器,並且包括下列步驟:a)取得基於一來源程式語言所編寫的一程式片段,其中該來源程式語言為圖形程式語言或文字程式語言;
b)取得該程式片段對應的一抽象語法樹(Abstract Syntax Tree,AST),其中該抽象語法樹包括多個區塊;c)通過一語法標記解析器巡訪該抽象語法樹中的該多個區塊的其中之一;d)依據該被巡訪的區塊查詢一語法標記對應表,以為該區塊產生對應至一目的程式語言的一語法標記,其中該語法標記對應表記錄該來源程式語言的複數語法與該目的程式語言的複數語法間的一對應關係,該目的程式語言為圖形程式語言或文字程式語言;e)於該多個區塊皆被該語法標記解析器巡訪並且產生該語法標記前,重覆執行該步驟c及該步驟d;f)於該多個區塊皆被該語法標記解析器巡訪並且產生該語法標記後,通過一語意組合器巡訪該抽象語法樹中的該多個區塊的其中之一;g)將該被巡訪的區塊的內容及該語法標記與上一個被巡訪的區塊的內容及該語法標記進行組合以產生一中間結果;h)於該多個區塊皆被該語意組合器巡訪前,重覆執行該步驟f及該步驟g以更新該中間結果;i)於該多個區塊皆被該語意組合器巡訪後,依據更新後的該中間結果產生一目的程式片段;j)通過一語意優化器巡訪該目的程式片段中的多個語意組合,於該多個語意組合符合一條件等式時執行一等價置換程序並產生一優化後目的程式片段;及
k)於該程式語言編輯器上輸出該優化後目的程式片段,其中該優化目的程式片段符合該目的程式語言。
相較於相關技術,本發明可將基於圖形程式語言或文字程式語言編寫的來源程式片段直接轉換為符合其他程式語言的架構的目的程式片段,並且令目的程式片段與來源程式片段具有同質性的語意。藉此,可大幅降低不同學科背景的人士進入工業自動化產業中的程式設計領域的門檻,並且,提高可編程邏輯控制器(Programmable Logic Controller,PLC)的編程效率,同時益於縮短專案的整合時間整本。
並且,本發明自動對轉換後的目的程式片段執行優化,藉此還可有效節省PLC的暫存器、I/O點的使用量以及記憶體的空間,縮小所產生的PLC配置檔案的容量,降低了工業自動化產線整體的開發成本。
1:來源程式片段
11:第一巡訪區塊
12:第二巡訪區塊
13:第三巡訪區塊
14:語法標記
2:目的程式片段
21:第一節點
22:第二節點
23:第三節點
24:第四節點
25:第五節點
31:一般區塊
32:連續區塊
33:分支區塊
41:條件陳述
42:條件運算
43:一般陳述
5:抽象語法樹
6:目的程式片段
61:第一網絡
62:第二網絡
63:第三網絡
64:第四網絡
65:第五網絡
71、73、75:優化前目的程式片段
72、74、76:優化後目的程式片段
S10~S15、S21~S31:轉換及優化步驟
S41~S57:標記步驟
S60~S77:組合步驟
S80~S82:優化步驟
圖1為本發明的轉換及優化流程圖的第一具體實施例。
圖2為本發明的轉換情境示意圖。
圖3為程式語言的區塊示意圖。
圖4A為程式語言的條件陳述示意圖。
圖4B為程式語言的條件運算示意圖。
圖4C為程式語言的一般陳述示意圖。
圖5為本發明的轉換及優化流程圖的第二具體實施例。
圖6為本發明的遞迴巡訪示意圖的第一具體實施例。
圖7為本發明的抽象語法樹的示意圖的第一具體實施例。
圖8A為本發明的語法標記的第一流程圖的第一具體實施例。
圖8B為本發明的語法標記的第二流程圖的第一具體實施例。
圖9A為本發明的語意組合的第一流程圖的第一具體實施例。
圖9B為本發明的語意組合的第二流程圖的第一具體實施例。
圖10為本發明的轉換示意圖的第一具體實施例。
圖11為不同程式語言的轉換示意圖。
圖12為本發明的優化流程圖的第一具體實施例。
圖13為本發明的優化示意圖的第一具體實施例。
圖14A為本發明的優化流程圖的第二具體實施例。
圖14B為本發明的優化流程圖的第三具體實施例。
圖14C為本發明的優化流程圖的第四具體實施例。
茲就本發明之一較佳實施例,配合圖式,詳細說明如後。
本發明揭露了一種將程式碼於不同程式語言間進行轉換及優化的方法(下面將於說明書中簡稱為優化方法),所述優化方法主要應用於任一種程式語言的程式語言編輯器中,並且藉由附加在所述程式語言編輯器中一支應用程式來實現。
具體地,本發明的優化方法係以程式碼的方式撰寫成一支可以獨立運作並且可對程式碼進行分析與處理的應用程式,並且,基於優化方法所要實現的功能,可將所述應用程式邏輯分割成做為語法標記解析器使用的第一子程式、做為語意組合器使用的第二子程式、以及做為語意優化器使用的第三子程式。
值得一提的是,本發明中的上述語法標記解析器及語意組合器主要是對要進行分析與處理的程式碼的抽象邏輯樹(Abstract Syntax Tree,AST)進行分析與處理,但並不以此為限。
參閱圖1及圖2,其中圖1為本發明的轉換及優化流程圖的第一具體實施例,圖2為本發明的轉換情境示意圖。如圖1所示,本發明的優化方法是先從程式語言編輯器中取得以來源程式語言的架構編寫而成的待轉換程式碼(步驟S10),接著通過所述語法標記解析器對待轉換程式碼進行解析與處理(步驟S11),以替待轉換程式碼中的各個程式元件分別記錄上對應至目的程式語言的架構的語法標記。接著,所述優化方法再通過所述語意組合器來對待轉換程式碼進行解析與處理(步驟S12),以對各個已完成語法標記的程式元件進行組合,進而產生符合目的程式語言的架構的轉換後程式碼(步驟S13)。
步驟S13後,本發明的優化方法再通過所述語意優化器對轉換後程式碼進行解析與處理(步驟S14),以對轉換後程式碼中包含的複數程式元件進行化簡。最後,再於所述程式語言編輯器上輸出化簡後程式碼(步驟S15)。
本發明的優化方法通過所述語意優化器來對轉換後程式碼進行化簡,可以避免在轉換過程中為了符合正規化的轉換規則而產生較為複雜、冗長的轉換後程式碼。如此一來,可以有效節省可編程邏輯控制器(Programmable Logic Controller,PLC)的暫存器、I/O點的使用率以及記憶體的空間。
如上所述,本發明的優化方法主要是針對程式碼的抽象邏輯樹(Abstract Syntax Tree,AST)進行分析與處理,而非直接對程式碼的內容進行分析與處理,因此,可以達到將以圖形程式語言編寫的程式碼轉換為符合文字程式語言的架構或另一種圖形程式語言的架構的程式碼,並可將以文字程式語言編寫
的程式碼轉換為符合圖形程式語言的架構或另一種文字程式語言的架構的程式碼的主要目的。
於一實施例中,所述圖形程式語言可例如包括傳統階梯圖(Ladder Diagram)程式語言、功能塊圖(Function Block Diagram)程式語言、連續功能圖(Continuous Function Chart)程式語言與順序功能圖(Sequential Function Chart)程式語言等,所述文字程式語言可例如包括結構化文字(Structured Text)程式語言、PASCAL程式語言、Java程式語言、C/C++/C#程式語言、Python程式語言、Objective-C程式語言與Lua程式語言等,但不加以限定。
更具體地,所述語法標記解析器記錄有至少一個正規化的語法標記對應表(圖未標記),所述語法標記對應表中記錄了一個程式語言的複數語法與其他多種程式語言的複數語法間的對應關係。通過所述語法標記對應表的查詢,語法標記解析器可以將一段程式碼中使用的多種語法於上述多種不同的程式語言之間進行轉換。並且,當有新的程式語言出現時,只需要增添所述語法標記對應表的內容,即可令本發明的優化方法進一步適用於新的程式語言。藉此,有效提高的本發明的優化方法的擴增彈性。
並且,如上述所,本發明的優化方法主要是對程式碼中包含的各個程式元件分別進行分析與處理(即,對所述抽象語法樹中的各個節點分別進行分析與處理,容後詳述),因此,不但可將程式碼中的一個完整的程序單元(Program Organization Units,POU)做為轉換單位,亦可直接將邏輯完整的一個程式片段做為轉換單元。藉此,可有效提高所述優化方法的使用彈性以及使用效率。
值得一提的是,於部分實施例中,程式編輯人員並不需要將一個程式片段由來源程式語言的架構轉換成目的程式語言的架構。於此情況下,本發明的優化方法仍可通過所述語意優化器直接對來源程式碼進行分析與處理,藉此在不執行轉換程序的情況下,直接對來源程式碼進行化簡以產生優化後的目的程式碼。
如圖2所示,程式編輯人員可於電腦設備上開啟第一程式語言編輯器。於第一程式語言編輯器上,程式編輯人員可以基於第一程式語言(圖2中以階梯圖程式語言為例)開啟或編寫一段程序單元。並且,程式編輯人員還可於相同或不同電腦設備上開啟第二程式語言編輯器。於第二程式語言編輯器上,程式編輯人員可基於第二程式語言(圖2中以結構化文字程式語言為例)來開啟另一種程式語言的專案。其中電腦設備可以是桌上型電腦、筆記型電腦、平板電腦或其他智慧型裝置等,但本發明不限於此。
於此作業環境下,程式編輯人員可藉由第一操作指令(例如藉由鍵盤或滑鼠進行複製或剪下),由第一程式語言編輯器上的程序單元中複製所需的一段邏輯完整的來源程式片段1,並且再藉由第二操作指令(例如藉由鍵盤或滑鼠進行貼上),將所述來源程式片段1貼上至第二程式語言編輯器上的所述專案中。本發明的其中一個技術特徵在於,於進行所述貼上程序時,本發明的優化方法可自動偵測所述專案採用的第二程式語言,自動將所述來源程式片段1轉換為符合第二程式語言的架構的目的程式片段2並且進行優化後,再將轉換並優化後的目的程式片段2貼上至所述專案中,以令程式編輯人員在所述專案中可以直接使用轉換並優化後的目的程式片段2。
如前文所述,本發明的優化方法是通過一或多個語法標記對應表來進行不同程式語言間的語法的對應,進而達到在不同程式語言架構之間轉換程式碼的目的。因此,轉換前的來源程式片段1與轉換後的目的程式片段2,係為具有同質性語意的兩個程式片段2。換句話說,在所述第二程式語言編輯器上執行所述目的程式片段2後,係可達到與在所述第一程式語言編輯器上執行所述來源程式片段1完全相同的結果。
續請同時參閱圖3及圖4A至圖4C,其中圖3為程式語言的區塊示意圖,圖4A至圖4C分別為程式語言的條件陳述示意圖、條件運算示意圖與一般陳述示意圖。
於開始對本發明的優化方法進行詳細說明前,先藉由圖3及圖4A至圖4C的實施例對後續說明中採用的技術名詞進行定義。具體地,圖3及圖4A至圖4C是以階梯圖程式語言為例,進行說明,但相同概念可直接套用於其他各種不同的程式語言。
於圖3的實施例中,單一個區塊被視為一般區塊(Normal Block)31,由兩個或兩個以上的物件(包括一般區塊31或分支區塊(Branch Block)33)串聯而成的被視為連續區塊(Continuous Block)32,而由兩個或兩個以上的物件(包括一般區塊31或連續區塊32)並聯而成的被視為分支區塊33。並且,於圖3的實施例中,虛線部分的分支區塊33為虛線部分的連續區塊32的上層,而虛線部分的連續區塊32為虛線部分的一般區塊31的上層。
具體地,上述每一個一般區塊31皆可包含一個物件內容(即,區塊上方的問號部分)。
接著請參閱圖4A至圖4C。圖4A揭露了條件陳述41的語法,並且圖4A中是以「IF……THEN……END_IF;」的條件陳述41為例,但不以此為限。圖4B揭露了條件運算42的語法,並且圖4B的第(1)實施例是以「AND」及「NOT」為例,圖4B的第(2)實施例是以「OR」為例,但不以此為限。圖4C揭露了一般陳述43的語法,並且圖4C的第(1)實施例是以結尾陳述的「Out:=TRUE;」為例,圖4C的第(2)實施例是以功能陳述的「FB_Inst(InA,InB)」為例,圖4C的第(3)實施例是以布林陳述的「OR邏輯陳述」為例,但不以此為限。
具體地,上述條件陳述41、條件運算42與一般陳述43的語法,屬於程式設計技術領域的公知技術,於此不再贅述。
參閱圖5,為本發明的轉換及優化流程圖的第二具體實施例。具體地,如圖5所示,要執行本發明的優化方法,首先,於所述程式語言編輯器上取得基於來源程式語言編寫而成的來源程式片段1(步驟S21),並且獲取所述來源程式片段1的抽象語法樹(步驟S22)。於一實施例中,所述來源程式片段1為邏輯完整的程式片段、完整的程序單元(POU)或已經編寫完成的應用程式,不加以限定。
所述抽象語法樹係基於來源程式片段1的內容而具有多個區塊(或稱為節點),其中包含所述一般區塊31、連續區塊32或分支區塊33。於一實施例中,所述一般區塊31可包含一個物件內容,所述物件內容可例如包括條件物件、功能物件或結尾物件等。並且,程式語言編輯器會為各個區塊分別配置一個對應的節點暫存器,並且將各個區塊的物件內容以及所述語法標記解析器分析後產生的語法標記分別記錄於各個區塊被配置的節點暫存器中。
請同時參閱圖6及圖7,其中圖6為本發明的遞迴巡訪示意圖的第一具體實施例,圖7為本發明的抽象語法樹的示意圖的第一具體實施例。
圖6揭示了一組來源程式片段1(以階梯圖程式語言為例),以及經過本發明的優化方法後所得的一組目的程式片段2(以結構化文字程式語言為例),圖7則揭露了一個抽象語法樹5。本技術領域中具有通常知識者可看出,所述抽象語法樹5同時對應至所述來源程式片段1以及目的程式片段2的語意,因此通過對抽象語法樹5中的多個區塊(即,節點)進行巡訪,本發明的優化方法可以依序取得來源程式片段1中包含的各個程式元件,並且進行同質性語意的轉換後,再組合而成所述目的程式片段2。
回到圖5。於步驟S22後,所述程式語言編輯器通過語法標記解析器來巡訪抽象語法樹5中的多個區塊的其中之一(步驟S23)。於執行巡訪動作時,語法標記解析器取得被巡訪的區塊的物件內容以及此區塊與相鄰區塊的連接關係,並且依據所述物件內容與連接關係來查詢所述語法標記對應表,藉此產生對應至目的程式語言的語法標記,並且記錄於此區塊被分配的節點暫存器中(步驟S24)。
如前文所述,所述語法標記對應表中記錄了來源程式語言(可為圖形程式語言或文字程式語言)的複數語法與目的程式語言(可為圖形程式語言或文字程式語言)的複數語法間的對應關係。於圖6的實施例中,來源程式片段1採用的是階梯圖程式語言,目的程式片段2採用的是結構化文字程式語言。於上述步驟S24中,語法標記解析器主要是查詢一個記錄有階梯圖程式語言的複數語法與結構化文字程式語言的複數語法的對應關係的第一語法標記對應表,藉此為來源程式片段1中的各個區塊產生語法標記。其中,所述語法標記主要是記
錄來源程式片段1中的各個區塊的物件內容以及連接關係在目的程式片段2中所應該具備的表達方式。
步驟S24後,語法標記解析器判斷來源程式片段1中的所有區塊是否皆已巡訪完畢(步驟S25),並且於所有區塊皆巡訪完畢前重覆執行步驟S23及步驟S24,以巡訪來源程式片段1中的下一個區塊,並且為下一個區塊產生對應的語法標記。換句話說,本發明的語法標記解析器主要是以遞迴的方式來巡訪來源程式片段1中所包含的所有區塊。
值得一提的是,基於來源程式片段1的複雜度,可能無法藉由單一次的遞迴巡訪動作就完成所有區塊的語法標記。舉例來說,若來源程式片段1中包含了複雜的結尾陳述(例如具有多個ELSE或ELSEIF),則語法標記解析器需要執行至少兩次的遞迴巡訪,才能完成語法標記動作。具體地,於上述實施例中,語法標記解析器需於第一次遞迴巡訪動作時取得後方的所有結尾陳述,並且於第二次遞迴巡訪動作時,基於各個區塊的物件內容、與相鄰區塊間的連接關係以及後方的所有結尾陳述來進行語法標記。
有鑑於上述問題,於另一實施例中,本發明的語法標記解析器可以於來源程式語言為文字程式語言時,以正向遞迴方式來巡訪抽象語法樹5中的多個區塊(即,依據圖6中所示的第一巡訪區塊11、第二巡訪區塊12、第三巡訪區塊13的順序執行語法標記動作)。若來源程式語言為圖形程式語言,則語法標記解析器可以反向遞迴方式來巡訪抽象語法樹5中的多個區塊(即,依據圖6中所示的第三巡訪區塊13、第二巡訪區塊12、第一巡訪區塊11的順序執行語法標記動作)。藉由將後方的結尾陳述帶到下一個巡訪動作中進行參考,可以確保在單一次的遞迴巡訪動作中即完成來源程式片段1中的所有區塊的語法標記。
回到圖5。若語法標記解析器於步驟S25中判斷來源程式片段1中的所有區塊皆已巡訪完畢,則程式語言編輯器進一步通過所述語意組合器來巡訪所述抽象語法樹5中的多個區塊的其中之一(步驟S26)。具體地,於步驟S26中,語意組合器主要是巡訪已經具備有語法標記的區塊。
步驟S26後,語意組合器從被巡訪的區塊的節點暫存器中取出此區塊的物件內容以及語法標記,並且將此區塊的物件內容以及語法標記與上一個被巡訪的區塊的物件內容及語法標記進行組合,以產生中間結果(步驟S27)。值得一提的是,於第一次執行巡訪動作,或是本次巡訪動作無法與上一次的巡訪動作進行組合時,語意組合器直接將當前被巡訪的區塊的物件內容及語法標記進行組合,以產生初始的中間結果。
步驟S27後,語意組合器判斷來源程式片段1中的所有區塊是否皆已巡訪完畢(步驟S28),並且於所有區塊皆巡訪完畢前重覆執行步驟S26及步驟S27,以藉由下一個區塊的物件內容與語法標記來更新所述中間結果。換句話說,本發明的語意組合器同樣是以遞迴的方式來巡訪來源程式片段1中所包含的所有區塊。
值得一提的是,本發明的語意組合器的主要功能是將各個區塊的物件內容以及語法標記進行組合,因此,無論來源程式語言為文字程式語言或圖形程式語言,語意組合器都可以決定以正向遞迴方式來巡訪抽象語法樹5中的各個區塊,或是以反向遞迴方式來巡訪抽象語法樹5中的各個區塊,並不加以限定。
若語法標記解析器於步驟S28中判斷來源程式片段1中的所有區塊皆已巡訪完畢,所述語意組合器即可通過最後更新的中間結果來產生目的程
式片段2(步驟S29)。本發明的語法標記解析器是基於目的程式語言所採用的語法來產生各個區塊的語法標記,而語意組合器是直接將各個區塊的物件內容與語法標記進行組合。因此,步驟S29中產生的目的程式片段2,係會符合目的程式語言的架構。
步驟S29後,程式語言編輯器進一步通過所述語意優化器巡訪目的程式片段2中包含的一或多個語意組合(步驟S30),並且於一或多個語意組合符合條件等式時,執行等價置換程序,以產生優化後目的程式片段(步驟S31)。最後,程式語言編輯器即可於其頁面上輸出轉換並且優化完成的所述優化後目的程式片段,以供程式編輯人員於目的程式語言的專案中直接使用。
本發明中,所述等價置換程序主要是對目的程式片段2中的一或多個語意組合進行化簡(例如利用代數恆等式中的結合律、分配律、德摩根定理或是曼諾圖等),以減少目的程式片段2中包含的區塊的數量,藉此節省PLC中的節點暫存器與I/O點位的使用率,進而降低開發成本(容後詳述)。
續請同時參閱圖6、圖8A及圖8B,其中圖8A與圖8B為本發明的語法標記的第一流程圖及第二流程圖的第一具體實施例,用以具體說明本發明的語法標記解析器所執行的遞迴巡訪動作。
首先,語法標記解析器於來源程式片段1中取得尚未巡訪的一個區塊(步驟S41),並且判斷此區塊是否為分支區塊33(步驟S42)。若此區塊為分支區塊33,進一步判斷此分支區塊33中是否為上層區塊中最後一個具有條件執行的區塊(步驟S43)。若此分支區塊33確實為上層區塊中最後一個具有條件執行的區塊,則語法標記解析器依據此分支區塊33與相鄰區塊的連接關係取得對應的條件陳述41(例如THEN、END_IF等),依此條件陳述41查詢所述語法標記對應
表以取得目的程式語言對於此條件陳述41的語法標記,並將此語法標記記錄於此分支區塊33的節點暫存器中(步驟S44)。
並且,語法標記解析器於判斷當前巡訪的區塊為分支區塊33時,無論此分支區塊33是否符合上述步驟S43的判斷,都會基於分支區塊33的功能而取得對應的一個條件運算42(即,OR條件運算),依據此條件運算42查詢所述語法標記對應表以取得目的程式語言對於此條件運算42的語法標記,並且同樣將此語法標記記錄於此分支區塊33的節點暫存器中(步驟S45)。於步驟S45後,語法標記解析器即完成了一個分支區塊33的巡訪動作。
值得一提的是,若語法標記解析器是採用反向遞迴的方式巡訪抽象語法樹5中的多個區塊,則語法標記解析器在巡訪了一個包含有結尾物件的一般區塊31後(例如後續步驟S56所示),會將此結尾物件所指出的結尾陳述(例如Out)帶入下一次巡訪動作中。
若語法標記解析器是採用反向遞迴的方式進行巡訪,則於上述步驟S45中,語法標記解析器進一步帶入在上一次巡訪動作中所得到的結尾陳述的記錄。藉此,在本次巡訪動作中,語法標記解析器可以基於此結尾陳述的記錄來判斷當前巡訪的分支區塊33的語法標記(例如,依據結尾陳述的記錄,判斷本次巡訪的分析區塊33中的條件物件為條件陳述41「THEN」、「ELSE」或「ELSEIF」等)。
惟,上述說明僅為本發明的其中一種具體實施範例,但並不以此為限。
若於步驟S42中判斷當前巡訪的區塊不是分支區塊33,則語法標記解析器進一步判斷此區塊是否為連續區塊32(步驟S46)。若此區塊為連續區塊
32,語法標記解析器進一步判斷此連續區塊32是否為上層區塊中最後一個有條件執行的區塊(步驟S47)。若此連續區塊32確實為上層區塊中最後一個有條件執行的區塊,則語法標記解析器依據此連續區塊32與相鄰區塊的連接關係取得對應的條件陳述41(例如THEN、END_IF等),依此條件陳述41查詢所述語法標記對應表以取得目的程式語言對於此條件陳述41的語法標記,並將語法標記記錄於此連續區塊32的節點暫存器中(步驟S48)。
同樣的,若語法標記解析器是採用反向遞迴的方式進行巡訪動作,則無論當前巡訪的連續區塊32是否為上層區塊中最後一個具有條件執行的區塊,語法標記解析器在步驟S49中皆會帶入在上一次巡訪動作中所得到的結尾陳述的記錄,理由同上。於步驟S49後,語法標記解析器即完成了一個連續區塊32的巡訪動作。
若當前巡訪的區塊不是分支區塊33,也不是連續區塊32,則語法標記解析器認定當前巡訪的區塊為一般區塊31。據此,語法標記解析器判斷此一般區塊31是否包含條件物件(步驟S50)、是否包含功能物件(步驟S54)、或是否包含結尾物件(步驟S56)。
若於步驟S50中判斷當前巡訪的一般區塊31包含條件物件,語法標記解析器接著判斷此條件物件是否為連續條件物件中的第一個條件物件或最後一個條件物件(步驟S51)。若判斷此條件物件為連續條件物件中的第一個條件物件或最後一個條件物件,則語法標記解析器依據此一般區塊31與相鄰區塊的連接關係取得對應的條件陳述41,依此條件陳述41查詢所述語法標記對應表以取得目的程式語言對於此條件陳述41的語法標記,並且將此語法標記記錄於此一般區塊31的節點暫存器中(步驟S52)。
舉例來說,於圖6的實施例中條件物件「D」為連續條件物件中的第一個條件物件,因此在巡訪到包含條件物件「D」的一般區塊31時,語法標記解析器會依據條件陳述「IF」來查詢語法標記對應表,並將查表後取得的語法標記記錄於具有此一般區塊31的節點暫存器中。再例如,圖6中的分支區塊33為連續條件物件中的最後一個條件物件(連續條件物件不計入結尾物件),在巡訪到這個分支區塊33時,語法標記解析器會依據條件陳述「THEN」查詢語法標記對應表,並將查表後取得的語法標記記錄於此分支區塊33的節點暫存器中。
並且,若當前巡訪的一般區塊31中包含條件物件(步驟S50),語法標記解析器還會依據此一般區塊31與相鄰區塊的連接關係取得對應的條件運算42,依據此條件運算42查詢語法標記對應表以取得目標程式語言對於此條件運算42的語法標記,並將此語法標記記錄於此一般區塊31的節點暫存器中(步驟S53)。
舉例來說,於圖6的實施例中條件物件「B」本身包含了條件運算「NOT」,因此在巡訪到包含條件物件「B」的一般區塊31時,語法標記解析器會依據條件運算「NOT」查詢語法標記對應表,並將查表後取得的語法標記記錄於此一般區塊31的節點暫存器中。再例如,圖6中的條件物件「D」與後方區塊間的連接關係為串聯,因此在巡訪到包含有條件物件「D」的一般區塊31時,語法標記解析器會依據條件運算「AND」查詢語法標記對應表,並將查表後取得的語法標記記錄於此一般區塊31的節點暫存器中。
值得一提的是,若語法標記解析器採用反向遞迴的方式進行巡訪動作,則語法標記解析器在巡訪了一個包含有結尾物件的一般區塊31後(例如後續步驟S56所示),會將此結尾物件所指出的結尾陳述(例如Out)帶入下一次巡訪
動作中。於上述步驟S53中,語法標記解析器進一步帶入在上一次巡訪動作中所得的結尾陳述的記錄,理由同前文所述。
於步驟S53後,語法標記解析器即完成了一個包含條件物件的一般區塊31的巡訪動作。
值得一提的是,若一個分支區塊32中包含了多個一般區塊31(即,此分支區塊32為多個一般區塊31的上層),則所述語法標記解析器除了需巡訪此分支區塊32之外,還需依序巡訪此分支區塊32中所包含的各個一般區塊31。舉例來說,圖6中的分支區塊32包含了兩個一般區塊31,因此,語法標記解析器需要依據圖8A、圖8B的流程來依序執行三次的巡訪動作,才能完成對整個分支區塊32的語法標記動作。
若判斷當前巡訪的一般區塊31包含功能物件(步驟S54),則語法標記解析器直接取得此功能物件的功能陳述,依此功能陳述查詢所述語法標記對應表以取得目的程式語言對於此功能陳述的語法標記,並將此語法標記記錄於此一般區塊31的節點暫存器中(步驟S55)。於步驟S55後,語法標記解析器即完成了一個包含功能物件的一般區塊31的巡訪動作。
若判斷當前巡訪的一般區塊31包含結尾物件(步驟S56),則語法標記解析器依據此一般區塊31與相鄰區塊的連接關係取得對應的條件陳述41(例如ELSEIF、END_IF等),並且依據此結尾物件的結尾陳述(例如Out)以及此條件陳述41查詢語法標記對應表以取得目的程式語言對於此結尾陳述以及條件陳述41的語法標記,並且將此語法標記記錄於此一般區塊31的節點暫存器中(步驟S57)。
值得一提的是,若語法標記解析器是採用反向遞迴的方式進行巡訪動作,則語法標記解析器於判斷當前巡訪的一般區塊31中包含結尾物件時,會將此結尾陳述的記錄帶入下一次的巡訪動作(步驟S57),理由同前文所述。於步驟S57後,語法標記解析器即完成了一個包含結尾物件的一般區塊31的巡訪動作。
下面結合圖6與圖8A及圖8B來進行上述巡訪動作的具體說明。於圖6的實施例中,由於來源程式片段1是基於圖形程式語言所編寫的,因此下面將以反向遞迴的方式進行說明,但並不以此為限。如前文所述,無論來源程式片段1是基於圖形程式語言或是文字程式語言所編寫,語法標記解析器都可以正向遞迴或是反向遞迴的方式來進行多個區塊的巡訪動作。
如圖6所示,於開始進行巡訪動作時,語法標記解析器首先取得第三巡訪區塊13(即,基於反向遞迴的順序,從來源程式片段1的最後一個區塊開始巡訪),並且判斷第三巡訪區塊13為一般區塊31並且包含了結尾物件(Out)。於此情況下,語法標記解析器依此一般區塊31與相鄰區塊間的連接關係(為上層區塊中的最後一個區塊)取得對應的條件陳述41,並且依據此結尾物件的結尾陳述以及此條件陳述41查詢所述語法標記對應表,以取得目的程式語言對於此結尾陳述以及條件陳述41的語法標記(本實施例中為「END_IF;」以及「Out:=TRUE;」)。並且,語法標記解析器將此語法標記記錄於此一般區塊31的節點暫存器中。
並且,由於第三巡訪區塊13包含了結尾物件,因此語法標記解析器將上述結尾陳述帶入下一次的巡訪動作中。
接著,語法標記解析器取得來源程式片段1中的第二巡訪區塊12,判斷第二巡訪區塊12為分支區塊33,並且判斷此分支區塊33具有條件運算42
「OR」、此分支區塊33為上層區塊中的最後一個具有條件執行的區塊、並且基於上一次巡訪動作的記錄可知此分支區塊33的後方連接了一個結尾物件。據此,語法標記解析器基於上述資訊查詢語法標記對應表,以取得目的程式語言對於所述條件運算42以及條件陳述41的語法標記(本實施例中為「OR」以及「THEN」),並將此語法標記記錄於此分支區塊33的節點暫存器中。
由於第二巡訪區塊12(即,上述分支區塊33)中包含了兩個一般區塊31,因此語法標記解析器接著會依序(反向遞迴)巡訪分支區塊33中的兩個一般區塊31。
首先,語法標記解析器取得第二巡訪區塊12中的最後一個一般區塊31,判斷此一般區塊31包含了條件物件「B」以及條件運算42「NOT」、此一般區塊31不是連續條件物件中的最後一個條件物件、並且此一般區塊31為上層的分支區塊33中的最後一個區塊(即,後方不需要連接條件運算42「OR」)。據此,語法標記解析器可以基於上述資訊查詢語法標記對應表,以取得目的程式語言對於條件運算42「NOT」的語法標記,並將此語法標記記錄於此一般區塊31的節點暫存器中。
接著,語法標記解析器取得第二巡訪區塊12中的第一個一般區塊31,判斷此一般區塊31包含了條件物件「A」、此一般區塊31不是連續條件物件中的最後一個條件物件、並且此一般區塊31並非為上層的分支區塊33中的最後一個區塊(即,後方需要連接條件運算42「OR」)。據此,語法標記解析器可以基於上述資訊查詢語法標記對應表,以取得目的程式語言對於條件運算42「OR」的語法標記,並將此語法標記記錄於此一般區塊31的節點暫存器中。
於第二巡訪區塊12巡訪完畢後(包含分支區塊33本身以及內部包含的所有區塊),語法標記解析器接著取得來源程式片段1中的第一巡訪區塊11。
接著,語法標記解析器可判斷第一巡訪區塊11為一般區塊31,並且判斷此一般區塊31包含了條件物件「D」、此一般區塊31並非為上層的連續區塊32中的最後一個區塊(即,後方需要連接42條件運算「AND」)、並且此一般區塊31為連續條件區塊中的第一個區塊(即,前方需要連接條件陳述41「IF」)。據此,語法標記解析器可以基於上述資訊查詢語法標記對應表,以取得目的程式語言對於條件運算42「AND」以及條件陳述41「IF」的語法標記,並將此語法標記記錄於此一般區塊31的節點暫存器中。
據此,語法標記解析器即完成了來源程式片段1中的所有區塊的巡訪動作,並且為所有區塊分別產生了相對於目的程式語言的語法標記。
值得一提的是,無論來源程式語言是圖形程式語言或文字程式語言、目的程式語言是圖形程式語言或文字程式語言、語法標記解析器採用正向遞迴或反向遞迴,本發明的語法標記解析器都可採用與上述相同的邏輯來對來源程式片段1中的多個區塊進行巡訪動作,下面將不再加以贅述。
如前文所述,本發明中語法標記解析器主要是對來源程式片段1所對應的抽象語法樹5進行遞迴巡訪,因此於圖6的實施例中,語法標記解析器在巡訪結束後會將所產生的語法標記分別記錄在第一節點(條件物件「D」)21、第二節點(分支區塊33)22、第三節點(條件物件「A」)23、第四節點(條件物件「B」)24以及第五節點(結尾物件「Out」)25的節點暫存器中。藉此,於前述圖5的步驟S27中,語意組合器可以基於這些節點21-25的節點暫存器中記錄的資訊,將各
個區塊的物件內容以及語法標記組合成目的程式片段2,並於組合完成後逕行輸出。
續請同時參閱圖6、圖9A及圖9B,其中圖9A與圖9B為本發明的語意組合的第一流程圖及第二流程圖的第一具體實施例,用以具體說明本發明的語意組合器所執行的遞迴巡訪動作。
如圖9A與圖9B所示,於語法標記解析器完成了來源程式片段1中的所有區塊的語法標記後,本發明的優化方法由語意組合器對標記完成的來源程式片段1重新進行巡訪,並且取得來源程式片段1中尚未巡訪的一個區塊(步驟S60),並且判斷此區塊是否為分支區塊33(步驟S61)。若此區塊為分支區塊33,語意組合器進一步判斷此分支區塊33的內部是否已經巡訪完畢(步驟S62)。
於此分支區塊33的內部尚未巡訪完畢時,語意組合器先組合此分支區塊33的節點暫存器中記錄的物件內容以及語法標記,以產生一筆中間結果(步驟S63)。而若此分支區塊33的內部已經巡訪完畢,則語意組合器組合上一次巡訪動作所得的結果以及目前的中間結果,以對中間結果進行更新(步驟S64)。
並且,語意組合器進一步判斷此分支區塊33的節點暫存器中是否存在一個條件陳述41的語法標記(步驟S65),並且於條件陳述41存在時,進一步組合條件陳述41以及目前的中間結果,以對中間結果進行更新(步驟S66)。於步驟S66後,語意組合器即完成了一個分析區塊33的巡訪動作。
語意組合器取得來源程式片段1中的一個尚未巡訪的區塊後(步驟S60),還可判斷此區塊是否為連續區塊32(步驟S67)。若此區塊為連續區塊32,則語意組合器進一步判斷此連續區塊32的內部是否已經巡訪完畢(步驟S68)。
於此連續區塊32的內部尚未巡訪完畢時,語意組合器繼續進行此連續區塊32的內部其他區塊的巡訪動作。
於此連續區塊32的內部巡訪完畢時,語意組合器組合上一次巡訪動作所得的結果以及目前的中間結果,以對中間結果進行更新(步驟S69)。於步驟S69後,語意組合器即完成了一個連續區塊32的巡訪動作。
若語意組合器判斷於前述步驟S60中取得的區塊不是分支區塊33,也不是連續區塊32,則語意組合器判斷當前巡訪的區塊為一般區塊31。此時,語意組合器判斷此一般區塊31的節點暫存器中是否存在條件陳述41的語法標記(步驟S70)。若此節點暫存器中存在條件陳述41(例如IF、THEN等),則語意組合器組合此節點暫存器中記錄的物件內容以及條件陳述41,以對當前的中間內容進行更新(步驟S71)。
並且,語意組合器還判斷當前巡訪的一般區塊31的節點暫存器中是否存在條件運算42的語法標記(步驟S72)。若此節點暫存器中存在條件運算42(例如AND、OR、NOT等),則語意組合器組合此節點暫存器中記錄的物件內容以及條件運算42,以對當前的中間內容進行更新(步驟S73)。
並且,語意組合器還判斷當前巡訪的一般區塊31的節點暫存器中是否存在結尾陳述的語法標記(步驟S74)。具體地,所述結尾陳述為一般陳述43的其中一種態樣。若此節點暫存器中存在結尾陳述(例如OUT:=TRUE),則語意組合器組合上一次巡訪動作所得的結果、結尾陳述的內容以及目前的中間結果,以對中間內容進行更新(步驟S75)。
並且,語意組合器還判斷當前巡訪的一般區塊31的上層區塊是否為分支區塊33,並且判斷此一般區塊31是否為上層的分支區塊33中的最後一
個區塊(步驟S76)。若當前巡訪的一般區塊31為上層的分支區塊33中的最後一個區塊,則因為此一般區塊31的後方不需要添加條件運算42「OR」,因此語意組合器進一步於目前的中間結果中去除在上述步驟S73中冗餘添加的條件運算,以對當前的中間結果進行更新(步驟S77)。
於步驟S77後,語意組合器即完成了一個一般區塊31的巡訪動作。並且,於來源程式片段1中的所有區塊皆完成了巡訪動作後,語意組合器即可依據最後更新的中間結果來輸出目的程式片段2。
下列結合圖10、圖9A及圖9B來進行上述巡訪動作的具體說明,其中圖10為本發明的轉換示意圖的第一具體實施例。
如圖10所示,首先,語意組合器從來源程式片段1中取得第一巡訪區塊11,判斷第一巡訪區塊11為一般區塊31、此一般區塊31的節點暫存器中存在物件內容「D」、條件陳述41「IF」及條件運算42「AND」,因此語意組合器組合所述物件內容、條件陳述41以及條件運算42,更新中間結果為「IF D AND」,並且完成本次的巡訪動作。
接著,語意組合器從來源程式片段1中取得第二巡訪區塊12,判斷第二巡訪區塊12為分支區塊33,並且此分支區塊33的內部尚未巡訪完畢。因此,語意組合器先於分支區塊33的節點暫存器中取得分支區塊33的物件內容(即,尚未巡訪的區塊)以及語法標記(本實施例中為條件運算42「OR」),並且組合此物件內容與語法標記以更新中間結果為「_OR_」。
接著,語意組合器巡訪此分支區塊33內部的第一個區塊,判斷此區塊為一般區塊31,並且此一般區塊31的節點暫存器中存在物件內容「A」以
及條件運算42「OR」。因此,語意組合器組合所述物件內容以及條件運算42,更新中間結果為「A OR」,並且完成本次的巡訪動作。
接著,語意組合器巡訪分支區塊33內部的第二個區塊,判斷此區塊為一般區塊31,並且此一般區塊31的節點暫存器中存在物件內容「B」、條件運算42「NOT」以及條件運算42「OR」。因此,語意組合器組合所述物件內容以及條件運算42,更新中間結果為「A OR NOT B OR」。並且,語意組合器判斷此一般區塊31為上層的分支區塊33中的最後一個區塊,因此進一步從中間結果中去除冗餘的條件運算42「OR」,以更新中間結果為「A OR NOT B」,並且完成本次的巡訪動作。
值得一提的是,於圖10的實施例中,目的程式片段2採用的是結構化文字程式語言,因此語意組合器會進一步為所述中間結果加上括號,形成「(A OR NOT B)」的結果。
此時,語意組合器完成了第二巡訪區塊12(即,分支區塊33)內部的所有區塊的巡訪動作,因此將上一次巡訪動作的記錄(即,「IF D AND」)與當前的中間結果(即,「(A OR NOT B)」)進行組合,以將中間結果更新為「IF D AND(A OR NOT B)」。並且,由於第二巡訪區塊12的節點暫存器中還存在條件陳述41「THEN」,因此語意組合器進一步將此條件陳述41與當前的中間結果進行組合,以更新中間結果為「IF D AND(A OR NOT B)THEN」。
於第二巡訪區塊12本身以及內部的複數區塊皆巡訪完畢後,語意組合器進一步從來源程式片段1取得第三巡訪區塊13,判斷第三巡訪區塊13為一般區塊31,並且此一般區塊31的節點暫存器中存在結尾物件「Out:=TRUE」。
因此,語意組合器組合上一巡訪動作所得的記錄(即,「IF D AND(A OR NOT B)THEN」)與當前的中間結果,以更新中間結果為:IF D AND(A OR NOT B)THEN Out:=TRUE;並且,語意組合器判斷此一般區塊31的節點暫存器中還包括有條件陳述41「END_IF」,因此語意組合器還會組合此條件陳述41以及當前的中間結果,以更新中間結果為:IF D AND(A OR NOT B)THEN Out:=TRUE;END_IF;於此,語意組合器可完成本次的巡訪動作。
如上所述,本發明的優化方法通過語法標記解析器對來源程式片段1中的各個區塊分別進行語法的對應以及標記,並且通過語意組合器將轉換且標記完成的各個區塊的語意進行組合。藉此,可將來源程式片段1轉換成符合目的程式語言的架構的目的程式片段2。並且,上述係以將以圖形程式語言架構(階梯圖程式語言)編寫而成的程式片段轉換為符合文字程式語言架構(結構化文字程式語言)的程式片段為例,舉例說明,然而通過本發明的優化方法,實可將程式片段於各式不同的程式語言之間任意進行轉換。
請參閱圖11,為不同程式語言的轉換示意圖。如圖11所示,其中,範例(1)為符合階梯圖程式語言的架構的程式片段,範例(2)為符合功能塊圖程式語言的架構的程式片段,範例(3)為符合連續功能圖程式語言的架構的程式片段,範例(4)為符合結構化文字程式語言的架構的程式片段,範例(5)為符合
JAVA程式語言的架構的程式片段,範例(6)為符合Python程式語言的架構的程式片段。
本發明所屬技術領域中具有通常知識者皆可看出,上述範例(1)至範例(6)雖然分別屬於不同的程式語言架構,但是其中所顯示的程式片段皆具有同質性的語意。藉由本發明的上述優化方法,無論來源程式片段1是基於哪一種程式語言所編寫的,程式編輯者皆可直接將來源程式片段1轉換成符合另外一種程式語言的架構的目的程式片段2。藉此,程式編輯者不需要重新編寫程式,並且也不需要理解其他程式語言的撰寫方式與邏輯。
然而,雖然本發明通過語法標記解析器與語意組合器即可將來源程式片段1轉換為目的程式片段2,但本發明的技術方案主要是通過正規化的語法標記對應表來將一個語法於不同的程式語言之間進行轉換,因此有可能在轉換後產生較不恰當的目的程式片段2(例如行數過多,或是語法過於冗長)。因此,本發明進一步通過語意優化器來對所產生的目的程式片段2進行化簡動作。
參閱圖12,為本發明的優化流程圖的第一具體實施例。圖12用以具體說明本發明的語意優化器所執行的遞迴巡訪動作。
如圖12所示,於語意組合器產生了目的程式片段2後,本發明的優化方法通過語意優化器以遞迴方式取得目的程式片段2中的一或多個語意組合(步驟S80),並且判斷當前取得的一或多個語意組合是否具有符合代數恆等條件的兩個或兩個以上的區塊(步驟S81)。
若於步驟S81中判斷當前取得的語意組合中並不存在符合代數恆等條件的兩個或兩個以上的區塊,則語意優化器不執行任何化簡程序。於此情況下,語意優化器回到步驟S80,以於目的程式片段2中取得其他的語意組合。具
體地,本發明中指的語意組合,指的是同一網絡(或稱為階層)中的多個相鄰區塊所構成的語意組合,或是相鄰網路間的多個區塊所構成的語意組合。
若於步驟S81中判斷當前取得的語意組合中存在符合代數恆等條件的兩個或兩個以上的區塊,則語意優化器對符合代數恆等條件的兩個或兩個以上的區塊進行代數化簡程序(步驟S82),藉此對目的程式片段2中的一或多個語意組合進行更新。
本發明中,語意優化器是以遞迴的方式巡訪目的程式片段2中的所有語意組合,並且於所有語意組合都巡訪完畢後,結束等價置換程序的執行動作,並且將所述目的程式片段2轉換為優化後的目的程式片段。最後,程式語言編輯器可於程式編輯者所指定的位置上輸出優化後目的程式片段,以令程式編輯者直接使用。
值得一提的是,由於代數恆等的情況常常出現在相鄰的程式網絡之間(例如,將上一個網絡的輸出做為下一個網絡的輸入),因此,於一實施例中,本發明的語意優化器可以反向遞迴的方式來執行圖10所述的巡訪動作,但並不以此為限。
續請同時參閱圖13,為本發明的優化示意圖的第一具體實施例。圖13揭露了另一目的程式片段6,並且此目的程式片段6包含了第一網絡61、第二網絡62以及第三網絡63,其中各個網絡61-63分別由多個區塊組成。
於本實施例中,語意優化器若採用反向遞迴的方式巡訪此目的程式片段6中的一或多個語意組合,會發現第二網絡62的輸出(包含結尾物件「M2」的一般區塊)為第三網絡63的輸入(包含條件物件「M2」的一般區塊)。因此,語意優化器首先藉由德摩根定理(De Morgan`s laws)對第二網絡62與第三網絡63進
行化簡,並且產生圖13中所示的第四網絡64。所述德摩根定理為數學領域的通常知識,於此不再贅述。
由圖13可看出,將第二網絡62與第三網絡63化簡為第四網絡64後,包含了物件內容「M2」的一般區塊(或稱為節點)消失了。藉此,可以節省一個節點暫存器的使用,進而可節省PLC上的一個I/O點位的使用,同時可節省記憶體空間。
並且,當語意優化器取得下一個語意組合(例如圖13中第一網絡61與相鄰的第四網絡64的語意組合)後,會發現第一網絡61的輸出(包含了結尾物件「M1」的一般區塊)為第四網絡64的輸入(包含了條件物件「M1」的一般區塊)。於此實施例中,語意優化器可藉由結合律(Associate laws)對第一網絡61與第四網絡64進行化簡,並且產生圖13中所示的第五網絡65。所述結合律為數學領域的通常知識,於此不再贅述。
如圖13所示,優化前的目的程式片段6具有三組網絡(即,第一網絡61、第二網絡62及第三網絡63),這三組網絡61-63共包含了九個區塊(包括八個一般區塊及一個分支區塊)。相對的,優化後的目的程式片段僅具有一組網絡(即,第五網絡65),而這組第五網絡65僅包含了四個一般區塊。相較於優化前的目的程式片段6,優化後的目的程式片段總共節省了五個區塊的節點暫存器,對於程式的編輯與使用來說,實具有相當大的經濟效益。
續請同時參閱圖14A至圖14C,分別為本發明的優化流程圖的第二具體實施例、第三具體實施例與第四具體實施例。
於圖14A的實施例中,優化前目的程式片段71具有兩個網絡,其中下一個網絡的其中一個輸入區塊為上一個網絡的輸出區塊(即,包含結
尾物件「M1」的一般區塊)。於此實施例中,語意優化器於取得了對應的語意組合後,可通過結合律將兩個網絡結合成單一個網絡,並且輸出優化後目的程式片段72。
如圖14A所示,優化前目的程式片段71需使用八個節點暫存器(包含六個一般區塊及兩個分支區塊),而優化後目的程式片段72僅需使用五個節點暫存器(包含四個一般區塊及一個分支區塊)。由此可看出,優化後目的程式片段72與優化前目的程式片段71相比,節省了三個區塊的節點暫存器。
於圖14B的實施例中,優化前目的程式片段73於同一個網絡中使用了兩個包含條件物件「X」的一般區塊。於此實施例中,語意優化器於取得了對應的語意組合後,可通過分配律來對這個網絡進行化簡,並且輸出優化後目的程式片段74。
如圖14B所示,優化前目的程式片段73需使用六個節點暫存器(包含五個一般區塊及一個分支區塊),而優化後目的程式片段74僅需使用五個節點暫存器(包含四個一般區塊及一個分支區塊)。由此可看出,優化後目的程式片段74與優化前目的程式片段73相比,節省了一個區塊的節點暫存器。
於圖14C的實施例中,優化前目的程式片段75具有兩個網絡,其中下一個網絡的輸入區塊為上一個網絡的輸出區塊(即,包含結尾物件「M1」的一般區塊)。於此實施例中,語意優化器於取得了對應的語意組合後,可通過德摩根定理將兩個網絡結合成單一個網絡,並且輸出優化後目的程式片段76。
如圖14C所示,優化前目的程式片段75需使用六個節點暫存器(包含五個一般區塊及一個分支區塊),而優化後目的程式片段76僅需使用三個
節點暫存器(包含三個一般區塊)。由此可看出,優化後目的程式片段76與優化前目的程式片段75相比,節省了三個區塊的節點暫存器。
除了上述所述的代數恆等式之外,本發明的語意優化器還可通過其他的化簡方式來產生優化後目的程式片段,例如自補律、等冪性、補數性、同一性、消去性、曼諾圖等,而不以上述者為限。上述化簡方式皆為數學相關領域的常用技術手段,於此不再贅述。
通過本發明的技術方案,則產品韌體的編譯器僅需採用任意一種圖形或文字程式語言,即可通過上述優化方法來提供終端使用者其他程式語言的前端應用。如此一來,市面上各種不同的語言設計平台的終端產品皆可被視為是潛在的工控產品可編程邏輯控制的編譯載體。藉此,可以大幅降低工控產品的開發時間以及成本,同時降低不同學科背景的人士進行工業自動化中的程式設計領域的門檻。
以上所述僅為本發明之較佳具體實例,非因此即侷限本發明之專利範圍,故舉凡運用本發明內容所為之等效變化,均同理皆包含於本發明之範圍內,合予陳明。
S21~S31:轉換及優化步驟
Claims (11)
- 一種將程式碼於不同程式語言間進行轉換及優化的方法,應用於一程式語言編輯器,包括:a)取得基於一來源程式語言所編寫的一程式片段,其中該來源程式語言為圖形程式語言或文字程式語言;b)取得該程式片段對應的一抽象語法樹(Abstract Syntax Tree,AST),其中該抽象語法樹包括多個區塊,該多個區塊包括一分支區塊、一連續區塊或一般區塊,該分支區塊包括至少兩個並聯的區塊,該連續區塊包括至少兩個串聯的區塊,該一般區塊記錄一條件物件、一功能物件或一結尾物件,並且各該區塊分別對應一個節點暫存器,各該區塊的該物件內容及該語法標記記錄於該節點暫存器中;c)通過一語法標記解析器執行一遞迴巡訪動作來巡訪該抽象語法樹的該多個區塊的其中之一;d)依據該被巡訪的區塊的一物件內容及與相鄰區塊的連接關係查詢一語法標記對應表,以產生對應至一目的程式語言的一語法標記,其中該語法標記對應表記錄該來源程式語言的複數語法與該目的程式語言的複數語法間的一對應關係,該語法標記記錄該被巡訪的區塊的該物件內容及與相鄰區塊的連接關係在該目的程式語言中應具備的表達方式,該目的程式語言為圖形程式語言或文字程式語言;e)於該多個區塊皆被該語法標記解析器巡訪並且產生該語法標記前,重覆執行該步驟c及該步驟d,其中當該多個區塊包括該一般區塊並且該一般區塊具有用來指出一結尾陳述的該結尾物件時,通過該步驟c及該步驟d執行一第二次遞迴巡訪動作,並且於該第二次遞迴巡訪動作中基於各該區塊的該物件內容、與 相鄰區塊間的該連接關係以及後方的所有該結尾陳述來產生該目的程式語言的該語法標記;f)於該多個區塊皆被該語法標記解析器巡訪後,通過一語意組合器巡訪該抽象語法樹中的該多個區塊的其中之一;g)將該被巡訪的區塊的該物件內容及該語法標記與上一個被巡訪的區塊的該物件內容及該語法標記進行組合以產生一中間結果;h)於該多個區塊皆被該語意組合器巡訪前,重覆執行該步驟f及該步驟g以更新該中間結果;i)於該多個區塊皆被該語意組合器巡訪後,依據更新後的該中間結果產生一目的程式片段,其中該目的程式片段符合該目的程式語言的架構;j)通過一語意優化器巡訪該目的程式片段中的一或多個語意組合,並且於該一或多個語意組合符合一條件等式時執行一等價置換程序並產生一優化後目的程式片段;及k)於該程式語言編輯器上輸出該優化後目的程式片段。
- 如請求項1所述的方法,其中該程式語言編輯器包括採用該來源程式語言編寫該程式片段的一第一程式語言編輯器及採用該目的程式語言開啟一專案的一第二程式語言編輯器,該步驟a)係於該第一程式語言編輯器對該程式片段執行一複製功能或一剪下功能時被執行,並更包括一步驟a1):當該第二程式語言編輯器執行一貼上功能時偵測該專案所採用的該目的程式語言,自動基於該目的程式語言執行該步驟b)至該步驟k),並且再將該優化後目的程式片段貼上至該專案中。
- 如請求項1所述的方法,其中該步驟c於該來源程式語言為文字程式語言時,以一正向遞迴方式巡訪該抽象語法樹中的該多個區塊,並於該來源程式語言為圖形程式語言時,以一反向遞迴方式巡訪該抽象語法樹中的該多個區塊。
- 如請求項1所述的方法,其中該步驟d包括下列步驟:d11)於當前巡訪的該區塊為該分支區塊,並且該分支區塊為上層區塊中最後一個具有條件執行的區塊時,依據該分支區塊與相鄰區塊的連接關係取得對應的一條件陳述,依據該條件陳述查詢該語法標記對應表以取得對應至該目的程式語言的該條件陳述的該語法標記,並將該語法標記記錄於該分支區塊的該節點暫存器中;及d12)於當前巡訪的該區塊為該分支區塊時,依據一OR條件運算查詢該語法標記對應表以取得對應至該目的程式語言的該OR條件運算的該語法標記,並將該語法標記記錄於該分支區塊的該節點暫存器中。
- 如請求項4所述的方法,其中該步驟d更一步驟d21):於當前巡訪的該區塊為該連續區塊,且該連續區塊為上層區塊中最後一個具有條件執行的區塊時,依據該連續區塊與相鄰區塊的連接關係取得對應的該條件陳述,依據該條件陳述查詢該語法標記對應表以取得對應至該目的程式語言的該條件陳述的該語法標記,並將該語法標記記錄於該連續區塊的該節點暫存器中。
- 如請求項5所述的方法,其中該步驟d更包括下列步驟:d31)於當前巡訪的該區塊為該一般區塊、該一般區塊的該物件內容包含一條件物件,且該條件物件為連續條件物件中的第一個條件物件或最後一個條件物 件時,依據該一般區塊與相鄰區塊的連接關係取得對應的該條件陳述,依據該條件陳述查詢該語法標記對應表以取得對應至該目的程式語言的該條件陳述的該語法標記,並將該語法標記記錄於包含該條件物件的該一般區塊的該節點暫存器中;d32)於當前巡訪的該區塊為該一般區塊時,依據該一般區塊與相鄰區塊的連接關係取得對應的一條件運算,依據該條件運算查詢該語法標記對應表以取得對應至該目的程式語言的該條件運算的該語法標記,並將該語法標記記錄於包含該條件物件的該一般區塊的該節點暫存器中;d4)於當前巡訪的該區塊為該一般區塊,且該一般區塊的該物件內容包含一功能物件時,依據該功能物件指出的一功能陳述查詢該語法標記對應表以取得對應至該目的程式語言的該功能陳述的該語法標記,並將該語法標記記錄於包含該功能物件的該一般區塊的該節點暫存器中;及d5)於當前巡訪的該區塊為該一般區塊,且該一般區塊的該物件內容包含一結尾物件時,依據該一般區塊與相鄰區塊的連接關係取得對應的該條件陳述,依據該結尾物件指出的一結尾陳述及該條件陳述查詢該語法標記對應表以取得對應至該目的程式語言的該結尾陳述及該條件陳述的該語法標記,並將該語法標記記錄於包含該結尾物件的該一般區塊的該節點暫存器中。
- 如請求項6所述的方法,其中該步驟c是以一反向遞迴方式巡訪該抽象語法樹中的該多個區塊,該步驟d11)同時帶入上一次巡訪動作所得的該結尾陳述的記錄;該步驟d32)同時帶入上一次巡訪動作所得的該結尾陳述的記錄;該步驟d還包括一步驟d22):於當前巡訪的該區塊為該連續區塊時,帶 入上一次巡訪動作所得的該結尾陳述的記錄;該步驟d5)將該結尾陳述的記錄帶入下一次的巡訪動作。
- 如請求項1所述的方法,其中該步驟g包括下列步驟:g11)於當前巡訪的該區塊為該分支區塊,且該分支區塊的內部尚未巡訪完畢時,組合該分支區塊的該節點暫存器中記錄的該物件內容及該語法標記,以產生該中間結果;g12)於當前巡訪的該區塊為該分支區塊,且該分支區塊的內部巡訪完畢時,組合上一個巡訪動作所得的結果與當前的該中間結果,以對該中間結果進行更新;及g13)於當前巡訪的該區塊為該分支區塊,且該分支區塊的該節點暫存器中存在該條件陳述時,組合該條件陳述與當前的該中間結果,以對該中間結果進行更新。
- 如請求項8所述的方法,其中該步驟g包括一步驟g21):於當前巡訪的該區塊為該連續區塊,且該連續區塊的內部巡訪完畢時,組合上一個巡訪動作所得的結果與當前的該中間結果,以對該中間結果進行更新。
- 如請求項9所述的方法,其中該步驟g包括下列步驟:g31)於判斷當前巡訪的該區塊為該一般區塊,且該一般區塊的該節點暫存器中存在該條件陳述時,組合該節點暫存器中記錄的該物件內容及該條件陳述,以對該中間結果進行更新; g32)於判斷當前巡訪的該區塊為該一般區塊,且該一般區塊的該節點暫存器中存在該條件運算時,組合該節點暫存器中記錄的該物件內容及該條件運算,以對該中間結果進行更新;g33)於判斷當前巡訪的該區塊為該一般區塊,且該一般區塊的該節點暫存器中存在該結尾陳述時,組合上一個巡訪動作所得的結果、該結尾陳述的內容以及當前的該中間結果,以對該中間結果進行更新;及g34)於判斷當前巡訪的該區塊為該一般區塊,該一般區塊的上層為該分支區塊,並且該一般區塊為該分支區塊中的最後一個一般區塊時,去除該步驟g32)冗餘添加的該條件運算,以對該中間結果進行更新。
- 如請求項1所述的方法,其中該步驟j包括下列步驟:j1)取得該目的程式片段中的一或多組該語意組合;j2)對符合代數恆等的兩個或兩個以上的該區塊進行一代數代簡程序,以更新該一或多個語意組合;j3)於該目的程式片段中所有相鄰的該語意組合皆判斷完畢前重覆執行該步驟j1至該步驟j2;及j4)於該目的程式片段中所有相鄰的該語意組合皆判斷完畢後,停止該等價置換程序並產生該優化後目的程式片段。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
TW110112070A TWI801836B (zh) | 2021-04-01 | 2021-04-01 | 將程式碼於不同程式語言間進行轉換及優化的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
TW110112070A TWI801836B (zh) | 2021-04-01 | 2021-04-01 | 將程式碼於不同程式語言間進行轉換及優化的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
TW202240377A TW202240377A (zh) | 2022-10-16 |
TWI801836B true TWI801836B (zh) | 2023-05-11 |
Family
ID=85460441
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
TW110112070A TWI801836B (zh) | 2021-04-01 | 2021-04-01 | 將程式碼於不同程式語言間進行轉換及優化的方法 |
Country Status (1)
Country | Link |
---|---|
TW (1) | TWI801836B (zh) |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110471666A (zh) * | 2019-07-18 | 2019-11-19 | 五八有限公司 | 代码自动转换方法和装置、代码转换器及介质 |
CN111209004A (zh) * | 2019-12-30 | 2020-05-29 | 北京健康之家科技有限公司 | 代码转换方法及装置 |
CN111708539A (zh) * | 2020-06-17 | 2020-09-25 | 腾讯科技(深圳)有限公司 | 一种应用程序代码转换方法、装置、电子设备和存储介质 |
-
2021
- 2021-04-01 TW TW110112070A patent/TWI801836B/zh active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110471666A (zh) * | 2019-07-18 | 2019-11-19 | 五八有限公司 | 代码自动转换方法和装置、代码转换器及介质 |
CN111209004A (zh) * | 2019-12-30 | 2020-05-29 | 北京健康之家科技有限公司 | 代码转换方法及装置 |
CN111708539A (zh) * | 2020-06-17 | 2020-09-25 | 腾讯科技(深圳)有限公司 | 一种应用程序代码转换方法、装置、电子设备和存储介质 |
Also Published As
Publication number | Publication date |
---|---|
TW202240377A (zh) | 2022-10-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110187885B (zh) | 一种量子程序编译的中间代码生成方法及装置 | |
US9298437B2 (en) | Unrolling quantifications to control in-degree and/or out-degree of automaton | |
US9916145B2 (en) | Utilizing special purpose elements to implement a FSM | |
CN100465895C (zh) | 编译器、编译方法 | |
CN110471666A (zh) | 代码自动转换方法和装置、代码转换器及介质 | |
JPS6375835A (ja) | 目的コ−ド、プログラム・リスト及び設計文書を生成する装置 | |
CN102508654B (zh) | 嵌入式可编程控制器的梯形图编辑器设计方法 | |
CN104239115A (zh) | 一种plc编程语言的编译方法 | |
CN109491658A (zh) | 计算机可执行代码数据的生成方法及装置 | |
CN113722218B (zh) | 一种基于编译器中间表示的软件缺陷预测模型构建方法 | |
CN108228187B (zh) | 一种数值程序的全局优化方法 | |
CN113508385B (zh) | 使用子例程图谱进行形式语言处理的方法和系统 | |
CN115033896B (zh) | 以太坊智能合约漏洞检测方法、装置、系统与介质 | |
CN102999318A (zh) | 辅助编程的方法及装置 | |
CN113987405A (zh) | 一种基于ast的数学表达式计算算法 | |
CN102929853B (zh) | 基于Excel表单关联的DCS项目数据生成系统和方法 | |
TWI801836B (zh) | 將程式碼於不同程式語言間進行轉換及優化的方法 | |
CN112527304B (zh) | 基于异构平台的自适应节点融合编译优化方法 | |
US20090064092A1 (en) | Visual programming language optimization | |
Şerbănuţă et al. | A Truly Concurrent Semantics for the Framework Based on Graph Transformations | |
US11762363B2 (en) | Graph display device, graph display method, and recording medium | |
CN115167860A (zh) | 将程序码于不同程序语言间进行转换及优化的方法 | |
CN116414396A (zh) | 一种llvm的目标定义文件生成方法、装置和电子设备 | |
Pavlovskyi et al. | Template-based generation of plc software from plant models using graph representation | |
Minas et al. | Specifying and implementing visual process modeling languages with DiaGen |