让我们用中文编程(二)之C++篇 - 自己做中文编程语言,你也行

让我们用中文编程(二)之C++篇 - 自己做中文编程语言,你也行

作者 : Dancefire (Dancefire [at] gmail)

日期 : 2005年11月11日

由于CSDN的Blog好像对表格支持不好,我贴了几次,都导致了重复的内容。所以,为了能够贴到这里,我把表格都改变了,所以,推荐大家访问没有改过格式的连接:http://www.dancefire.org/Project/SinoProgram/ 

引言

上回书说到,用C#来进行中文编程,最后的主程序上很是有趣,没看过的客官,可以看看第一篇《让我们用中文编程》。看到有些客官,在后面说到,如果连那些关键字也能够中文化就好了。当时心中无奈,唉,谁叫C#不支持#define来替换关键字呢?在这风云变幻的年代,每一分钟都有奇迹的发生,曾经的不可能,很有可能就变成了想当然。当初的无奈,现在还是无奈么?请看下文。

 

 

 

  • 中文编程的神化

随着 117日,微软Visual C++ 2005的发布,我们关注到,VC8.0中增加了大量新的特性,包括最重要的,引入了C++/CLI,可以说是给C/C++语言历史上掀起了新的一页。作为一个方言的出现C++/CLI会有什么样的作为,却是值得大家拭目以待,是功是过,由历史来评说。但是我们也注意到,VC8.0引入了一个非常有趣的支持,VC8.0开始支持Unicode的源代码了。如同C#Java一样。如今,我们要写C++程序,已经完全允许在代码中出现Unicode编码的变量名、函数名、类名等等,并且#define也支持Unicode替换了。

 

 

 

虽然是个小变化,但是,中文编程的世界一下就变了。这使我立刻就想到,国内有些公司,在致力于炒作中文编程,细看他们的语言,无非是对现有语言把关键字替换成了中文而已,其他的改进太小了。有的是把Forth给用中文关键字包装了一下,就推出来的;还有的是把C语言用中文的关键字替换一下就推出来的。这样的语言,真的是自己的么?这样的语言真的有价值么?决定一切的不是语言而是思想!,这是已经人人共知的思想,国内的某些专家和公司竟然还在为这种伪中文编程而津津乐道,甚至有些获得了国家项目的资助。如果真的仅仅是用中文关键字来进行编程就可以改变我们国家的IT面貌的话,那大可不必投资数十万甚至上百万来做,用我下面的一个头文件就够了。

 

 

 

关键字使用中文,很简单的技术;实现一个别人已经发明的语言,也不是什么太复杂的事情(当然如果做一个100%兼容的C++这样的复杂语言的编译器还是具有相当的难度的)。真正难的应该是理解这种语言的创新思想,发现或者创造一种方法,以解决现有语言在程序设计上的存在的种种问题,这样更新或者创造出来的才是真正有用的经典之作。不用细说,大家都知道,CC++JavaC#RubyPython的诞生都分别解决了什么难题。他们用漂亮的办法解决了一直困扰程序员的问题,他们就成为了经典。而国内那些做中文编程的公司的产品呢?呵呵,也许仅仅是茶余饭后而笑柄而已。

 

 

 

不好意思,一时感慨颇多,啰里啰唆了那么多废话。下面言归正传。。。

 

 

 

  • 没有什么不可以

再细说之前,需要说一下编译器的事情。

目前我不知道还有哪个编译器能够对Unicode有良好的支持,所以,目前只有Visual C++ 2005才能够编译下面的代码,但是很幸运,原本打算卖US$49的Visual C++ 2005 Express,从现在开始,一年内是免费的,而且微软没有一年以后的收费计划,所以也许我们可以一直合法的用下去,呵呵。大家可以从微软网站直接下载,需要下载的访问下面的连接:

http://msdn.microsoft.com/vstudio/express/visualc/

下面的代码都可以在Visual C++ 2005 Express 版上编译通过。

好了,真的言归正传了。我用了一系列的#define宏和typedef,作了中文和英文关键字的替换。比如:

 

