开发自己的编程语言

   编程是一门艺术,而编程语言则是这门艺术的缔造者。计算机系的很多学生都对编程语言涉及到的编译原理表示畏惧,其实编译原理本身并不复杂,不过由于目前市面上有关编译原理的书籍大部分都是由国外的原著翻译过来的,翻译过来的文字很多时候没办法完美的表达出原文的意思,所以有时候让人感觉像天书,例如国外有名的 龙书(Dragon book),龙书是Alfred V. Aho等人于1986年出版的,虽然时隔了几十年,不过里面的编译原理和算法却相当经典,可惜大部分翻译的质量都不过关,需要仔细研读作者提供的源代码再加上英文原著,才能够领悟出编译原理的奥妙。
    不过作者提供的源代码做出来的最终例子因为与别的编程语言相比过于简单,可用性不强,再加上一堆的数学公式,很多人都放弃了研究,再加上目前国内.net,java,android之类的商业开发环境,很多程序员没时间做开源项目,所以全世界那么多的编程语言就没看到中国人开发的编程语言,可能有人会说有易语言,易语言确实是很难得的应用于实际开发的中国的编程语言,不过好像没开源吧,商业的味道更浓点。
    不过任何事情都不是绝对的,外国人能做到的,我们一样可以做到,zengl开源网的站长根据龙书里的编译原理,使用C语言开发出了一套开源的编程语言,名字叫zengl编程语言。

    zengl编程语言创建的本意是为了让人们能够揭开编译原理的神秘面纱。本着开源的精神,作者将该编程语言开发过程中的所有版本都公开出来,每个版本都有windows系统的用于vs2008的版本,以及linux系统下的包含makefile的源代码,并且都有对应的测试脚本用于测试编程语言的实用性。

   作者从编译原理的词法解析开始创建了第一个词法扫描的版本,接着是抽象语法树的生成等,在做出一个像样的编译器后,又接着做了一个解释器(就像JAVA的虚拟机),用于解释执行编译器生成的中间代码。作者抛开了龙书中的复杂的数学算法,利用简洁的C语言和常用的条件,循环,函数等结构构建了一个简单易懂的编程语言,并且在很多重要的代码处做了注释,每个版本都在网站中有个单独的页面,在其中有详细的阐述,力求让人们能更直观的深入到编程语言的核心部分,最重要的是这些都是中文的,无需进行蹩脚的翻译。
    如果把zengl编程语言比作金字塔,那么其中的每个版本就是金字塔的台阶,只要沿着台阶一级一级的往上走,就可以领悟到编译原理和编程语言的魅力,最终能够开发出属于自己的编程语言,就算不能开发出一个自己的编程语言,也能将编译原理应用到其他项目中去。

    作者使用zengl v1.0.5的版本开发了俄罗斯方块游戏:

    在linux下按P键暂停时的截图如下(linux下的kde截图软件像素不太高):

   还开发了一个21点的扑克小游戏。

   下面是zengl编程语言使用SDL游戏引擎开发的图形版的21点扑克游戏截图:

  下面是zengl利用SDL做的测试鼠标捕获事件的截图:


   下面是zengl编程语言使用SDL游戏引擎开发的小游戏的windows截图(一个可以控制人物精灵四处移动的小游戏):

 


    下面是linux下的截图:



    下面是zengl编程语言里的if结构的语法树截图:

  最后是《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
           print 'a          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

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


你可能感兴趣的:(编程语言,编译原理)