Skip to content

infopensource/People-s-Language

Repository files navigation

人言(People's Language)

在线playground:http://101.35.56.79/

本项目设计了一种新的程序设计语言用于中国编程入门教育,并与传统编程语言和图形化编程语言进行比较,证明了“人言”更适合在中小学编程教育中普及。

一、 简介

在信息技术高速发展的时代,编程教育越来越受到人们的关注。特别是党的十八大以来,中小学的编程教育加速普及,一些地区还将“信息技术”作为一门课程纳入高考范畴。新时代的中小学编程教育该如何发展?编程教育的方式该如何提升?先前的编程工具是否能够适应新时代编程教育的需要?围绕这些问题,我们设计出了一种符合中文语法的编程语言,帮助学生不必花费大量时间去学习传统编程语言中复杂的语法,而是专注于去思考如何解决问题,真正在编程教育中学到计算机思想。

二、 已有相关语言

程序设计是将人类语言转化为机器语言的过程,工业生产上所使用的编程语言更多考虑了程序的运行效率和可靠性,因此早期程序设计语言(如C/C++等)对程序的易读性做出了妥协,采取了更接近机器语言的语法,并且要求编程者从计算机硬件的视角思考问题。而更高级的程序设计语言(如Python/Go等)虽然已经高度抽象,并且不需要再手动管理内存,但是因为历史原因仍然沿用了早期编程语言的一些语法设计(如类C语言,类BASIC语言)。这样的语法设计保证了其用于生产时的稳定性,但是要求初学者用相当长一段时间学习其语法。就编程教育而言,我们更应该注重教会学生如何运用计算机程序去解决问题,而不是像学习传统编程语言一样花费大量时间去了解程序设计语言的语法,做到“用编程学,而不是学编程”。 前人已经注意到了这个问题,并且做出了许多尝试来减轻学习者在学习语法方面的负担,例如中文编程和图形化编程。 以易语言为代表的中文编程语言,试图通过汉化中文关键字的方式来解决中国人对于英语的天然恐惧和阅读障碍,但是因为语言特性已经落后于时代,并且作者没有继续维护,未能大面积应用;而中文编程的后起之秀,如“wenyan-lang”,并未走向实用化的道路。 而在中小学编程教育中大获成功的图形化编程语言(以Scratch为例)虽然尝试通过提取模板代码并将其图形化的方式规避“编写代码”来降低入门门槛,但实际上在降低这门语言的下限的同时也降低了上限,使后期的学习曲线更加陡峭,同时也彻底走向了非实用化,原因如下:

  1. Scratch通过把代码抽象为“搭积木”的方式降低了初学者对于固定的模式代码的记忆成本。这使得程序更加呆板化、模式化。虽然记忆成本降低了,但程序反而受到了更多约束,不利于发散性的思维方式。大量的思维量被花费在了如何把一个算法套用到固定的模式上。“积木”的形式也并不是一种能让初学者直观理解的形式。虽然规避了“循环语句”“判断语句”“函数语句”他们仍需大量时间去学习“循环积木”“判断积木”“函数积木”,这种做法又引入了一层无关抽象,但没有实质的改变,更适合幼儿的思维模式,但不适合用于青少年的编程教育。又因为鼠标的效率不如键盘,这也会导致在编程者熟练之后,用鼠标拖拽“积木”反而降低了编程的效率。
  2. “图形化”实际上增加了复杂度。传统的代码形式较为单一,是一种简单的线性输入流,阅读负担较低;在编写代码时也仅需要记住每个函数有什么用途,输入代码即可。大段的功能性代码也可以直接从搜索引擎中找到并方便的复制到自己的程序中。而在图形化编程中,大量时间被花费在理解图形化工具上,而不是解决编程问题。例如:一段实用的程序中往往会出现大量函数,如果全部以图形化的方式罗列在界面上,无论是查找特定函数还是向别人分享代码都是极大的负担;而使用文字进行编程的语言可以快速通过字符串查找来定位到自己想要的代码,也可以方便的复制粘贴自己的代码分享给他人。
  3. Scratch在程序较为简单的时候尚且能够称为是降低了编程门槛,但当程序稍微复杂一些,Scratch就会带来远超等效的代码(相对于使用代码进行编程而言)的复杂度,迅速将初学者压倒。正如《计算机程序的构造和解释》(Structure and Interpretation of Computer Programs, SICP)书中所说,编程的本质是克服复杂度。Scratch中缺乏合理的抽象机制来降低程序的复杂度,缺乏数据隔离,甚至只能用全局变量返回函数结果。这对于培育编程思想和设计程序都是极为不利的。
  4. Scratch缺少大量系统函数与库函数,缺乏与系统直接交互的能力,程序也无法过于复杂,哪怕想做一个实用小工具也无能为力,因此编写出来的程序单调乏味。长此以往,学生会丧失对于编程学习的兴趣,最后导致编程教育沦为一门不得不完成的课程,学生既无法从中获得快乐和成就感,也难以从中学到真正的编程思维。

image

三、 设计思路

因此,我们决定自己研发一款符合中国国情的教学语言。我们所设计的“人言”编程语言在提高了代码易读性的同时规避了上述问题。与先前流行的“易语言”“wenyan”等中文编程语言不同,“人言”所做的并不只是简单的替换关键词,而是选择通过巧妙的设计文法,形成整套贴近中国古汉语的语法体系,将初学者在语法层面上的学习成本降低到几乎可以忽略不计,即使是一个没有经过任何计算机训练的人也能通过阅读代码知道程序在干什么。在设计语法时,我们刻意选择了便于输入的常用字,编写代码的过程中也完全无需切换输入法。简洁的语法与极高的输入效率,使得编程者的开发效率得以大幅提升。 本着让学生更好的从编程中学习到计算机思维的精神,我们选择实现一门函数式语言。因此“人言”天生就具有函数式语言的一切优势:代码简洁,接近自然语言,无副作用,更加接近计算的本质等。而语言本身又简单易学,对应用者和初学者也十分友好,非常适合作为教学语言使用。 “人言”有多种抽象方式可以很好的控制程序复杂度,例如:通过简单过程组合成复合过程;抽象出公共模式,实现为高阶函数来表达计算的一般过程;通过构造复合数据来进行细节隔离,实现数据抽象;将函数作为“一等公民”,淡化数据和过程之间的界限。而由此带来的性能开销对于一门教学语言来说几乎可以忽略不计。 同时因为依赖于Racket环境,“人言”得以获得racket的共享生态,其中包括了大量实用的库与函数,以及整套的上下游工具链。学生可以使用“人言”编写许多实用的小程序,甚至可以构建出一些大型系统,并编译为可执行文件与朋友分享,有利于培养学生对编程的兴趣和能力。

四、 语言设计

“人言”是一门图灵完备的,基于Scheme的方言Racket进行开发的函数式编程语言。 Racket是一门诞生于1995年的通用多范式编程语言,其诞生的目的就是创造其他的领域特定语言(DSL,Domain Specific Language),并且提供了优秀的集成开发环境(IDE)和包管理系统。利用其强大的元编程能力,用户可以更加简单的创造出他们自己的语言。因为,为了创造出一门更实用的语言,我们选择在Racket的基础上进行开发。 在技术路线上,我们选择实现了传统编译器的前端部分,共分为:词法分析、语法分析、中间代码生成;语义分析,解释器部分则由Racket提供(如图1所示)。

image

图1 编译流程图

image

图2 文件架构图

“人言”的主体由“main.rkt”,“tokenizer.rkt”,“lexer.rkt”,“Parser.rkt”,“Expander.rkt”,“make-ast.rkt”,“make-token.rkt”所构成。如图2所示,“人言”共有三条分支,分别是main,make-ast和make-token,其中main分支即“人言”的主分支,编写代码时需要在首行加上#lang rh;make-token和make-ast则是“人言”的两个方言,作用分别是输出词法分析产生的token和输出语法分析生成的抽象语法树,使用时分别需要在代码首行加上#lang rh/make-ast或#lang rh/make-token。 image 图3 运行效果图

运行时,源码先由Racket进行处理,当Racket识别到第一行的#lang语句时,会将源码移交给main.rkt的read-syntax函数,包含两个参数:path和port。其中path记录了源码的位置信息,用于错误处理使用;port记录了源码信息,用于接下来的编译过程。read-syntax函数则依次调用根据从tokenizer.rkt导出的make-tokenizer,完成词法分析;根据文法规则从parser.rkt导出的parse函数,完成语法分析,生成抽象语法树(AST,abstract syntax tree)。expander.rkt则提供了#%moudle-begin宏对模块进行静态分析,并根据抽象语法树展开代码。展开后的代码由expander.rkt中定义的其他宏进行处理,将语法元素转换成Racket解释器能理解的S表达式,再转交给racket解释执行。 “人言”采用了自顶向下分析的文法,为了贴近中文自然语言语法,同时保证程序的自由度,“人言”仅设有十个系统保留关键字:"以", "为", "取", "者", "之", "相", "当", "时", "否则", "引用", "导出",三个辅助定位标识符“,”“。”“;”(皆为全角),以及无实际意义的助词和连词“与”,“取”(同时作为关键词和助词存在)。“人言”文法如下:

1.	r-program : [r-import]*  [r-expr]*  
2.	@r-expr : /["取"] (r-eval | r-lamb | r-func | r-export| r-cond | DECIMAL | INTEGER | STRING | ID)   
3.	r-func : /"以" r-id /"为" [/COMMA] r-expr  
4.	r-lamb : /LAMBDA [r-id]* /COMMA [r-expr]* /END  
5.	r-eval : r-id /"取" r-arguments /"为" r-contents /"者"  
6.	       | /[COMMA "取"] [r-expr]* (/"之" | /"相") r-id  
7.	r-arguments : [r-id]*  
8.	r-contents : [r-expr]*  
9.	r-import: /"引用" (r-id | STRING)  
10.	r-export: /"导出" r-id [/"为" r-id]  
11.	r-cond:  r-if+ r-else  
12.	r-if: /"当" r-expr /"时" /COMMA [r-expr]* /SEMICOLON  
13.	r-else: [/"否则" [r-expr]* /END]  
14.	r-id: ID  
15.	r-end: END  

正因为基于Racket进行开发,“人言”共享了Racket强大的生态。Racket拥有完善的系统库和庞大的第三方社区,“人言”提供了“引用”和“导出”语句与Racket生态进行交互。用户只需要新建一个rkt文件将racket生态中的函数使用Racket提供的provide语句以“人言”的惯用形式导出,再使用“人言”提供的“引用”语句导入;或者使用“人言”提供的“导出”语句导出在人言中写好的函数,再使用Racket提供的require语句导入,即可实现“人言”与Racket之间的无缝衔接。这样省去了重新开发标准库这样巨大的工作量,也解决了新语言起步阶段语言生态差的困难。

除了支持导入导出函数以及支持判断语句作为COND函数的语法糖之外,“人言”只支持函数调用,循环语句则使用递归替代,因此“人言”是图灵完备的,同时也是无副作用的语言,有利于培养学生的编程思维,也降低了出现bug的可能性。

因为“人言”的开发环境需要通过境外网站下载,所以国内用户经常会遇到下载缓慢或者连接失败的情况。为了让用户能够更加便捷的体验到“人言”,我们还开发了在线playground,用户可以直接通过playground在浏览器中运行代码,并获得实时结果。

五、效果展示

以阶乘为例:

1.	#lang rh/make-ast
2.	引用 “math.rkt”  
3.	  
4.	以【阶乘】为,  
5.	入【甲】,当【甲】与零相【等】时,取一;  
6.	         否则取【甲】与一之【差】之【阶乘】  
7.	            与【甲】之【积】。  
8.	。  
9.	九之【阶乘】  

生成的AST为:

1.	'(r-program  
2.	  (r-import "math.rkt")  
3.	  (r-func  
4.	   (r-id 阶乘)  
5.	   (r-lamb  
6.	    (r-id 甲)  
7.	    (r-cond  
8.	     (r-if (r-eval 甲 0 (r-id 等)) 1)  
9.	     (r-else (r-eval (r-eval (r-eval 甲 1 (r-id 差)) (r-id 阶乘)) 甲 (r-id 积))))))  
10.	  (r-eval 9 (r-id 阶乘)))  