typedef int    整型;
typedef
char
   字符型;

#define
如果     if
#define否则     else

#define返回     return
#define常量     const

#define标准输出 std::cout
#define行结束   std::endl
#define标准输入 std::cin
#define字符串   std::string

#define主程序   main

经过这样处理后我们就可以写出一个最简单的中文程序:

 

整型 主程序(整型参数数量,常量 字符型**参数列表 )
{
   字符串路人甲;
   整型  年龄;

    标准输出
<<"请输入姓名:"<<
行结束;
    标准输入
>>
路人甲;
    标准输出
<<"请输入年龄:"<<
行结束;
    标准输入
>>
年龄;

   如果(年龄
>18
){
        标准输出
<<路人甲<<"先生/女士,您好!祝您今天工作愉快哦。"<<行结束
;
    }否则{
        标准输出
<<路人甲<<"小朋友,您好!祝你今天玩得开心。"<<行结束
;
    }

  返回
0
;
}

 

 

 

 程序很简单,执行后,询问你的姓名和年龄,如果你大于18岁呢,它就要对你说“Dancefire先生/女士,您好!祝您今天工作愉快哦。”,如果还不到18岁呢,就会说“Dancefire小朋友,您好!祝你今天玩得开心。”

 

这个程序似乎不够有趣。那么我再来一个有趣一些的,用到了面向对象的继承的概念,新瓶装旧酒了,前一篇文章中提到的,生物圈的例子,(既然是中文嘛,就来点中国文化特色,呵呵),

 

哦,多说一句,下面的程序一共由3个文件组成,其中2个是头文件,另外一个是源文件。三个文件都可以从我的网站下载:

http://www.dancefire.org/file/SinoCPP.zip

如果大家想自己写个中文的类玩玩,只需要#include第一个Sino.h就可以了。我已经在里面替换了大量的关键字,玩玩够了,如果还想替换其他关键字,你们自己加进去就行了,需要注意的是,这几个文件都是受GPL协议保护的,简单而言就是,大家可以随便改,只要继续保持开放就行了。

下面的是主程序:

 

//
//作者:Dancefire   (Dancefire [at] gmail)
//日期: 公历 二零零五年十一月十一日
//
      农历 乙酉年 丁亥月 己亥日 巳时
//
           宜 解除 修饰垣墙 冠笄 出行 馀事勿取
//
           忌 开市 动土 破土 嫁娶 安葬
//
项目: 中文C++编程测试
//
版本: 甲子
//


#include
<vector>
#include
<iostream>
#include
<string>
#include
"sino.h"
#include
"SinoTest.h"


使用 名字空间标准库;

整型主程序(整型参数数量,常量 字符型
**参数列表 )
{
    标准输出
<<"世界你好!"<<行结束<<
行结束;

   使用 名字空间中文编程;
    矢量
<生物*>
动物们;

    动物们.排到后面(新建鸟());
    动物们.排到后面(新建鱼());
    动物们.排到后面(新建马());
    动物们.排到后面(新建动物());
    动物们.排到后面(新建生物());

   循环(无符号整型
=0; 甲<动物们.多少() ;++
甲)
    {
        生物
*小家伙=
动物们[甲];
        小家伙
->
自我介绍();

        动物
*小动物=动态转型<动物*>
(小家伙);
        如果( 小动物 ){
            小动物
->
移动();
        }
        标准输出
<<
行结束;
    }
   返回
0
;
}

 

主程序很简单,先建立了一个动物们的容器,然后一个一个新的动物加入到这个容器(队列)中了。(当然严格来说,应该是生物们,但是听起来好怪,就叫动物们好了。)这些动物们排好队后,开始一个接着一个的自我介绍,如果是动物呢,就动一动,如果不是动物就算了。

 

执行的结果是这样的:

 

 

世界你好!

我属于动物, 我是一只可爱的鸟
这只鸟在自由自在的飞翔

我属于动物, 我是一条可爱的鱼
这条鱼在自由自在的游来游去

我属于动物, 我是一匹可爱的马
这匹马在自由自在的奔跑

