zengl程式語言

zengl程式語言

編程是一門藝術,而程式語言則是這門藝術的締造者。計算機系的很多學生都對程式語言涉及到的編譯原理表示畏懼,其實編譯原理本身並不複雜,不過由於目前市面上有關編譯原理的書籍大部分都是由國外的原著翻譯過來的,翻譯過來的文字很多時候沒辦法完美的表達出原文的意思,所以有時候讓人感覺像天書,例如國外有名的 龍書(Dragon book),龍書是Alfred V. Aho等人於1986年出版的,雖然時隔了幾十年,不過裡面的編譯原理和算法卻相當經典,可惜大部分翻譯的質量都不過關,需要仔細研讀作者提供的原始碼再加上英文原著,才能夠領悟出編譯原理的奧妙。 不過作者提供的原始碼做出來的最終例子因為與別的程式語言相比過於簡單,可用性不強,再加上一堆的數學公式,很多人都放棄了研究,再加上目前國內.net,java,android之類的商業開發環境,很多程式設計師沒時間做開源項目,所以全世界那么多的程式語言就沒看到中國人開發的程式語言,可能有人會說有易語言,易語言確實是很難得的套用於實際開發的中國的程式語言,不過好像沒開源吧,商業的味道更濃點。 不過任何事情都不是絕對的,外國人能做到的,我們一樣可以做到,zengl開源網的站長根據龍書里的編譯原理,使用C語言開發出了一套開源的程式語言,名字叫zengl程式語言。

基本介紹

  • 中文名:程式語言
  • 外文名:zengl
  • 目的:揭開編譯原理的神秘面紗
  • 精神:開源
詳述
zengl程式語言創建的本意是為了讓人們能夠揭開編譯原理的神秘面紗。本著開源的精神,作者將該程式語言開發過程中的所有版本都公開出來,每個版本都有windows系統的用於vs2008的版本,以及linux系統下的包含makefile的原始碼,並且都有對應的測試腳本用於測試程式語言的實用性。
作者從編譯原理的詞法解析開始創建了第一個詞法掃描的版本,接著是抽象語法樹的生成等,在做出一個像樣的編譯器後,又接著做了一個解釋器(就像JAVA的虛擬機),用於解釋執行編譯器生成的中間代碼。作者拋開了龍書中的複雜的數學算法,利用簡潔的C語言和常用的條件,循環,函式等結構構建了一個簡單易懂的程式語言,並且在很多重要的代碼處做了注釋,每個版本都在網站中有個單獨的頁面,在其中有詳細的闡述,力求讓人們能更直觀的深入到程式語言的核心部分,最重要的是這些都是中文的,無需進行蹩腳的翻譯。
如果把zengl程式語言比作金字塔,那么其中的每個版本就是金字塔的台階,只要沿著台階一級一級的往上走,就可以領悟到編譯原理和程式語言的魅力,最終能夠開發出屬於自己的程式語言,就算不能開發出一個自己的程式語言,也能將編譯原理套用到其他項目中去。
作者使用zengl v1.0.5的版本開發了俄羅斯方塊遊戲:
在linux下按P鍵暫停時的截圖如下(linux下的kde截圖軟體像素不太高):
zengl程式語言
作者將zengl程式語言嵌入到一個採集器的產品(該採集器是專門針對Destoon B2B系統的)中,使用zengl動態腳本作為採集規則檔案,該採集器的界面如下:
zengl程式語言
該採集器的相關資料都在zengl開源網的zengl採集器欄目中。
zengl程式語言的作者為了進一步闡述該程式語言的實用性,在後面的版本中還開發了一個21點的撲克小遊戲。
下面是zengl程式語言使用SDL遊戲引擎開發的圖形版的21點撲克遊戲截圖:
zengl程式語言
下面是zengl利用SDL做的測試滑鼠捕獲事件的截圖:
zengl程式語言
下面是zengl程式語言使用SDL遊戲引擎開發的小遊戲的windows截圖(一個可以控制人物精靈四處移動的小遊戲):
zengl程式語言
下面是linux下的截圖:
zengl程式語言
下面是zengl程式語言里的if結構的語法樹截圖:
zengl程式語言
最後是《zengl程式語言 中序》的部分內容:
"我是一個程式猿,一天我坐在路邊一邊喝水一邊苦苦檢查bug,這時一個乞丐在我邊上坐下了,開始要飯,我覺得他可憐,就給了他一塊錢,然後接著調試程式。他可能生意不好,就無聊的看看我在乾什麼,然後過了一會,他幽幽說,這裡少了一個分號。"
這則笑話在網上廣為流傳,確實生動的體現了目前國內大部分程式設計師的生存現狀,每天辛辛苦苦的消耗腦細胞,有的因為長時間工作甚至獻出了寶貴的生命,到底是什麼造成了目前的局面,我想可能只有電視劇《天道》里的"文化屬性"可以解釋了。
傳統觀念的死結在於一個"靠"字,在家靠父母,出外靠朋友,靠親戚,靠別人,靠組織,就是不要靠自己。這種觀念根深蒂固,造成了目前國內沒有什麼優秀的軟體,沒有屬於國人的開源程式語言,沒有屬於國人的開源作業系統,沒有屬於國人的開源資料庫,沒有屬於國人的核心技術實力,在國內企業老闆的眼裡什麼都可以copy,什麼都可以仿照,在這樣的純粹的商業炒作的環境下,程式設計師慢慢的失去了精神上的寄託,做出來的軟體也僅僅是為了餬口飯吃,大量的重複性的軟體充 斥市場。
Linus Torvalds是芬蘭的驕傲,Linux則是全球成千上萬的程式設計師的思想和開源精神的結晶。國內的軟體行業缺少一種精神上的支柱,今天JAVA流行就學JAVA,明天Android流行,就轉行學Android,被老外牽著鼻子走,失去了自己精神上的主權和獨立。我們為什麼要聽命於別人,自己的命運應該把握在自己的手裡,編程是一門極富藝術和挑戰的科學,它具有極強的創造力,我們應該開闢屬於自己的"疆土",開發自己的程式語言,開發自己的作業系統,開發自己的資料庫,開創國內的真正的編程時代。
可能有人會說我很狂,我只想說,技術上的落後並不可怕,可怕的是不思進取,隨波逐流,可怕的是技術上的封閉,可怕的是純粹的商業炒作,最可怕的就是精神上 的麻木不仁,缺乏創造力。真正的創新不是單純的引入技術,更重要的是改進,創造出屬於自己的東西,創造出屬於自己的精神支柱。
我做zengl程式語言不為別的,除了在一定程度上揭示編譯原理外,更希望的是能有更多的人投入到開源軟體行業。
學Linux核心源碼需要從0.11開始研究,才能深入進去,如果一開始從linux 3.0.4研究,很容易就迷失在代碼的叢林中,出不來了。所以我將zengl程式語言的所有版本都發布出來,好讓大家能從最簡單的版本開始研究。在查看代 碼之前最好能將《龍書》看一遍,雖然龍書的很多算法很抽象,做出來的測試代碼功能過於簡單,但是確實是編譯原理入門的好教材。
Zengl程式語言附錄:
現在回顧一下zengl程式語言里目前已經支持的關鍵字:
1,print關鍵字:該關鍵字用來列印輸出語句,並且會自動在語句末尾輸出換行符。例如:
print 'hello world'; //列印hello world
2,if-elif-else-endif 條件選擇結構,例如:
if(a==b) //如果a等於b,則列印字元串a=b
print 'a=b';
elif(a>b) //如果a大於b,則列印a>b
print 'a>b';
else //其他情況下,列印a<b
print 'a<b';
endif