或者直接运行:

1.	#lang rh  
2.	引用 “math.rkt”  
3.	  
4.	以【阶乘】为,  
5.	入【甲】,当【甲】与零相【等】时,取一;  
6.	         否则取【甲】与一之【差】之【阶乘】  
7.	            与【甲】之【积】。  
8.	。  
9.	九之【阶乘】

得到的结果为

1.	362800 

即九的阶乘。

以上程序均可在http://101.35.56.79在线运行

image

图4 在线Playground运行效果图

六、总结与展望

在本项目中,我们对于创造一门用于新时代中文编程教育的教学语言做出了自己的尝试,并且在保留此前的编程教学语言优势的同时,成功的解决了此前的教学语言中未能解决的问题,具有很高的实用价值。但是因为时间和人手不足,且完整开发一个新的编程语言的工作量十分巨大,本项目仍然处于非常早期的阶段。“人言”的错误处理,IDE适配,语法高亮都因为时间不足无法完成;预留用于测试的接口也因为人手不足难以编写大量测试。因此“人言”很可能存在潜在的bug,尚未做好投入生产环境的准备,仅能做概念验证。 因此我们的下一步工作是在目前的基础上进一步完成人言的其他功能,增加错误处理,语法高亮,并与DrRacket进行深度适配。并且继续完善“人言”的文法,增加更多语法糖使之更接近自然语言;支持中缀表达式,使函数调用方式更加多样化;解决标识符(ID)如果不使用【】包裹可能会存在的二义性问题;以及多个相同符号相连时的化简问题。引入自然语言处理技术(NLP),实现ai自动补全和更人性化的错误处理,真正做到像写文章一样写程序。 在设计文法时,因为经验不足,“人言”混入了许多类似命令式的文法,这在一定程度上破坏了“人言”的稳定性,在下一个版本中我们会重新设计人言的文法,将其改造为真正的函数式文法。 还需要注意的是,“人言”脱胎于本文作者作为主要贡献者之一的“RuCalculus”项目,但“人言”是完全自主独立实现的语言,在易读性和教学用途上进行了特别提升。因此“人言”并不是一门设计为用于生产的语言,而是一门教学语言,其目的是为了让学生能以更低的门槛领略计算机思维和轻松的定制出自己的小程序,在熟悉“人言”之后学生可以进一步学习“RuCalculus”或者转而学习其他语言用于生产用途。 “人言”不仅可以在青少年编程教育中应用,老年大学和职业教育中“人言”也有潜在的发展前景。