我属于生物, 我是一只可爱的动物
这只动物在自由自在的移动

我是...咦?我是什么?我也不知道我是什么,难道我是一个外星的生物

大家可以在程序中感受到C++的OO的概念。这里面有5个类,动物类继承了生物类能够自我介绍的能力, 继承了动物类能够移动的能力,而他们在继承自我介绍的时候,用自己的方式替代(重写)了原始生物自我介绍方式,此处自然用到了虚函数,既然是表现继承,怎么能没了虚函数呢,是吧。在判断是否是动物的时候,用到了C++标准的动态转型,这是在运行期,而不是编译期,进行转型的。类的定义在头文件SinoTest.h中,完整的这个头文件如下:

 

//作者:Dancefire   (Dancefire [at] gmail)
//日期: 公历 二零零五年十一月十一日
//
      农历 乙酉年 丁亥月 己亥日 巳时
//
           宜 解除 修饰垣墙 冠笄 出行 馀事勿取
//
           忌 开市 动土 破土 嫁娶 安葬
//
项目: 中文C++编程测试
//
版本: 甲子
//


名字空间中文编程
{
  
//   生物类

  生物
  
{
公有:
      生物()   
{
           类别
="生物"
;
           祖先的类别
="游离态"
;
       }


      
~生物(){}
      虚 字符串我的类别()
      
{
          返回类别;
       }

      字符串我祖先的类别()
      
{
          返回祖先的类别;
       }

      无值自我介绍()
      
{
           标准输出
<<"我是...咦?我是什么?我也不知道我是什么,难道我是一个外星的"<<我的类别()<<
行结束;
       }

受保护的:
      字符串类别;
      字符串祖先的类别;
   }
;


  
//   动物类,动物当然是生物啦

  动物 :公有生物
  
{
公有:
      动物()   
{
           移动方式
="移动"
;
           量词
=""
;
           类别
="动物"
;
           祖先的类别
="生物"
;
       }


      虚 无值移动()
{
           标准输出
<<""<<量词<<我的类别()<<"在自由自在的"<<移动方式<<
行结束;
       }

      虚 无值自我介绍()   
{
           标准输出
<<"我属于"<<我祖先的类别()<<", 我是一"<<量词<<"可爱的"<<我的类别()<<
行结束;
       }


受保护的:
      字符串移动方式;
      字符串量词;
   }
;

  
//   鸟类,鸟是动物咯。

   :公有动物
  
{
公有:
      ()
{
           移动方式
="飞翔"
;
           量词
=""
;
           类别
=""
;
           祖先的类别
="动物"
;
       }

   }
;


  
//   鱼也是动物咯

   :公有动物
  
{
公有:
      ()
{
           移动方式
="游来游去"
;
           量词
=""
;
           类别
=""
;
           祖先的类别
="动物"
;
       }

   }
;


  
//   马也是动物

   :公有动物
  
{
公有:
      ()
      
{
           移动方式
="奔跑"
;
           量词
=""
;
           类别
=""
;
           祖先的类别
="动物"
;
       }

   }
;
}
 
 

至于Sino.h的内容,我就只列一部分好了,大家需要的,直接从上面的连接下载吧,因为太长了,而且都是一样的宏定义,非常简单,没有什么有趣的事情。

 

 

//作者:Dancefire   (Dancefire [at] gmail)
//日期: 公历 二零零五年十一月十一日
//
      农历 乙酉年 丁亥月 己亥日 巳时
//
           宜 解除 修饰垣墙 冠笄 出行 馀事勿取
//
           忌 开市 动土 破土 嫁娶 安葬
//
项目: 中文C++编程 头文件
//
版本: 甲子
//



//   变量

typedefbool布尔;
typedef
char
字符型;
typedef
short
短整型;
typedef
int
整型;
typedef unsigned
char
无符号字符型;
typedef unsigned
short
无符号短整型;
typedef unsigned
int
无符号整型;
typedef unsigned
long
无符号长整型;
typedef
long
长整型;
typedef
float
浮点型;
typedef
double
双精度型;
typedef std::
string
字符串;

