本文地址:http://www.cnblogs.com/archimedes/p/pl0-compiler1.html,轉載請注明源地址。
以下內容摘自維基:
PL/0,is similar to but much simpler than the general-purpose programming language Pascal, intended as an educational programming language. It serves as an example of how to construct a compiler. It was originally introduced in the book, Algorithms + Data Structures = Programs, by Niklaus Wirth in 1975. It features quite limited language constructs: there are no real numbers, very few basic arithmetic operations and no control-flow constructs other than "if" and "while" blocks. While these limitations make writing real applications in this language impractical, it helps the compiler remain compact and simple.
翻譯如下:
PL/0語言,作為一個教育用的編程語言,和通用編程語言Pascal有些類似但是要簡單得多。作為如何構建一個編譯器的一個例子。它最初是出自Niklaus Wirth於1975年寫的《算法+數據結構=程序》一書中。它具有非常有限的語言構造:沒有實數,只有很少量的基本算術運算,除了"if"和"while"語句塊以外沒有其他的控制流。雖然這些限制使這種語言在實際應用中受到限制,但它卻有助於編譯器保持緊湊和簡單。
PL/0語言是PASCAL語言的子集
同PASCAL
作用域規則(內層可引用包圍它的外層定義的標識符),上下文約束,過程可嵌套定義,可遞歸調用
子集
數據類型,只有整型
數據結構 ,只有簡變和常數
數字最多為14位
標識符的有效長度是10
語句種類
過程最多可嵌套三層
從上面的敘述可以看出,熟悉PL/0的相關指令,並能用其他語言(我選擇C語言)來寫一個簡單的解釋器,在某種程度上掌握一些編譯器的原理,提高自身的編程能力
舉幾個實例更加的直觀:
1、計算最大公約數
var m, n, r, q; { 計算m和n的最大公約數 } procedure gcd; begin while r#0 do begin q := m / n; r := m - q * n; m := n; n := r; end end; begin read(m); read(n); { 為了方便,規定m >= n } if m < n then begin r := m; m := n; n := r; end; begin r:=1; call gcd; write(m); end; end.
2、計算 sum = 1! + 2 ! + ... + n! (n從控制台讀入)
var n, m, fact, sum; { 遞歸計算 fact = m! } procedure factorial; begin if m > 0 then begin fact := fact * m; m := m - 1; call factorial; end; end; begin {讀入n } read(n); sum := 0; while n > 0 do begin m := n; fact := 1; call factorial; sum := sum + fact; n := n - 1; end; {輸出n! } write(sum); end.
對於上面的代碼,熟悉Pascal語言的同學應該很熟悉,沒錯,pl/0就是簡化版本的pascal,為了降低設計編譯程序的難度而故意為之專供教學用的。