七、致谢

在完成课题的过程中,有许多人对我做出了极大的帮助。“新竹高于旧竹枝,全凭老干为扶持”,我的两位指导老师:卢老师和杨老师从课题选题,一直到完成课题都一直陪伴在我的身旁进行指导。无论是在课题中,还是在平时的学习生活中他们都给予了我极大的帮助。“人言”项目的前身,“RuCalculus”的另外两位贡献者,弦语蝶梦工作室的创始人许兴逸和浙江大学的计算机博士sol在技术上给予了我很多指导,并且多次在项目步入歧途之前把它纠正回原轨。尤其是sol,我在与他讨论的过程中诞生了这个项目的灵感,并且取了“人言”这个名字,没有他将不会有这个项目的诞生。另一位为本项目做出贡献的人是琉狸SAMA,在他的帮助下才有了“人言”的在线Playground。最后要感谢的是StackOverflow社区的Shawn和Will ness解决了项目中最困扰我的两个关键问题,虽然国籍不同,但是这两个来自不同国家,素不相识的陌生人不求回报的对我提供了最大的帮助。  

参考文献

[1] Abelson H, Sussman G J, Sussman J. Structure and Interpretation of Computer Programs[M]. 1. MIT Press, 1985.

[2] Matthew Butterick. beautiful racket[EB/OL]. [2022-7-19]. https://beautifulracket.com/.

