找回密码
 立即注册
查看: 1525|回复: 15

Ai8051U单片机,从入门到精通(3):使用长缨-I号C351编译器的中文编程方法

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-30 08:41:32

105

主题

1215

回帖

1万

积分

荣誉版主

积分
12882
发表于 2024-8-6 06:41:44 | 显示全部楼层 |阅读模式
一、引  言
用中文进行C语言编程始终是一个有争议的话题:首先是能不能,能意味是中国自己的编译器。其次是中国自己的C语言编译器需不需要支持中文编程,这个就仁者见仁智者见智,各人有各人的看法了。
长缨-I号C351编译器从设计开始就把全面支持中文编程作为主要的技术要求。本文介绍使用该编译器进行C语言中文编程的方法。
二、使用英文编程的例子
为了进行对比,本文使用一个在STC8051U单片机最小开发板上运行的8个LED发光二极管左右闪动的单片机程序为例子。
(1)首先给出使用英文编程的程序例子,该程序分两个部分,下面是程序的定义部分:
Fig_01_英文1.jpg
其中第15行到第23行程序给出了程序运行的SFR定义。第26行程序是延时函数预定义。第29到35行程序是任务函数定义它的功能是按任务函数参数DT点亮LED灯,然后延时指定的时间TM毫秒。
(2)下图是程序的主函数和延迟函数部分:
Fig_02_英文2.jpg
其中主函数“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个例子就是用中文汉字来定义各种名称。下图是程序的前半部分:
Fig_03_中文定义1.jpg
其中SFR定义用中文名“端口1”代替了英文名“P1”,函数定义用中文名“毫秒延时”代替了英文名“DelayMS”,参数定义用中文名“毫秒参数”代替了英文名“TM”等等。
从已经会用C语言的程序员角度,上面这样的中文程序应该是可以接受的。
(7)下图是后半部分程序:
Fig_04_中文定义2.jpg
其中第61行用中文定义了各个变量的名称。至此上面的程序展示了用户可以定义的名称都可以使用中文汉字来定义。
(8)由于Keil的C51编译器不支持变量名等使用中文汉字,编译上面程序时会出很多“unprintablecharacter”(不可打印字符)的错误提示,见下图:
Fig_05_C51编译错误.jpg
因此第二个例子程序只能双击“长缨_I_MakeFile.bat”文件,调用长缨-I号编译生成HEX烧录文件。
四、C语言关键字用中文编程的例子
(9)长缨-I号C351编译器要支持用中文进行编程需要决定的第二个问题是对于C语言的语法关键字是用中文还是用英文。
由于在进行编译器顶层设计时最重要的要求是与Keil的C51兼容,所以笔者决定C语言的语法关键字还是只用英文,整个程序就像上面的例子那样。
(10)对于那些连关键字都想用中文汉字的用户,笔者提供利用C语言的宏定义功能来解决的方案。比如写程序时把“sfr”用“特殊功能寄存器”来代替,编译程序时用宏定义“#define 特殊功能寄存器 sfr”又重新换回英文的C语言关键字。
本节的例子C语言关键字用中文汉字增加了一个头文件“中文关键字.h”,其中包含了本节例子所包含的C语言关键字对应的中文汉字定义,见下图:
Fig_06_C语言关键字.jpg
请注意第31行的等号不是关键字,是运算符。
(11)将第2个例子中的关键字和等号用上面的宏定义替换后的部分程序如下:
Fig_07_汉字分词.jpg
对上面的程序用长缨-I编译器编译出错了,编译的信息都保存在编译信息文件“STC8U_Demo.uvproj.MSG”中,现在的出错内容如下:
Fig_08_分词出错.jpg
(12)这个编译错误是所有支持中文汉字的计算机语言编译器都面临的一个共同问题:纯中文句子断句和分词问题。
第35行程序“LED灯端口等于数据参数;”对于我们中国人来说,轻而易举地分割为“LED灯端口/等于/数据参数/;”4个词,其意义不言自明。但是如果不采用现在的AI技术,靠个人编一个计算机程序就能实现这种自动将纯中文句子正确地断句和分词是很难完成的。
笔者相信即使现在的AI技术,要实现对任意句子的中文分词也是很困难的,比如客人说“下雨天留客天留我不留”,你说客人的意思是“下雨天留客,天留我不留。”还是“下雨天,留客天,留我不?留!”,他到底留不留?
(13)因此对于长缨-I号编译器,笔者决定中文编程中分词的问题由用户自己解决,即:为了避免歧义,用户应该自己将C语言关键字、变量名和函数名等用空格或者指定的数学符号分离开来。
比如像上面的程序,用户自己将第35行程序写为“LED灯端口 等于  数据参数;”(由于分号是C语言的指定语法符号,不需要前面加空格),这样长缨-I就能正确识别并进行编译了。
(14)除了等号外,上面程序中的各种括号和分号,以及一般C语言程序中都会包含的标点符号和运算符,那么还要不要再继续“中文汉字化”下去,笔者觉得还是中国古人说的有道理:适可而止,物极必反,画蛇添足。
因此对于第一线的STC单片机工程师和程序员来说,恐怕全部都是汉字的C语言程序反而让人看不懂了。
(15)下面给出长缨-I号编译通过可以运行的C语言中文程序,欢迎各位看官评头论足:
Fig_09_中文程序1.jpg

