之前的版本一直没有实现注释功能,但是注释在编程里又非常重要,尤其是在大型项目开发中,成千上万行的代码,如果没有注释的话,很容易就迷失在代码的丛林 中,所以本节的v0.0.17版本就实现了...

    之前的版本一直没有实现注释功能,但是注释在编程里又非常重要,尤其是在大型项目开发中,成千上万行的代码,如果没有注释的话,很容易就迷失在代码的丛林 中,所以本节的v0.0.17版本就实现了注释功能,另外还有字符串里的转义字符的处理,编译器虚拟机的优化等。

    本节v0.0.17版本的源代码下载地址为:http://pan.baidu.com/share/link?shareid=201037&uk=940392313  (此为百度云盘的共享链接地址),访问该地址可以看到三个文件:zengl_lang_v0.0.17_forXP.rar (XP系统下的vs2008解决方案和源代码), zengl_language_v0.0.17_forLinux.tar.gz  (Linux系统下的源代码和makefile) ,v0.0.17-v0.0.16-diffs.txt  (v0.0.17和v0.0.16的代码变化情况)。

    SourceForge.net上的仓库地址为:https://sourceforge.net/projects/zengl/files/   从里面可以看到各个版本的代码压缩包,比如本节的zengl_lang_v0.0.17_forXP.rar zengl_language_v0.0.17_forLinux.tar.gzv0.0.17-v0.0.16-diffs.txt

   
先来看下本版本的描述 (在linux代码包里的usage.txt里有这段描述,在目前几个带有git版本的....-diffs.txt和git log中也有这段描述):

    v0.0.17版本,该版本优化了编译运行的速度,为字符串添加了转义字符'\',还添加了多行和单行注释。
   
    在run.h中为MEM_STRUCT内存结构添加了ptrIndex和memptrIndex两个成员,ptrIndex对应ptr在 zl_points内存池指针数组中的索引,memptrIndex对应memblock在zl_points中的索引。这样在要对ptr(指向字符串的 指针)或memblock(指向内存块的指针)进行释放或调整大小等操作时就不需要像原来那样,利用for循环查找zl_points了,可以直接通过索 引快速定位。
    因为增加了索引,所以在func.c中所有和内存操作有关的函数都加上了index索引参数。另外还增加了一个zl_freepoints的释放指针数 组,当要释放某个内存里存放的指针时,并不会直接调用free函数。而是将指针索引存放到zl_freepoints中,表示该指针已被释放,下一次其他 内存要申请zl_malloc分配指针时,就可以直接从zl_freepoints中获取指针索引并对这个指针进行重利用的操作。这样就加快了内存指针的 分配和释放的效率。
    在func.c中还添加了zl_reUsePtr函数,当某个指针需要被重利用而不需要保留原来的数据时,就可以使用zl_reUsePtr代替原来的zl_realloc,这样可以提高效率,减少拷贝原数据的开销。
    在ld.c链接模块中,为需要替换的地址名添加了hash表,这样在将某个地址名替换为地址值时,就可以通过hash表快速的找到ld_addrList中的和需要查找的地址相关的索引,不用像原来那样通过循环查找数组。这样就加快了替换的速度。
    在main.c中添加了makeTokenStrForString函数用于处理字符串中的字符和转义字符。这样就可以在字符串中使用'\r',' \n','\t'等转义字符来表示回车换行,tab符等。就和c以及php中的转义字符差不多。还有\",\'分别对双引号和单引号进行转义,'\\'则 是对转义符的转义即表示普通的'\'斜杠字符。
    最后在main.c中添加了'//'和'/*'分别用来表示单行注释和多行注释,用法就和c语言中的注释用法一样。
    其他的改动请用git log -p 或 gitk之类的软件来查看。
   
    作者:zenglong
    时间:2012年4月29日
    官网网站:www.zengl.com

    在本节的测试脚本game_21_point.zl文件中,添加了上一节提到过的所有注释信息,例如:

.................. .................. //省略N行代码
/*myIsNeedPoker函数用于机器人通过概率来判断
是否需要继续要牌*/

fun myIsNeedPoker(array)
    global TotalPoker; //全局变量用于标识数组中的总扑克点数。
    num = 21 - array[TotalPoker]; //先得到当前机器人总点数和21点的差值。
    if(bltRandom()%13 +1 <= num) //bltRandom 是内建模块里的随机数生成函数。这里之所以和13取余,是因为该游戏中扑克范围为A到K,即一张牌的点数是1点到13点,单张扑克 最大是13点,所以和13取余,如果当前的总点数小于等于8,那么不管得到什么牌都不会超过21点,当前总点数大于8时,越接近21点,继续要牌的概率就 越小。
        return 1; //返回1表示继续要牌
    else
        return 0; //返回0表示此轮不继续要牌
    endif
