一、引 言 用中文进行C语言编程始终是一个有争议的话题:首先是能不能,能意味是中国自己的编译器。其次是中国自己的C语言编译器需不需要支持中文编程,这个就仁者见仁智者见智,各人有各人的看法了。 长缨-I号C351编译器从设计开始就把全面支持中文编程作为主要的技术要求。本文介绍使用该编译器进行C语言中文编程的方法。 二、使用英文编程的例子 为了进行对比,本文使用一个在STC8051U单片机最小开发板上运行的8个LED发光二极管左右闪动的单片机程序为例子。 (1)首先给出使用英文编程的程序例子,该程序分两个部分,下面是程序的定义部分: 其中第15行到第23行程序给出了程序运行的SFR定义。第26行程序是延时函数预定义。第29到35行程序是任务函数定义它的功能是按任务函数参数DT点亮LED灯,然后延时指定的时间TM毫秒。 (2)下图是程序的主函数和延迟函数部分: 其中主函数“main()”是用户程序的起点。第42行到第43行对LED灯连接的P1端口进行设置,将其设置为准双向工作模式。 第41行是关闭总中断。将关闭总中断作为用户的第一行程序,是笔者在掉过N次坑后的经验,是高可靠程序标准开始。 第46行到49行程序是通常单片机程序应该具备的开机LOGO。开机LOGO的作用是明显地提示用户系统重新启动了。如果用户在后面单片机运行的时候又看到这个LOGO信号,表示系统出现严重故障导致重启了。 (3)本范例的第52行到55行形成一个无限循环,其中调用了两次任务函数“My_Task”实现了8个LED相邻两个交替发光。 下面是本程序运行效果的视频: (4)对于英文编程,长缨-I号C351编译器与Keil的C51编译器是兼容的。本节C语言英文编程例子已经在“0301_英文编程例子”子目录下做成了Keil项目。无论是使用Keil软件编译生成HEX烧录文件,还是双击该子目录下的“长缨_I_MakeFile.bat”批处理文件,调用长缨-I编译生成HEX烧录文件,烧录后运行的效果是一样的,只是二组的运行速度稍有不同。 三、用户定义用中文编程的例子 (5)支持用中文进行编程要决定的第一个问题数值常数怎么办?比如像上面第53行的程序,500是写成中文的五百,还是保留写成阿拉伯数字500?更棘手的是如果常数写成中文,那么十六进制数怎么表达? 因此笔者觉得在中文C语言程序中的数值表示就用传统的阿拉伯数字算了,毕竟商场里的价格也是阿拉伯数字表示的。 (6)当然在中文C语言程序中的变量名和函数名等这些由用户自己定义的名称,必须支持用中文汉字。本文的第2个例子就是用中文汉字来定义各种名称。下图是程序的前半部分: 其中SFR定义用中文名“端口1”代替了英文名“P1”,函数定义用中文名“毫秒延时”代替了英文名“DelayMS”,参数定义用中文名“毫秒参数”代替了英文名“TM”等等。 从已经会用C语言的程序员角度,上面这样的中文程序应该是可以接受的。 (7)下图是后半部分程序: 其中第61行用中文定义了各个变量的名称。至此上面的程序展示了用户可以定义的名称都可以使用中文汉字来定义。 (8)由于Keil的C51编译器不支持变量名等使用中文汉字,编译上面程序时会出很多“unprintablecharacter”(不可打印字符)的错误提示,见下图: 因此第二个例子程序只能双击“长缨_I_MakeFile.bat”文件,调用长缨-I号编译生成HEX烧录文件。 四、C语言关键字用中文编程的例子 (9)长缨-I号C351编译器要支持用中文进行编程需要决定的第二个问题是对于C语言的语法关键字是用中文还是用英文。 由于在进行编译器顶层设计时最重要的要求是与Keil的C51兼容,所以笔者决定C语言的语法关键字还是只用英文,整个程序就像上面的例子那样。 (10)对于那些连关键字都想用中文汉字的用户,笔者提供利用C语言的宏定义功能来解决的方案。比如写程序时把“sfr”用“特殊功能寄存器”来代替,编译程序时用宏定义“#define 特殊功能寄存器 sfr”又重新换回英文的C语言关键字。 本节的例子C语言关键字用中文汉字增加了一个头文件“中文关键字.h”,其中包含了本节例子所包含的C语言关键字对应的中文汉字定义,见下图: 请注意第31行的等号不是关键字,是运算符。 (11)将第2个例子中的关键字和等号用上面的宏定义替换后的部分程序如下: 对上面的程序用长缨-I编译器编译出错了,编译的信息都保存在编译信息文件“STC8U_Demo.uvproj.MSG”中,现在的出错内容如下: (12)这个编译错误是所有支持中文汉字的计算机语言编译器都面临的一个共同问题:纯中文句子断句和分词问题。 第35行程序“LED灯端口等于数据参数;”对于我们中国人来说,轻而易举地分割为“LED灯端口/等于/数据参数/;”4个词,其意义不言自明。但是如果不采用现在的AI技术,靠个人编一个计算机程序就能实现这种自动将纯中文句子正确地断句和分词是很难完成的。 笔者相信即使现在的AI技术,要实现对任意句子的中文分词也是很困难的,比如客人说“下雨天留客天留我不留”,你说客人的意思是“下雨天留客,天留我不留。”还是“下雨天,留客天,留我不?留!”,他到底留不留? (13)因此对于长缨-I号编译器,笔者决定中文编程中分词的问题由用户自己解决,即:为了避免歧义,用户应该自己将C语言关键字、变量名和函数名等用空格或者指定的数学符号分离开来。 比如像上面的程序,用户自己将第35行程序写为“LED灯端口 等于 数据参数;”(由于分号是C语言的指定语法符号,不需要前面加空格),这样长缨-I就能正确识别并进行编译了。 (14)除了等号外,上面程序中的各种括号和分号,以及一般C语言程序中都会包含的标点符号和运算符,那么还要不要再继续“中文汉字化”下去,笔者觉得还是中国古人说的有道理:适可而止,物极必反,画蛇添足。 因此对于第一线的STC单片机工程师和程序员来说,恐怕全部都是汉字的C语言程序反而让人看不懂了。 (15)下面给出长缨-I号编译通过可以运行的C语言中文程序,欢迎各位看官评头论足:
附件:
|