Fig_10_中文程序2.jpg

附件:
03_长缨-I_C351编译器_中文编程方法_240806.rar (652.84 KB, 下载次数: 114)


回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:445
  • 最近打卡:2025-05-02 08:45:16

3

主题

47

回帖

428

积分

中级会员

积分
428
发表于 2024-8-6 11:17:42 | 显示全部楼层
有点意思
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-02 07:55:56
已绑定手机

19

主题

3190

回帖

4870

积分

论坛元老

积分
4870
发表于 2024-8-6 12:29:30 | 显示全部楼层
还能怎么玩啊
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:365
  • 最近打卡:2025-05-02 00:20:03

6

主题

319

回帖

2206

积分

金牌会员

积分
2206
发表于 2024-8-6 15:02:50 | 显示全部楼层
没必要非得全盘使用中文,各种语言词汇都有他自身的含意,不容易用简单的其他语言词汇替换,搞到最后都是奇怪的词语反而不方便.
我觉得只要能够支持中文变量名就已经非常好了,
要说中文编程语言,可以去看看"易语言"这个东西,已经很成熟了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:523
  • 最近打卡:2025-05-02 06:09:34
已绑定手机

34

主题

459

回帖

2219

积分

金牌会员

积分
2219
发表于 2024-8-23 13:27:31 | 显示全部楼层
没学过英文的人可以使用
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-02 11:57:49

9

主题

102

回帖

2102

积分

金牌会员

积分
2102
发表于 2024-8-24 16:42:19 | 显示全部楼层
杨老师,这个编译器加入中文,对于看不懂C语言的,感觉起到注释作用,不错的思路。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:177
  • 最近打卡:2025-04-28 20:20:32

4

主题

21

回帖

675

积分

高级会员

积分
675
发表于 2024-10-7 21:15:05 | 显示全部楼层
感觉就算变量名改成中文也得写注释,使用中文写代码也挺不顺手的

点评

西餐、中餐随你选,一样一半也可以。刀叉、筷子随你用,双管齐下也请便  详情 回复 发表于 2024-10-7 23:19
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-30 08:41:32

105

主题

1215

回帖

1万

积分

荣誉版主

积分
12882
发表于 2024-10-7 23:19:11 | 显示全部楼层
HY*** 发表于 2024-10-7 21:15
感觉就算变量名改成中文也得写注释,使用中文写代码也挺不顺手的

西餐、中餐随你选,一样一半也可以。刀叉、筷子随你用,双管齐下也请便
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-05-01 06:58:22

5

主题

184

回帖

1333

积分

金牌会员

积分
1333
发表于 2024-10-8 05:24:52 | 显示全部楼层
The primary focus of any new compiler should be ease of code sharing.

It should of course be compatible with Keil and SDCC source files, and give the same or better HEX output.

Whilst adding native language keyword support might seem useful, it rather breaks that more important easily able to share code from anywhere



Are there benchmarks comparing Changying-I C351 compiler (and assembler and linker ?)  with Keil and SDCC code output ?
Can the Changying-I C351 compiler generate compatible DEBUG files in intel OMF51 format?
Is there a Simulator planned ?

点评

(1)是否有比较Changying-I C351编译器(以及汇编器和链接器?)与Keil和SDCC代码输出的benchmarks? 对于8051指令集汇编语言,长缨-I(最新版本为 金水151)C351编译器是按照Keil的A51语法设计的,所以对于8051指  详情 回复 发表于 2024-10-8 13:05
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-30 08:41:32

105

主题

1215

回帖

1万

积分

荣誉版主

积分
12882
发表于 2024-10-8 13:05:33 | 显示全部楼层
jm*** 发表于 2024-10-8 05:24
The primary focus of any new compiler should be ease of code sharing.

It should of course be compat ...

(1)是否有比较Changying-I C351编译器(以及汇编器和链接器?)与Keil和SDCC代码输出的benchmarks?

对于8051指令集汇编语言,长缨-I(最新版本为 金水151)C351编译器是按照Keil的A51语法设计的,所以对于8051指令集汇编语言,其输出的二进制机器码与Keil和SDCC代码输出相同,benchmarks应该相同。
对于C语言,我没有测试,但是由于长缨-I没有采用任何优化措施,估计长缨-I的benchmarks应该比Keil低15%~20%


(2)Changying-I C351编译器能否生成英特尔OMF51格式的兼容DEBUG文件?
长缨-I(最新版本为 金水151)C351编译器是为STCIDE集成开发环境设计的,目前STCIDE-v0.1版本没有调试功能,因此目前没有计划生成英特尔OMF51格式的兼容DEBUG文件。



(3)是否计划了仿真器?
长缨-I(最新版本为 金水151)C351编译器主要用于STC单片机操作系统下的程序开发,我个人认为在编译环境下进行静态仿真(指调试时程序停在断点处,包括中断也停止)对操作系统进行调试意义不大,因此目前没有计划支持静态仿真

不过,我已经在我写的操作系统平台中提供了动态观测功能,可以使编程者可以实时了解系统的运行情况

回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 18:07 , Processed in 0.148454 second(s), 129 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表