关于基于中文伪代码的编程语言的设想

背景

从我开始接触编程开始,“中文编程”这样的说法就有一些人在讨论了。那时候甚至已经有成熟的实现,最有名的是易语言。虽然它由于各种原因(比如被很多人拿去写外挂写病毒、收费、从语言形式上看像是套壳的已有语言)被人诟病,但是就生态、难易程度上来说,还是可圈可点的。

到了现在,得益于 Unicode(尤其是 UTF-8)的广泛使用与支持,我们能够在许多语言中使用非 ASCII 的字符——当然包括中文字符——定义变量、函数、类,甚至是关键字。不过,由于语言的已有语法都是基于英文的,而且中英文状态下的标点符号是不一样的,这样的支持并不能带来什么便利。

总之,从生态、效率上说,搞中文编程并没有什么吸引力。

不过我认为可以在一个特定方面进行编程的中文化——教育。

高中数学的必修 3 中有算法的内容,在人教 A 版中是用 BASIC 写的程序语言。我记得当时讲到这里的时候,老师用的是 QBasic 进行代码的演示。

QBasic

不过,QBasic 在现在具有很大的局限性:首先,它是 90 年代的程序了,是 16 位的程序,如果是 Windows 8 以上的系统的话,32 位的系统需要装 NTVDM 才能运行,64 位的压根运行不了(这里不考虑虚拟机和 DOSBox 等方法);其次,它只能运行于 DOS 或者是 Windows 上,不能运行于其他系统(虽然可以考虑其他的 BASIC 实现)。

有人可能会说:用其他的语言(如 C、Python、JS)不就行了?我觉得如果是数学的话,还是以数学的方式讲解好一点,如果用它们,势必要讲解很多其他与算法无关的东西,这样会降低效率。

另外,我认为如果作为教学的话,用中文来表达的话更好,这样通过伪代码就可以进行演示。但是,不能仅仅把英文指令翻译成中文,这样是换汤不换药的。我们需要新创造一个语言。

要求

这个语言的要求如下:

  • 第一定位为教学用编程语言,所以要考虑使用群体。
  • 中文表达。当然,也要兼容英文的表达。如果可能,可以以此框架开发其它语言的类似编程语言。
  • 以伪代码的形式书写,尽量符合中文的语法、习惯表达,让不懂算法的人也能够看懂。
  • 与此同时,关键字要规范。
  • 由该语言写出的源代码是纯文本的,能够被支持 UTF-8 字符集的纯文本编辑器直接读写。
  • 标点符号要兼容中文状态和英文状态的,免得切换输入法。

以下举一例供参考(本例以《啊哈!算法》第 18 - 19 页的快速排序算法为蓝本进行改编。当然,这仅仅是我临时想出来的参考,设计编程语言需要更多的考虑,而且就算是以下的示例,也不仅有唯一的写法):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
【这里相当于C语言的主函数】
定义名为i、j、排序数列、排序数列文本的变量;
输入排序数列文本,提示“输入待排序数列的值,数列中的值为整数,以逗号分隔,两边用方括号[]包围:”;
排序数列=排序数列文本转列表;
遍历排序数列中的所有项,定义一次遍历中,被遍历到的项为数:
如果数不是整数:输出“输入错误”,退出;
快速排序,左值为1,右值为排序数列的长度;
输出排序数列。

【以下是快速排序的函数。
这是一段注释。】
定义名为快速排序的函数,参数有左值、右值:
定义名为i、j、t、临时值的变量; 【变量名可以是中文也可以是英文】
如果左值大于右值:返回;
临时值=排序数列中编号为左值的值;
i=左值,j=右值;
当i≠j时,进行以下循环:
当排序数列中编号为j的值大于等于临时值,且i<j时,进行以下循环:j=j-1;
当排序数列中编号为i的值小于等于临时值,且i<j时,进行以下循环:i=i+1;
如果i<j:
t=排序数列中编号为i的值;
排序数列中编号为i的值=排序数列中编号为j的值;
排序数列中编号为j的值=t;
排序数列中编号为左值的值=排序数列中编号为i的值;
排序数列中编号为i的值=临时值;
快速排序,左值为左值,右值为i-1;
快速排序,左值为i+1,右值为右值。

实现

对于这种语言的实现,因为仅作为教学用,所以性能方面不需要太多的考虑——写编译器可以,写解释器也可以。我们甚至可以凭借已有的解释型编程语言来书写该语言的解释器,这时该语言成了二重解释型编程语言。

我认为最好写类似于 Python、JS 这样的解释器,并且带有交互模式——可以逐步输入语句,观察每次的返回值。与此同时,编译器或解释器要兼容多平台,参数务必简单易懂。

目前想到的就这么多,欢迎各位补充一下。由于我没时间,所以也不太可能去自己做一个这样的语言和实现,还希望有人能够作为一个开源项目做出来,造福社会。

参考资料