zengl v1.0.3版本,该版本完善了当文件出错时的错误信息,例如某zl脚本文件无法加载,链接器无法删除某文件等信息。         zengl编译器和链接器在进行词法...

    zengl v1.0.3版本,该版本完善了当文件出错时的错误信息,例如某zl脚本文件无法加载,链接器无法删除某文件等信息。
   
    zengl编译器和链接器在进行词法扫描时,主要是通过main.c的getNextchar函数将文件的内容读取到缓存中的。当某个脚本文件不存在时, 之前的版本就是直接打印一条can't open file的信息,这条信息无法确切的知道是哪个文件不能被打开,本版本添加了具体的文件名信息,这样当使用inc语句加载某脚本而脚本不存在时,就可以清 楚的知道是哪个文件不能加载了。
    另外,链接器在对汇编代码文件进行伪地址替换时,是通过扫描.zlc汇编文件,并将扫描和处理的结果先输出到临时文件.zlc.tmp中,等全部输出完 后,再将原来的只包含伪地址的.zlc删除,最后将.zlc.tmp重命名为新的.zlc文件。如果在这个过程中,.zlc文件被别的程序占用,而无法删 除的话,.zlc.tmp文件就无法完成重命名工作,从而导致链接失败,在之前的版本遇到这种情况时,因为没有错误处理机制,所以不会弹出错误,只有当虚 拟机运行时才能发现错误,所以本版本在删除和重命名的c库函数上加上条件判断,并根据库函数的返回值判断是否操作成功,如果不成功则及时打印出错误信息。
    最后在虚拟机的func.c中,当虚拟机执行完后,在zl_freeall函数里对source.file打开的汇编代码文件的文件句柄进行释放,防止程 序占用该文件。当然一般情况下没有这条释放也没有影响,但是如果要将zenglrun虚拟机嵌入到某个c/c++的软件中时,如果没有释放工作那么程序就 会一直占用.zlc文件,也就无法在运行时修改编译.zl脚本,因为上面说过在链接器处理完时需要将.zlc删除,并用.zlc.tmp文件来生成新 的.zlc中间代码文件,如果.zlc被占用,就无法完成编译,所以还是有必要在虚拟机结束时对占用的文件句柄进行释放。(在作者的一个采集器的软件中就 嵌入了zenglrun虚拟机,将采集规则写成zengl脚本形式,接着用嵌入在软件中的zenglrun虚拟机执行脚本,这样就可以动态的修改采集规则 了,不用像以前那样改个规则还要修改C++代码,该采集器软件将在以后适当的时候进行发布)
    其他的改动请用 git log -p 或 gitk 等软件查看。
     
    作者:zenglong
    时间:2013年3月4日
    官网:www.zengl.com

    本节的源代码下载地址为:http://pan.baidu.com/share/link?shareid=312189&uk=940392313  (此为百度盘的下载地址),访问该地址可以看到三个文件:zengl_lang_v1.0.3_forXP.rar (XP系统下的vs2008解决方案和源代码),zengl_language_v1.0.3_forLinux.tar.gz  (Linux系统下的源代码和makefile) ,v1.0.3-v1.0.2-diffs.txt  (v1.0.3和v1.0.2两个版本之间的代码变化情况)。

   
SourceForge.net上的仓库地址为:https://sourceforge.net/projects/zengl/files/   从里面可以看到各个版本的代码压缩包,比如本节的zengl_lang_v1.0.3_forXP.rar  zengl_language_v1.0.3_forLinux.tar.gzv1.0.3-v1.0.2-diffs.txt

    本节将上一节的测试脚本test.zl拆分为两个文件:test.zl 和 test_inc.zl ,将名人名言的数组初始化部分放在test_inc.zl中,在test.zl中通过inc语句来加载test_inc.zl脚本。可以试着将 test_inc.zl改名为test_inc.zl2,而test.zl文件不变,编译下看是否会打印出"can't open file : test_inc.zl"的信息(之前的版本只能打印出"can't open file"信息,这样当inc层次比较深时,就无法知道到底是哪个文件不能打开了,本版本通过修改main.c的getNextchar函数来修复此问 题)。

    test.zl测试脚本的代码如下:

inc 'test_inc.zl';

print '按q键退出,按其他键查看名人名言,一次查看一条!';
for(i=0,j=1;i<72;i++,j++)
    if(read()=='q')
        break;
    endif
    print '('+j+'/36) '+test_array[i] + '\n\n\t\t ───────────  ' + test_array[++i] + '\n';
endfor

    本节的名人名言测试脚本和上节的区别在于,本节可以通过按键控制名人名言的输出,这样可以看的更仔细些。界面如下:

    最后还是老生常谈的话题:
    windowsXP压缩包中的代码
和测试脚本都是采用GBK的编码,Linux压缩包中的代码以及git里的信息都是UTF8的编码,
所以如果哪些地方出现了乱码,请自行调整(像EditPlus,UltraEdit,linux下的kwrite,vim等都可以调整编 码)。

    对于windows用户,请确保在项目属性的配置里,命令行参数配置的是test.zl(对于zengl的项目)或
test.zlc(对于zenglrun的项目)。另外工作目录设置为../zengl  ,这样在zengl下修改了.zl脚本并重新生成.zlc后,就无需再将.zlc拷贝到zenglrun项目下了。

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

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

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

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

    最后运行 ./zengl
test.zl 查看printASTnodes函数打印抽象语法树节点的结果,以及符号表输出的变量信息以及函数信息还有
类定义和类成员信息等。(例如变量的内存地址,以及在源文件的行列号,函数的唯一标识ID等)。
    接着运行
./zenglrun test.zlc

    如果要调试脚本则使用./zengldebug test.zlc注意是.zlc结尾的文件名,因为zenglrun虚拟机和zengldebug调试器只能运行.zlc里的汇编代码)。

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

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

上下篇

下一篇: zengl编程语言v1.0.5 编译,执行,源码调试一体化,开发俄罗斯方块

上一篇: zengl编程语言 v1.0.2 修复BUG

相关文章

zengl v1.6.0-v1.7.1, zenglServer v0.1.0

zengl v1.2.5 RC4加密,64位系统及Mac系统编译,Api调用位置规范,内建模块函数

zengl v1.2.2 正式发布版及智能采集器源代码

zengl编程语言 v1.0.2 修复BUG

zengl v1.2.0 嵌入式编程语言

zengl编程语言v0.0.3构建抽象语法树