C语言的伟大---开发自己的编程语言

a499068735 2013-03-20 06:42:26
编程是一门艺术,而编程语言则是这门艺术的缔造者。计算机系的很多学生都对编程语言涉及到的编译原理表示畏惧,其实编译原理本身并不复杂,不过由于目前市面上有关编译原理的书籍大部分都是由国外的原著翻译过来的,翻译过来的文字很多时候没办法完美的表达出原文的意思,所以有时候让人感觉像天书,例如国外有名的 龙书(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
...全文
456 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
大极张三疯 2013-03-22
  • 打赏
  • 举报
回复
lucky-lucky 2013-03-22
  • 打赏
  • 举报
回复
大力支持,虽然觉得这个语言没有特别的生存空间,但是是咱中国人做出来,这实在让人欣慰
a499068735 2013-03-22
  • 打赏
  • 举报
回复
编译原理主要难点是语法解析那块,要考虑很多实际中可能会碰到的问题,处理各种可能出现的语法错误,至于词法扫描和虚拟机解释中间代码那块一般都有固定的循环模式。
fanyit123 2013-03-22
  • 打赏
  • 举报
回复
现在正在学习编译原理,觉得有点难。。。
L_chxu 2013-03-21
  • 打赏
  • 举报
回复
a499068735 2013-03-21
  • 打赏
  • 举报
回复
【只有“开源的编译器”,没有“开源的编程语言”这种东西】 上面的仁兄批评的是,不过我觉得没必要去纠结这个问题,毕竟不是语言学家,觉得有用就看下,觉得没用,就扔到一边。
赵4老师 2013-03-21
  • 打赏
  • 举报
回复
LEX+YACC Lua
千树之影 2013-03-21
  • 打赏
  • 举报
回复
乱七八糟,语言是语言,编译器是编译器,不是同一个东西。只有“开源的编译器”,没有“开源的编程语言”这种东西。 另外,很多语言都有开源的编译器。比如gcc就是典型的开源的C语言编译器
hugett 2013-03-20
  • 打赏
  • 举报
回复
AnYidan 2013-03-20
  • 打赏
  • 举报
回复
DaiwjDev 2013-03-20
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
支持啊 下载看看

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