《領域特定語言》一1.5使用代碼生成

1.5使用代碼生成

在迄今為止的討論中,要處理DSL,組裝“語義模型”(第11章),然后執行語義模型,提供我們希望從控制器得到的行為。在語言圈子里,這種方式稱為解釋(interpretation)。在解釋文本時,會先解析文本,然后程序立刻產生結果。(在軟件圈子里,解釋是個棘手的詞語,它承載了太多含義,然而,這里嚴格限制為立即執行的形式。)
在語言領域里,與解釋相對的是編譯。在編譯(compilation)時,先解析程序文本,產生中間輸出,然后單獨處理輸出,提供預期行為。在DSL的上下文里,編譯方式通常指的是代碼生成(code generation)。
用狀態機解釋這個差異有點困難,因此,換用另外一個小例子。想象一下,有某種規則判定人們是否符合某種資格,也許是為了滿足保險資格。比如,如圖1-5所示,一個規則是年齡在21~40歲。這個規則可以是一個DSL,檢查像我這樣的候選人是否具備資格。
如果解釋,資格判定處理器會解析規則,在執行時加載語義模型,也許是啟動時加載。當檢查某個候選人時,它會對 這個候選人運行語義模型,獲得一個結果。
如圖1-6所示,在編譯的情況下,解析器會加載語義模型,把它當做資格-判定處理器構建過程的一部分。在構建期間,DSL處理器會產生一些代碼,這些代碼經過編譯、打包,并且納入資格判定處理器,也可能當做某種共享庫。然后,運行這段中間代碼,對候選人進行評估。

image

image

例子里的狀態機使用的是解釋:在運行時解析配置代碼,并組成語義模型。但其實也可以生成一些代碼,以免在烤面包機里出現解析器和模型代碼。
代碼生成通常很笨拙,因為它常常需要進行額外的編譯步驟。為了構建程序,首先需要編譯狀態框架和解析器,其次運行解析器,為格蘭特小姐的控制器生成源代碼,然后編譯生成的代碼。這樣做,構建過程就變得復雜許多。
然而,代碼生成的一個優勢在于,編寫解析器和生成代碼可以用不同的語言。在這個情況下,如果生成代碼用的是動態語言,比如JavaScript或是JRuby,第二個編譯步驟就可以省略。
如果所用DSL的語言平臺缺乏支持DSL的工具,代碼生成的作用也會凸顯出來。比如,我們不得不在一些老式的烤面包機上運行這個安全系統,而它們又只能理解編譯過的C,那我們可以這樣做,實現一個代碼生成器,使用組裝的語義模型作為輸入,產生可以編譯為運行在老式烤面包機的C代碼。在最近做的一些項目里,我們曾為MathCAD、SQL和 COBOL等生成代碼。
許多與DSL相關的作品都會關注代碼生成,更有甚者,把代碼生成當做這個活動的主要目標。隨之而來的就是,涌現了一大批文章和書籍,贊美代碼生成的優點。然而,在我看來,代碼生成僅僅是一種實現機制,實際上,大多數情況下 都用不到。當然,有很多情況必須要用代碼生成,但的確有很多情況確實用不到。
許多人用了代碼生成之后,就舍棄了語義模型,他們在解析輸入文本之后,就直接產生生成的代碼。雖然對于使用代碼生成的DSL而言,這也是一種常見的方式,但除非是最簡單的情況,否則不推薦任何人這么做。語義模型的存在,可以將解析、執行語義以及代碼生成分開。整個活動會因為這個劃分變得簡單許多。它也給了我們改變自己想法的機會; 比如,無須修改代碼生成的例程就可以把內部DSL改成外部DSL。類似地,可以很容易產生多種輸出,而無須擔心解析器變得復雜。就同一種語義模型而言,既可以用解釋模型,也可以選擇代碼生成。
因此,在本書的大部分內容里,假設存在一個語義模型,它是DSL工作的核心。
常見的代碼生成風格有兩種。第一種是“第一遍”代碼,這種代碼是一個模板,之后要手動修改。第二種是確保生成代碼絕對不需要手動修改,也許還要排除調試期間所加的追蹤信息。我幾乎總是傾向于后者,因為這樣可以更自由地重 新生成代碼。對DSL而言,這點尤其正確,因為我們希望對于DSL所定義的邏輯而言,它是主要的表現形式。這意味著,無論何時,要修改行為,必須能夠輕松修改DSL。因此,我們必須保證,任何生成的代碼都沒有經過手動編輯,雖然它可以調用手寫的代碼,或者由手寫的代碼調用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257862.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257862.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257862.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SVG 基礎圖形