//   常量

constbool=true;
constbool=false
;

//   关键字


#define抽象        abstract
#define内嵌汇编    __asm
#define中断        break
#define得          case       //   ???
#define捕获        catch
#define类          class
#define常量        const
#define常量转型    const_cast
#define继续        continue
#define默认        default
#define委托        delegate
#define删除        delete
#define不推荐      deprecated
#define动态链接库导出    dllexport
#define动态链接库导入    dllimport
#define做            do
#define动态转型    dynamic_cast
#define否则        else 

哦,唯一的问题是,我不知道switch和case如何翻译。目前我的翻译是,判断和得。所以,如果用到switch的话,代码看起来可能比较奇怪:

判断( 甲吃的饺子盘数 ){
 
1
:
     标准输出
<<"竟然甲才吃了1盘饺子,不正常"<<
行结束;
    中断;
 
2
:
     标准输出
<<"甲一个人就吃了2盘饺子,够实力"<<
行结束;
    中断;
 
3
:
     标准输出
<<"没搞错吧?甲吃了3盘饺子,不会一天没吃饭,就等这顿了吧??"<<
行结束;
    中断;
 默认:
     标准输出
<<"无语了~~,我都不知道甲他吃了几盘了"<<
行结束;
    中断;
}
 

 

 

 

 

 

 

  • 自己做一个中文编程语言,你也行

自己做一个中文编程语言?没有开玩笑吧?是的,是没有开玩笑。那些大公司所谓的什么汉语编程语言,相当一部分,就是对某种语言的模拟,只不过关键字用中文替代了而已,有模拟VB的,有模拟C的,还有模拟Forth的。既然是这样也较“中文编程语言”的话,呵呵,那好,我们也做一个好了,比他们更省人力,更简单。

通过刚才的例子,大家已经看到了,我基本上使用纯中文写了一个程序,我相信有C++为依托,这个肯定是最强大的,能够用中文写程序的语言了,哈哈~~(真不要脸,牛什么牛,那些强大的功能是C++给你提供的,你可啥都没做,就是换了换关键字而已嘛。汗~~~)。

想自己创造一个有自己个性的“中文编程语言”,大家从我的网站下载Sino.h这个文件:

http://www.dancefire.org/file/SinoCPP.zip

大家可以根据自己的想法,随意的改动关键字的中文,有什么好的想法,也可以给我回复在这里。给大家举几个简单的例子。大家可以把Sino.h中的public对应的中文,替换成“大家的”,private对应成“我的”,protected对应成“我们家的”,friend可以对应成“哥们儿”,int可以对应成“小样儿”,std::string对应成“条幅”,std::cout对应成“嚷嚷”,std::cin对应成“告诉”。std::endl对应成“行了您呐”,main对应成“龙门客栈”,if对应成“若”,else对应成“否”,return对应成“回报”等等。哈哈,结果这个设计的“中文编程语言”可能就变成下面的样子了:

 小样儿龙门客栈()
{
   条幅英雄;
   小样儿年方几何;

    嚷嚷
<<"客官贵姓啊?"
;
    告诉
>>
英雄;
    嚷嚷
<<"哦,兄台,年方几何啊?"
;
    告诉
>>
年方几何;

   (年方几何
>16
){
        嚷嚷
<<英雄<<",大英雄,久仰久仰,您请楼上落座。"<<
行了您呐;
    }{
        嚷嚷
<<英雄<<"小英雄,早有所闻,今日得见果然气度不凡,里面请。"<<
行了您呐;
    }
   回报
0
;
}

 

这段程序和第一个程序的意思,实际上是一样的,但是显得更有趣味,输出大体如下:

客官贵姓啊?乔峰
哦,兄台,年方几何啊?28
乔峰,大英雄,久仰久仰,您请楼上落座。

客官贵姓啊?杨过
哦,兄台,年方几何啊?14
杨过,
小英雄,早有所闻,今日得见果然气度不凡,里面请。


 


版权声明:本文为DanceFire原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。