河南開封科技傳媒學院 劉洋 李冉 白德華
現(xiàn)階段嵌入式微控制其開發(fā)工具在具體的應(yīng)用過程中通常情況下存在開發(fā)流程相對較為繁瑣,并且功能方面較為單一,同時價格方面相對較高。所以展開對嵌入式設(shè)備的使用的編譯器還有集成開發(fā)環(huán)境的有效研究,通過采用Python嵌入式開發(fā)工具的設(shè)計與實現(xiàn)從而一定程度降低嵌入式設(shè)備開發(fā)階段的成本同時改變開發(fā)工具的單一問題。
嵌入式設(shè)備的開發(fā)通常情況下是圍繞著嵌入式微控制器還有相關(guān)外部設(shè)備進行設(shè)計與開發(fā)的。相較于普通類型的臺式計算機的處理器,嵌入式微控制器成本相對較低,然而嵌入式微控制器的開發(fā)研究成本相對較高。
編譯器的開發(fā)過程相對較為復(fù)雜,其在開發(fā)的過程中需要經(jīng)過詞法以及語法還有語義的有效分析同時還需要進行代碼的生成等相關(guān)環(huán)節(jié)。原始代碼需要通過采用語法分析器編程展開逐個的標識,然后通過語法分析器進行抽象語法樹的構(gòu)建,語義分析器展開對抽象語法樹的遍歷,處理完以上工作以后還需要借助代碼生成器實現(xiàn)對代碼的有效合理轉(zhuǎn)化。在進行語法分析的過程中通常情況下所采用的為不確定有窮自動機到確定有窮自動機的轉(zhuǎn)換以此展開對詞法分析器的有效建設(shè)。對于語法分析來講其主要涉及到兩大類型的算法,自頂向下與自底向上兩種。自頂向下類型的算法通常情況下在手工構(gòu)造編譯器內(nèi)進行應(yīng)用,然而自底向上的算法大多數(shù)會采用第三方的解析器進行編譯器的建設(shè)。
在進行對編譯器的構(gòu)建過程中相對較為復(fù)雜,編譯器工具的采用能夠極大程度上降低工作的發(fā)在程度,以此使得開發(fā)人員能夠更加專注于進行語言編程設(shè)計上。經(jīng)常使用的編譯器構(gòu)建工具主要有Lex和Yacc以及Ply還有Spark等。盡管Lex與Yacc等編譯器構(gòu)建工具能夠一定程度上實現(xiàn)編譯器開發(fā)的有效簡化,然而由于其在應(yīng)用的過程中主要是其所采用的語法為獨立語法從而使得開發(fā)人員需要進行語法的學習以此使得其復(fù)雜程度提高。DE編程通過采用Python語言進行編譯器的構(gòu)建,相較于其他類型的編譯器來講,更加靈活方便同時代碼也相對較為容易展開有效地測試與維護。在展開對詞法以及語法的解析過程中,采用Python語言的Ply模塊一方面能夠有效保留Python的特性,另一方面還能夠使其保持與Lex以及Yacc語法風格方面的一致性。并且,由于Ply主要是采用Lalr語法分析算法的,因此能夠有效確保其性能以及語法特性上的均衡性。
DE語言詞法分析部分采用Python語言的Ply模板進行構(gòu)建的,通過此種方式能夠一定程度上確保詞法分析器的跨平臺以及可擴展性。采用Ply模塊進行詞法分析的過程中,需要對代碼內(nèi)的詞組注意解析成為一個個標識。Ply模塊在標識解析的過程中需要對所有標識的定義還有名稱予以對應(yīng)同時還需要以“t”開頭。并且采用Python語言其具有一定的自省特性,能夠通過文檔字符串的定義實現(xiàn)對各個標識的定義。其能夠直接對簡單節(jié)點通過正則表達式展開定義,然而針對關(guān)鍵字等方面的定義需要采用額外定義獨立的函數(shù)同時還需要輔助字符串實現(xiàn)定義。DE語言的標識主要采用Python語言自帶的集合數(shù)據(jù)結(jié)構(gòu)進行存儲,但是關(guān)鍵字通常情況下是采用Python語言自帶的字典數(shù)據(jù)結(jié)構(gòu)實現(xiàn)存儲。
在處理完詞法分析以后,所輸入的代碼將會被解析成為逐個的標識進行存儲,從而方便后續(xù)工作中對于語法方面的分析識別應(yīng)用。DE語言的語法分析也是采用的Ply模塊,采用Lalr進行部分改模塊語法分析,通過此種方式確保語法分析的高效。采用Ply模塊展開對語法的分析過程中,應(yīng)當對各個標識定義還有其名稱相對應(yīng)的以“P”開頭的方法。在展開具體的語法分析過程中,Ply模塊的終結(jié)符必須采用大寫字母,非終結(jié)符則采用小寫字母。在采用Ply模塊展開語法分析的過程中,需要為各個標識節(jié)點進行一個類的定義,在展開語法接卸的過程中,Ply將會自動地把構(gòu)造的實例實現(xiàn)有效地拼接從而實現(xiàn)抽象語法樹的構(gòu)建。
借助Python語言自省的特性還有訪問者的模式能夠相對有效實現(xiàn)自定類型語法樹的遍歷,并且需要采用每個的描述節(jié)點的類均擁有統(tǒng)一的遍歷用的接口。此處各個描述節(jié)點的類均繼承了Node的類,借助此類的Accept方法實現(xiàn)對其子節(jié)點的遍歷。但是擁有容器功能的類需要繼承自ListNode類。在具體的編碼中Node類所擁有的Accept方法能夠借助Python自省功能進行對訪問者實例內(nèi)的節(jié)點名稱的有效查找,同時能夠進行對以“Visit”為前綴的調(diào)用,對應(yīng)節(jié)點名為后綴的方法。
為了使得驗證DE語言編譯器設(shè)計便捷化,采用Python語言進行軟件仿真驗證用虛擬機的構(gòu)建,因為虛擬機是采用Python語言完成的,因此其中的對象能夠采用Python的動態(tài)特性,在進行虛擬機仿真的過程中能夠采用Python語言內(nèi)的大數(shù)類型,但是不需要考慮與大數(shù)相關(guān)的問題。并且堆棧的狀態(tài)下,各條指令的執(zhí)行時間觀測與模擬相對較為方便。
OOC框架主要是采用元標稱技巧還有現(xiàn)代C編譯器的宏的特性,展開對C語言展開有效地擴展,其在形式上與C++相同并且實現(xiàn)了對面型對象思想中多態(tài)的模擬,具有單根繼承特性。一方面使得維護性與可重用性得到了一定程度的提升,另一方面還實現(xiàn)了原生面向?qū)ο蟠a向C語言移植環(huán)節(jié)的有效簡化。OOC框架通過把對象模型還有類型系統(tǒng)的設(shè)計進行有效地分離從而實現(xiàn)功能與易用性間的平衡,從而使其側(cè)重于對象模型設(shè)計與實現(xiàn)的簡化。針對OOC框架內(nèi)的對象模型主要是綜合利用了元編程技巧還有現(xiàn)代C編譯器的特性,以此實現(xiàn)了開發(fā)的簡化,確保且應(yīng)用方便程度,并且能夠?qū)τ行У哪M面向?qū)ο蟮幕咎匦浴OC對象模型通過把虛表結(jié)構(gòu)還有實例結(jié)構(gòu)的有效分離,進行對成員與方法的有效區(qū)分,實現(xiàn)內(nèi)存節(jié)約的作用。同時在虛表結(jié)構(gòu)內(nèi)增添了一個成員展開對實例的計數(shù)。為了提高簡潔程度,OOC框架省去了C++模型內(nèi)與運行階段類型信息相關(guān)的結(jié)構(gòu),然而此方面對于面向?qū)ο髢?nèi)的封裝還有繼承以及多態(tài)特性的模擬不會造成影響。OOC框架主要是通過若干個模塊構(gòu)成的,其中較為關(guān)鍵的部分定義在OOCore模塊內(nèi)。采用OOBase模塊進行對其予以有效地擴展,從而使其能夠支持單根繼承還有虛表結(jié)構(gòu)。OOC框架內(nèi)的繼承關(guān)系每加深一級,均會在實例結(jié)構(gòu)的尾部多分配一個雙重泛型指針指向當前類型虛表結(jié)構(gòu),同時實例結(jié)構(gòu)頭部內(nèi)虛表指針指向的則是最后以及類型的虛表結(jié)構(gòu)。采用雙重泛型指針能夠確保在進行構(gòu)造以及析構(gòu)的過程中直接通過實例的構(gòu)造或者析構(gòu)函數(shù)進行對虛表結(jié)構(gòu)內(nèi)的實例計數(shù)用的成員進行有效地修改,并且如此設(shè)計避免了額外的全局變量的引入,通過此種方式提高了整體架構(gòu)的靈活性。通過在OOC框架內(nèi)進行調(diào)試層的添加從而使得程序的調(diào)試變得便捷,調(diào)試層能夠與GCC配合從而一起使用。在宏開關(guān)內(nèi)將調(diào)試選項打開同時把調(diào)試層進行一起編譯過程中,調(diào)試層能夠?qū)ew宏還有Delete宏內(nèi)所封裝的malloc函數(shù)以及free函數(shù)進行有效地替換,以此實現(xiàn)對內(nèi)存的有效分配以及進行記錄的釋放和輸出。將釋放的記錄輸出到相應(yīng)的文件內(nèi),同時利用相關(guān)工具進行函數(shù)調(diào)用關(guān)系圖表。
針對DB集成開發(fā)環(huán)境來講其在功能方面主要涉及到工程的管理以及外部程序的調(diào)用還有代碼的編輯等內(nèi)容。對于工程管理其直接采用文件目錄展開的管理,經(jīng)過對不同文件后綴進行類型的有效識別。代碼編輯器主要是采用的多窗體代碼編輯器,其主要是以QSintilla以及PyQty圖形庫為基礎(chǔ)進行開發(fā)的,其具有明顯的現(xiàn)代編輯器特性。在進行程序的調(diào)用過程中主要是借助Qt圖形庫內(nèi)QProcess模塊進行對外部程序的有效調(diào)用,以此實現(xiàn)了對代碼編譯以及下載功能的有效整合,并且還能夠把Shell進行有效地嵌入。
DB集成開發(fā)環(huán)境在開發(fā)過程中所采用的模式為自底至上的模式,并且工程管理其還有代碼編輯器主要部件在設(shè)計過程中使其能夠進行獨立運行,然后通過主程序?qū)崿F(xiàn)對各部件的有效整合。在具體的整合環(huán)節(jié)涉及到各部件之間相應(yīng)消息的傳遞。進行消息的傳遞主要是借助Qt庫內(nèi)的信號以及槽的機制。在Qt框架內(nèi),各個信號均能夠與所有事件進行綁定,同時能夠?qū)嶋H情況進行動態(tài)情況下的綁定解除或者進行過濾器的有效添加展開屏蔽。
針對DB集成開發(fā)環(huán)境來講由于其屬于集成開發(fā)環(huán)境,需要進行項目工程的管理,其能夠通過直接使用文件展開對工程的管理。DB集成開發(fā)環(huán)境有效擴展了QFileSystemModel類,同時采用QTreeView類通過樹狀控件的形式予以顯示。針對DB集成開發(fā)環(huán)境中C語言還有DE語言等代碼編輯器主要是借助QScintilla模塊。對于Scintilla編輯器來講其適用于Python的綁定。其功能主要涉及到語法樣式高亮以及錯誤提示還有自動補全等功能,同時其還能夠支持多樣式功能。此模塊通過與Python語言的有效結(jié)合從而一定程度上實現(xiàn)了開發(fā)流程的有效簡化。現(xiàn)階段的集成開發(fā)環(huán)境中通常會支持內(nèi)嵌Shell的功能,從而有助于其他應(yīng)用程序的調(diào)用,DE集成開發(fā)環(huán)境也具有該項功能。針對普通應(yīng)用,能夠直接采用Python的subprocess模塊便能夠進行外部程序的調(diào)用,然而針對集成開發(fā)環(huán)境下內(nèi)嵌的Shell工具,在實際的應(yīng)用過程中需要支持輸入命令可交互以及執(zhí)行程序無阻塞還有返回信息能夠被及時捕獲。因此,采用了Qt內(nèi)的QProcess類,其能夠?qū)崿F(xiàn)異步外部程序的調(diào)用,對于Qt界面的交互不會產(chǎn)生影響。通過設(shè)計一個名為Monitor的類從而實現(xiàn)DB集成開發(fā)環(huán)境的Shell,此類集成自QWidget類,主要涵蓋了QProcess類與QTextBrowser類的實例。在進行DB集成開發(fā)環(huán)境的嵌入環(huán)節(jié),在以此為條件進行名為Launcher類的設(shè)計,借助QTextBrowser部件能夠令DB集成開發(fā)環(huán)境實現(xiàn)同時多個Shell。為程序啟動器的類的繼承關(guān)系,采用程序啟動器在DB集成開發(fā)環(huán)境中進行“l(fā)s”命令的執(zhí)行。完成執(zhí)行以后則會返回至當前執(zhí)行定指令名稱還有調(diào)用程序返回定結(jié)果。采用該種方式,把需要的功能與圖形化定按鈕展開有效的綁定,以此提高文件操作的便捷性。
通過借助PyQt圖形庫還有QScintilla編輯器構(gòu)建工具進行嵌入式設(shè)備的圖像化集成開發(fā)環(huán)境DB的設(shè)計,進而展開對DE語言還有C語言的OOC框架的有效整合,從而提升開發(fā)的簡潔性。
基于Python的嵌入式開發(fā)工具的設(shè)計與實現(xiàn),能夠有效解決嵌入設(shè)備開發(fā)成本較高的問題以及開發(fā)工具單一性的情況。然而現(xiàn)階段該方面的設(shè)計存在一定的不足,在今后的研究過程中應(yīng)當注重功能的豐富以及簡潔性的提升,以此促進程序開發(fā)的有效發(fā)展。