endfun
..................  .................. //省略N行代码

    上面绿色标注的就是注释部分,其中/*....*/包起来的是多行注释,//开头的就是单行注释,和C语言中的用法一样,这些注释在原文件中都有,这样就增加了测试脚本的可读性,让zengl脚本容易理解。

    另外game_21_point.zl文件的字符串部分还增加了\r,\n等转义字符的应用,例如:


.................. .................. //省略N行代码

printf('please input \'y\' to get poker,except to end! \r\n\t'); //输入y表示要牌,否则表示不要牌。


.................. .................. //省略N行代码   
   
    上面这条printf语句里,
因为整个字符串是使用单引号包起来的,所以对字符串里面的单引号做了转义如\'y\',这样就不会破坏外面的单引号,另外字符串末尾使用了\r\n来表示打印出回车换行,\t表示打印出tab缩进符号。

    下面是21点命令行游戏的截图:

    至于游戏的玩法已经在game_21_point.zl文件的注释部分说的很清楚了,就不多说了。

    具体的C文件代码部分,请结合源代码中的注释,加上git工具以及vs2008或者eclipse+CDT插件或者gcc,gdb等工具进行分析。

   
最后还是老生常谈的话题:
    windowsXP压缩包中的代码包括
game_21_point.zl测试脚本都是采用GBK的编码,Linux压缩包中的代码包括测试文件以及git里的信息都是UTF8的编码,所以如果哪些地方出现了乱码,请自行调整。

    对于windows用户,请确保在项目属性的配置里,命令行参数配置的是game_21_point.zl(对于zengl_lang_v0.0.16的项目)或game_21_point.zlc(对于zenglrun的项目)。
    另外对于vs2008的用户,我在项目属性里:[配置属性>>>>C/C++ >>>> 高级] 部分设置了禁用特定警告:4013,4715,4996 ,这几个警告会显示一些某某函数是非安全的函数,或者函数没有返回值等,这里禁用掉,防止出现过多的警告。另外还有个警告是显示某某变量没被使用过的, 这个警告我没禁用,可以不用管它。我最开始是
在Linux系统中使用eclipse+CDT插件以及gcc等开发的zengl ,在我的GCC下面并没有显示过这些讨厌的警告,所以就没处理,不过还好这些警告都无关痛痒,无需理会。
    还有一个地方:VS2008项目中,在[配置属性>>>> C/C++ >>>> 预处理器] 部分都设置了预处理器定义的宏:OS_IN_WINDOWS ,因为源代码既要在WINDOWS下编译,又要在LINUX下编译,所以需要通过这个宏来告诉程序当前的环境是windows还是linux,在 windows下面,在程序结束时会执行system ("pause");这条语句(vs2008下为了能看到结果,需要暂停,否则就一闪而过,什么都看不到咯。) 而linux系统主要在bash终端下执行,不需要这条语句。

    linux系统下的用户请结合usage.txt的说明,先运行make clean 将原来生成的zengl zenglrun 和 main.o parser.o assemble.o ld.o func.o run.o  symbol.o builtin.o文件
删除。

    再运行make all (单纯的make只能生成zengl,所以需要make all来生成所有的目标)

    生成zengl zenglrun 和 main.o parser.o assemble.o ld.o func.o run.o  symbol.o 
builtin.o。(在生成过程中如果出现一些警告,暂不管他)

    最后运行 ./zengl test.zl(本节是
game_21_point.zl) 查看printASTnodes函数打印抽象语法树节点的结果,以及符号表输出的变量信息以及函数信息等。(例如变量的内存地址,以及在源文件的行列号,函数的唯一标识ID等)。
    接着运行./zenglrun test.zlc(本节是
game_21_point.zlc) (注意是.zlc结尾的文件名,因为zenglrun虚拟机只能运行.zlc里的汇编代码)。

    zengl语言涉及到的很多高级的编译原理都可以在《龙书》中找到。

    最后的最后,如果转载请注明来源 http://www.zengl.com   , OK , 先到这里,休息,休息一下 O(∩_∩)O~
上下篇

下一篇: zengl编程语言v0.0.18初始化数组函数

上一篇: zengl编程语言v0.0.16数组,21点扑克小游戏

相关文章

zengl编程语言v0.0.12函数的实现

zengl v1.7.4 修复Bug

zengl v1.9.1 函数参数可以使用负数作为默认值

zengl编程语言v0.0.13函数中实现global和return

zengl v1.3.0 位运算符 字符串脚本解析 缓存 Bug修复

zengl编程语言v0.0.19 def宏定义