C语言的伟大---开发自己的编程语言
编程是一门艺术,而编程语言则是这门艺术的缔造者。计算机系的很多学生都对编程语言涉及到的编译原理表示畏惧,其实编译原理本身并不复杂,不过由于目前市面上有关编译原理的书籍大部分都是由国外的原著翻译过来的,翻译过来的文字很多时候没办法完美的表达出原文的意思,所以有时候让人感觉像天书,例如国外有名的 龙书(Dragon book),龙书是Alfred V. Aho等人于1986年出版的,虽然时隔了几十年,不过里面的编译原理和算法却相当经典,可惜大部分翻译的质量都不过关,需要仔细研读作者提供的源代码再加上英文原著,才能够领悟出编译原理的奥妙。
不过作者提供的源代码做出来的最终例子因为与别的编程语言相比过于简单,可用性不强,再加上一堆的数学公式,很多人都放弃了研究,再加上目前国内.net,java,android之类的商业开发环境,很多程序员没时间做开源项目,所以全世界那么多的编程语言就没看到中国人开发的编程语言,可能有人会说有易语言,易语言确实是很难得的应用于实际开发的中国的编程语言,不过好像没开源吧,商业的味道更浓点。
不过任何事情都不是绝对的,外国人能做到的,我们一样可以做到,zengl开源网的站长根据龙书里的编译原理,使用C语言开发出了一套开源的编程语言,名字叫zengl编程语言。
zengl编程语言创建的本意是为了让人们能够揭开编译原理的神秘面纱。本着开源的精神,作者将该编程语言开发过程中的所有版本都公开出 来,每个版本都有windows系统的用于vs2008的版本,以及linux系统下的包含makefile的源代码,并且都有对应的测试脚本用于测试编程语言的实用性。
作者从编译原理的词法解析开始创建了第一个词法扫描的版本, 接着是抽象语法树的生成等,在做出一个像样的编译器后,又接着做了一个解释器(就像JAVA的虚拟机),用于解释执行编译器生成的中间代码。作者抛开了龙 书中的复杂的数学算法,利用简洁的C语言和常用的条件,循环,函数等结构构建了一个简单易懂的编程语言,并且在很多重要的代码处做了注释,每个版本都在网 站中有个单独的页面,在其中有详细的阐述,力求让人们能更直观的深入到编程语言的核心部分,最重要的是这些都是中文的,无需进行蹩脚的翻译。
如果把zengl编程语言比作金字塔,那么其中的每个版本就是金字塔的台阶,只要沿着台阶一级一级的往上走,就可以领悟到编译原理和编程语言的魅力,最终能够开发出属于自己的编程语言,就算不能开发出一个自己的编程语言,也能将编译原理应用到其他项目中去(例如作者开发的一个采集器就是采用zengl编程语言作为采集规则的动态脚本,在官网中也有专门的栏目,另外作者还结合SDL开源游戏引擎开发出了一个图形界面的21点扑克游戏,适合windows和linux平台)。
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" \r\n\t');
else
printf('if you want play again ,type "r" \r\n\t');
endif
input = read();
if((!blfirst && input=='r') || (blfirst && input=='s'))
myGameStart();
if(blfirst)
blfirst = FALSE;
endif
else
break; //跳出循环
endif
dowhile() //end program! 此处为无限循环,除非循环体中有break