SVG 基礎圖形 SVG包含了以下的基礎圖形元素&#xff1a; 矩形&#xff08;包括可選的圓角&#xff09;&#xff0c;使用<rect>元素創建圓形&#xff0c;使用<circle>元素創建橢圓形&#xff0c;使用<ellipse>元素創建直線&#xff0c;使用<line>元素創…

棗莊三中高考2021成績查詢,2021棗莊中考成績查詢系統入口

2021棗莊中考成績查詢系統入口2021-05-20 19:11:35文/王佳慧2021年&#xff0c;棗莊的中考時間快到了&#xff0c;本文分享了棗莊中考成績查詢入口&#xff0c;系統開通后考生可登陸查詢成績。棗莊中考成績查詢入口志愿填報須知1.錄取標準&#xff1a;提前批、第一批、第三批學…

移動端”宴席知多少

轉載(http://adt.aicai.com/index.php/archives/179/) 瞎折騰移動端的項目已經很長一段時間了&#xff0c;并不像其它企業一樣&#xff0c;可以有項目組去完成&#xff0c;基本都是一個人瞎嘗試&#xff0c;時而web&#xff0c;時而web app。恍恍惚惚過了這段歲月&#xff0c;也…

快速的取整方法(~~)

為什么80%的碼農都做不了架構師&#xff1f;>>> 最近看一篇js裝逼小技巧————雙波浪號的妙用(將內容轉化為數字,或者小數取整)&#xff0c;但是本身我的JavaScript水平比較低對其底層操作和其使用范圍不甚了解&#xff1b;通過翻閱資料現進行簡單的整理。 ###裝…

git log友好顯示

查看commit 提交日志 $ git log $git log --prettyoneline $git reflog 顯示所有提交記錄&#xff0c;包括已經回退的提交&#xff0c;如圖&#xff1a;提交了abc 和 bb 然后回退到 abc   $git log 只顯示abc提交 可以使用 $git reset --hard commit號 回退到bb git reflog…

jprofiler_windows-x64_9_1注冊碼

L-Larry_Lau163.com#5481-ucjn4a16rvd98#6038 L-Larry_Lau163.com#36573-fdkscp15axjj6#25257 轉載于:https://www.cnblogs.com/sprinng/p/5104507.html

南理工計算機技術專業學位,南京理工大學計算機技術(專業學位)考研難嗎

很多考生在準備南京理工大學計算機技術(專業學位)考研難嗎&#xff1f;是考研報考的時候都會產生這樣的疑問&#xff1a;這個專業的研究生好嗎&#xff1f;適合我嗎&#xff1f;對我以后的人生和職業會有幫助嗎&#xff1f;考生在準備南京理工大學計算機技術(專業學位)專業考研…

《分布式系統:概念與設計》一2.3.2 體系結構模式

2.3.2 體系結構模式 體系結構模式構建在上述討論過的相對原始的體系結構元素之上&#xff0c;提供組合的、重復出現的結構&#xff0c;這些結構在給定的環境中能運行良好。它們未必是完整的解決方案&#xff0c;但當與其他模式組合時&#xff0c;它們會更好地引導設計者給出一…

javascript sort()實現元素json對象的排序

看以下代碼&#xff1a; var s [ { name: "Robin Van PurseStrings", age: 30 } ,{ name: "Theo Walcott", age: 24 } ,{ name: "Bacary Sagna", age: 28 } ].sort(function(obj1, obj2) {// 實現增序排列&#xff1a;前者的 age 小于后者…

html5手機簽名,html5手寫簽名

var canvas, board;canvas document.getElementById(myCanvas);canvas.height 300;canvas.width 400;board canvas.getContext(2d);board.lineWidth 1; //設置畫筆粗細board.strokeStyle "#f00";board.lineJoin "round"; //設置畫筆軌跡基于圓點拼接…

調查:Java程序員最傷心,C++程序員最年老

說起我們對編程世界現有的刻板印象&#xff0c;你一定聽說過類似于沒有人喜歡用Java編碼或者使用C 都是老人家&#xff0c;等等這樣的話。為了分析這些刻板印象背后的真相&#xff0c;Trestle Technology的數據工程師寫了一個工具。 不知道你有沒有聽說過微軟的Project Oxford&…

mysql一些寫常用命令

參見pcttcnc2007博客騰飛 1.mysql的status信息命令: mysql> show global status; 2.可以列出mysql服務器運行各種狀態值&#xff0c;另外&#xff0c;查詢mysql服務器配置信息語句&#xff1a; mysql> show variables; 3.連接數 經 常會遇見”mysql: error 1040: too man…

計算機不小心刪除怎么找回桌面,如何將桌面上誤刪的文件找回

在如今工作電腦化的趨勢下&#xff0c;用戶都會在桌面上創建各種各樣的文件等&#xff0c;這些文件都是需要在工作中經常要進行各種操作的重要文件&#xff0c;那么頻繁的操作也會出現各種的意外情況等&#xff0c;如果不小心刪除了重要的文件該怎么恢復呢&#xff1f;想要恢復…

《編程原本 》一3.3 程序變換

3.3 程序變換 power0是有關算法的一個令人滿意的實現,它適用于運算的代價高于函數遞歸調用開銷的情況.本節要推導出一個迭代算法,它執行運算的次數和power0一樣.這里將要做一系列程序變換,這些變換也可以用在其他許多情況中.5 在本書后面的部分,通常將只給出算法的最終版本或幾…

Effective C++ .07 virtual析構函數的提供

主要講了&#xff0c; 1. virtual析構函數的作用與調用順序 2. 使用時機&#xff0c;并不是使用了繼承就要把基類的析構函數變為虛函數&#xff08;virtual&#xff09;&#xff0c;只有當用于多態目的時才進行一個virtual析構函數的定義。 3. 不要繼承那些沒有將析構函數定義為…

OnClickListener沖突的問題

OnClickListener沖突的問題 (2011-11-26 15:28:27) 轉載▼標簽&#xff1a; 雜談 分類&#xff1a; android學習記錄 import anfroid.view.View.OnClickListenerimport anfroid.content.DialogInterface.OnClickListener 這兩個東西要同時用的話&#xff0c;要使用以下方式&…

html 響應式 同一行,一行CSS實現各種響應式元素 – Fluidity

一行CSS實現各種響應式元素 – Fluidity3月 31, 2014評論SponsorFLUIDITY是一個極微小的CSS樣式表&#xff0c;壓縮版只有一行代碼&#xff0c;大小只有115個字節&#xff0c;它能實現圖像、文本、Canvas、Table表格以及iFrame框架的響應式功能。好用且實用&#xff01;這個響應…

玩C一定用得到的19款Java開源Web爬蟲

網絡爬蟲(又被稱為網頁蜘蛛&#xff0c;網絡機器人&#xff0c;在FOAF社區中間&#xff0c;更經常的稱為網頁追逐者)&#xff0c;是一種按照一定的規則&#xff0c;自動地抓取萬維網信息的程序或者腳本。另外一些不常使用的名字還有螞蟻、自動索引、模擬程序或者蠕蟲。 今天將為…

一元二次方程

轉載于:https://www.cnblogs.com/569114a/p/4179164.html

cookie html5,HTML5——存儲(cookie、localStorage、sessionStorage)的區別

cookie本來用于客戶端和服務端通信&#xff0c;但是因為它有本地存儲的功能&#xff0c;于是被“借用”了。使用方法document.cookie 獲取和修改即可缺點存儲量太少&#xff0c;只有4kb所有http請求都帶著&#xff0c;會影響獲取資源的效率。API簡單&#xff0c;需要封裝才能使…