3,for....endfor 循環結構,例如:
for(i=0;i<3;i++) //循環列印出i值。
print 'i is ' + i;
endfor
4,fun....endfun 函式結構,例如:
fun test(a,b) //test函式,將a,b兩參數依次列印出來。
print a;
print b;
endfun
5,global關鍵字,在函式中引入全局變數,類似PHP中的global關鍵字。例如:
fun test()
global a; //引入a全局變數,並列印a
print a;
endfun
6,return 關鍵字,在函式中直接返回。例如:
fun test(a,b)
if(a>b) //如果a大於b則直接返回。
return;
endif
print a + b;
endfun
7,use關鍵字,在腳本中載入某模組,例如: use builtin; //載入builtin內建模組,use通常用在開頭。
8,break關鍵字,在for,switch,while,dowhile中用於跳出結構用的,用法和PHP以及C中的break一樣。
9,continue關鍵字,在for,while,dowhile循環中跳過後面的語句不執行,直接跳到條件判斷語句,繼續下一次的判斷。
10,def關鍵字,定義常量宏,如def TRUE 1; //定義一個TRUE宏,值為1
11,inc關鍵字,在腳本中載入外部腳本,例如:inc 'sdl_def.zl';
12,switch...case...default...endswt 多條件選擇結構,例如:
switch(event.type)
case EvQuit: //點擊了視窗右上角的叉叉則game over遊戲結束
gameover = TRUE;
break;
case EvKeyDown:
switch(event.keytype) //再嵌入一個switch結構
case KeyEsc: //按了ESC鍵,也game over遊戲結束
gameover = TRUE;
break;
case KeyUp: //按上鍵,用戶要牌
myPressUpDown(KeyUp);
break;
case KeyDown: //按下鍵,用戶不要牌
myPressUpDown(KeyDown);
break;
case KeyRight: //按右鍵,重新開始一輪
myGameRestart();
break;
endswt
break;
endswt
13,class...endcls 類定義結構,例如:
class clsPosition
x;
y;
w;
h;
endcls
14,while...endwhile 循環結構,例如:
while(!gameover)
..........
endwhile
15,do....dowhile 循環結構,例如:
do
if(blfirst)
printf('if you want start ,type "s" \t');
else
printf('if you want play again ,type "r" \t');
endif
input = read();
if((!blfirst && input=='r') || (blfirst && input=='s'))
myGameStart();
if(blfirst)
blfirst = FALSE;
endif
else
break; //跳出循環
endif
dowhile() //end program! 此處為無限循環,除非循環體中有break

相關詞條

熱門詞條

聯絡我們