在可预见的未来, 高考仍是最重要的也最有社会影响力的人才选拔机制. 很久没有关注, 最近得知高考自选科目中开始增加了编程一项(见如何评价2017浙江高考七选三科目中包含技术?). 虽然个人对编程是否应该进入高考仍有保留看法, 但至少全民(都应该可以)编程这一趋势已经很明显了. 这应该是中文编程兴起的另一个契机(前文中文编程兴起的必然性讨论了一些更技术性的原因).
看了2017年浙江的高考卷, 感觉算法/体系/基础知识比较少, 比较偏技术. 相信以后会逐渐调整. 毕竟技术更新快, 而前者更经得起时间考验也更有含金量. 个人觉得算法在短期内仍需要一个具体的编程语言作为载体, 毕竟教学实践中不可能作纯粹的纸上算法. 那么, 一个适合算法设计和实践的中文编程语言, 假如能在高考卷中使用, 相信会是一个中文编程的里程碑.
本文试图列出一些(当然绝不是全部)这一假想中的语言/开发环境的功能特性和示例, 希望抛砖引玉. 其中, 对每项功能的必需性按照一到三排列, 一最高.
版权/安全
- [一] 必须从开始就理清所有依赖库的版权问题, 为商用扫清顾虑
- [一] 杀毒软件不能误报
功能/API
- [一] 可以实现所有现有语言能够完成的功能. (注: 评论指出'所有'一词有歧义. 这里原意是指它附带的API以及可使用的第三方库的功能能够覆盖大多数应用场景) 如果这一语言的主要用途只是教学(比如LOGO), 那么它应该很难被选择为教学用的语言, 毕竟现在大环境是实用至上. 因此, 即使它本身(核心库)的功能比较局限, 只要可以无缝集成其他通用语言 (比如可以调用Java库的wkgcass/Latte-lang)即可.
- [一] 支持64位系统, 跨平台(Windows/Linux/Mac), 最好支持移动平台(即使不能, 最好提供基本的在线编程环境)
- [二] 常用功能需要中文API, 即使是封装现有API也可. 在高考题中可以看到还是不少与UI和I/O有关, 中文化争取早日覆盖常用API.
语法设计
(将在program-in-chinese/overview持续改进和更新)
- [一] 相对英文编程语言的直译, 语法应更接近中文自然语言语法, 并且包含的特殊符号尽量使用数学常用符号. 比如下面一种设想的语言(欢迎拍砖!), 与Python的二分查找对比.
选择{}作为函数体边界, 因为数学定义中常用左大括号(如下). 暂时没有想到比添上右大括号更合适的设计. 至于{}是否允许省略, 倾向于不允许, 以规避歧义. 另一种可能是类似日语编程语言"抚子" - 第三版特色初探, 不用{}而是使用关键词作为结束标志("直到这里"之类)
- 缩进量不改变语义, 仅为改进可读可选: 为避免意外的缩进错误导致的语义错误
- 用'为'替代==, 为避免误写为=导致的无心之失. 在数学中, =的相等意义与赋值更接近. 数学中>, <作为判断条件使用, 与代码中意义相同, 适合沿用. 至于'大/小于等于', '不等于', 个人倾向于直接用≥, ≤, ≠符号. 而不用>=, <=, !=. 至少搜狗还算容易打出, 虽然效率挺低. (后得知易语言IDE也会自动将>=格式化为≥)
- 避免//这种数学中没有的符号, 用'向下取整'是可读性优先于简短性
- 数组/列表下标用(), 因为它们其实是索引/下标的函数, 类似Scala设计
- [三] 是否用带空格设计, 个人认为不用强求(取决于技术可行性). 下面的语法如果不带空格, 也许会貌似自然语言而语法不够自然. 当然欢迎提出不带空格的示例程序!
- 断句是否用换行或者特殊符号, 个人倾向于避免引入额外符号
- 调用对象中的方法, 没有想到比"某实例.某方法(..)"之外的方案, 去掉"."分隔符同样会有不带空格设计类似问题, 从而间接添加了方法命名的限制
支持全/半角. 选择有, 开发环境在编辑源码时就对源码自动转换到一种格式, 或者编译时自动转换到一种格式. 个人现在感觉前者更能使源码格式统一, 但开发环境和编译器的耦合度恐怕更高. 易语言好像采用前者, 日语编程语言"抚子"-第三版实现初探好像采用后者.
定义 二分查找(数组, 目标) {
左索引 = 0
右索引 = 取长度(数组) - 1
位置 = -1
当 左索引 ≤ 右索引 且 位置 为 -1 {
中索引 = 向下取整((左索引 + 右索引) / 2)
如果 数组(中索引) 为 目标 {
位置 = 中索引
} 否则 {
如果 数组(中索引) > 目标 {
右索引 = 中索引 - 1
} 否则 {
左索引 = 中索引 + 1
}
}
}
返回 位置
}
Python:
def binarySearch(array, key):
left = 0
right = len(array) - 1
res = -1
while left <= right and res == -1:
mid = (left + right) // 2
if array[mid] == key:
res = mid
else:
if array[mid] > key:
right = mid - 1
else:
left = mid + 1
return res
性能
- [一] 为了适合算法实践, 代码的运行能如实反映算法复杂度
- [二] 绝对性能的优先级至少在前期不高, 最好做到与主流脚本语言性能在一个量级
开发环境
- [一] 界面是中文
- [一] 所有反馈信息首先有中文版
- [一] 编辑辅助功能: 代码补全和自动格式化
- [一] 调试功能: 断点调试
- [一] 完备集成最新的语言和核心库文档, 并方便在开发过程中查阅
- [二] 集成定制的输入法, 为中文代码输入进行特殊优化
- [二] 开发环境/语言/核心库版本都可以在开发环境中直接更新
- [三] 内置代码版本控制功能
项目开展与维护
- [一] 开源. 除了像M$这样有历史积累的公司, 很难想象官方会倚靠一个刚起步的初创公司对这种需要中长期支持的语言/开发环境进行维护. 为了尽快完善语言和工具链, 也必需倚靠开源社区的力量.
- [一] 源代码中尽量以中文命名, 因为目标受众是中文使用者, 自然开发社区也会以中文母语的开发者为主, 除了开发环境, 语言本身相关工具链对外部的依赖即使有也应该可以局限到独立模块, 因此中文命名的技术障碍不大.
- [一] 用哪个语言实现, 需要结合功能特性综合考虑. 一些可能的选项: C#, Java, JavaScript/TypeScript
一些相关讨论和参考:
讨论: 适合中文用户的编程语言和IDE, 侧重于现有语言/IDE不具备的特性 · Issue #11 · program-in-chinese/overview