目錄
編譯器描述語言
編輯編譯器描述語言(CDL)是一種基于詞綴語法的編程語言。它與Backus-Naur形式(BNF)符號非常相似。它是為開發編譯器而設計的。它的能力和控制流非常有限,而且是故意的。這些限制的好處是雙重的。一方面,它們使得CDL2優化器所使用的復雜的數據和控制流分析成為可能,從而產生了極其有效的代碼。另一個好處是,它們促進了一個高度冗長的命名慣例。這反過來又導致了程序在很大程度上是自我記錄的。這種語言看起來有點像Prolog(這并不奇怪,因為這兩種語言都是在差不多同一時間從詞綴語法的工作中產生的)。然而,與Prolog不同的是,CDL中的控制流是以成功/失敗為基礎的,也就是說,當當前的控制流成功時,不會嘗試其他的選擇。這種想法也被用于解析表達式語法。CDL3是CDL語言的第三個版本,與前兩個版本明顯不同。
編譯器描述語言的設計
編輯971年出現的原始版本由奈梅亨大學的CornelisH.A.Koster設計,它有一個相當不尋常的概念:它沒有核心。一個典型的編程語言源被翻譯成機器指令或這些指令的罐裝序列。這些代表了核心,即給定語言所支持的最基本的抽象概念。這種基元可以是數字的加法,將變量相互復制,等等。CDL1缺乏這樣一個核心。程序員有責任以一種可以通過匯編器或傳統語言的編譯器變成機器指令的形式來提供原始操作。CDL1語言本身沒有基元的概念,除了機器字(一個抽象的存儲單位--不一定是真正的機器字)之外,沒有數據類型的概念。評估規則與Backus-Naur形式的語法描述相當相似;事實上,為BNF描述的語言編寫解析器在CDL1中相當簡單。基本上,該語言由規則組成。一個規則既可以成功也可以失敗。一條規則由其他規則調用的序列的替代物組成。如果一個規則的任何一個替代物都成功了,那么這個規則就成功了;這些替代物被依次嘗試。如果一個替代品的所有規則調用都成功,那么它就成功了。該語言提供了操作符來創建沒有遞歸的評價循環(盡管這在CDL2中不是嚴格必要的,因為優化器達到了同樣的效果),并提供了一些捷徑來提高其他遞歸評價的效率,但基本概念如上。除了在上下文自由語法解析中的明顯應用外,CDL也很適合控制應用,因為很多控制應用本質上是深度嵌套的if-then規則。每條CDL1規則在被評估時,都可以作用于數據,這些數據的類型沒有被指定。理想情況下,除非規則成功,否則數據不應該被改變(失敗時沒有副作用)。這導致了一些問題,因為盡管這個規則可能會成功,但調用它的規則可能仍然會失敗,在這種情況下,數據的改變不應該生效。如果所有的數據都是在堆棧中動態分配的,那么保證上述行為是相當容易的(盡管是內存密集型)。然而,當有靜態數據時,這就相當困難了,而這種情況經常發生。CDL2編譯器能夠標記可能的違規行為,這要歸功于參數的方向(輸入、輸出、輸入-輸出)和規則的類型(可以失敗:測試、謂詞;不能失敗:函數、動作;可以有副作用:謂詞、動作;不能有副作用:測試、函數)必須由程序員指定。
由于規則的評估是基于調用越來越簡單的規則,在底部,應該有一些原始的規則來做實際的工作。這就是CDL1非常令人驚訝的地方:它沒有這些基元。你必須自己提供這些規則。如果你的程序中需要加法,你必須創建一個有兩個輸入參數和一個輸出參數的規則,輸出被你的代碼設置為兩個輸入之和。CDL編譯器將你的代碼作為字符串使用(對輸入和輸出變量的稱謂有約定俗成的方式),并根據需要簡單地將其排放出來。如果你用匯編來描述你的添加規則,你將需要一個匯編程序來把CDL編譯器的輸出翻譯成機器碼。如果你用Pascal或C語言描述所有的原始規則(CDL術語中的宏),那么你需要一個Pascal或C編譯器在CDL編譯器之后運行。當你要寫一段代碼時,即使是最簡單的機器指令操作,這種核心基元的缺乏也會讓你非常痛苦。
內容由匿名用戶提供,本內容不代表www.gelinmeiz.com立場,內容投訴舉報請聯系www.gelinmeiz.com客服。如若轉載,請注明出處:http://www.gelinmeiz.com/163820/