[3] Community. Racket, the Programming Language[EB/OL]. [2022-7-19]. https://racket-lang.org/.

[4] ProjectDimlight,Seng-Jik许兴逸, infopensource. RuCalculus[EB/OL]. [2022-7-19]. https://github.com/ProjectDimlight/RuCalculus.

[5]Community.Racket(programminglanguage)[EB/OL].[2022-7-20]. https://en.wikipedia.org/wiki/Racket_(programming_language).

[6]李阳. 计算思维导向的跨学科儿童编程教育模式研究[J]. 现代教育技术, 2020(6):19-24.

[7]石晋阳.儿童编程学习体验研究[D].南京:南京师范大学,2018:12

[8]张建军, 王有升. 儿童编程教育的育人价值探析[J]. 中国校外教育, 2022(2):63-71

[9] [美]约翰-杜威.民主主义与教育[M].王承绪,译.北京:人民教育出版社,1990

[10]Lingdong Huang. 文言 wenyan-lang[EB/OL]. [2022-7-18]. https://github.com/wenyan-lang/wenyan.

[11]吴涛. 易语言[EB/OL]. [2022-7-20]. http://www.dywt.com.cn/.

[12]UltimatePea. 豫言[EB/OL]. [2022-7-20]. https://github.com/yuyan-lang/yuyan/.

[13]陈芳, 乔晶. 基于儿童中文编程的项目学习与实施[J]. 小学教学研究·理论版, 2021(9):29-31.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages