Skip to content

一个通用型的中文编程语言的语法设计

Xuan Wu edited this page Jan 9, 2018 · 4 revisions

此文在通用型的中文编程语言探讨之一: 高考的基础上继续细化和改进, 在未成型之前暂时不进行版本控制.

[一] 相对英文编程语言的直译, 语法应更接近中文自然语言语法, 并且包含的特殊符号尽量使用数学常用符号. 比如下面一种设想的语言(欢迎拍砖!), 与Python的二分查找对比.

  • 选择{}作为函数体边界, 因为数学定义中常用左大括号(如下). 暂时没有想到比添上右大括号更合适的设计. 至于{}是否允许省略, 倾向于不允许, 以规避歧义. 另一种可能是类似日语编程语言"抚子" - 第三版特色初探, 不用{}而是使用关键词作为结束标志("直到这里"之类) 绝对值函数数学定义
  • 缩进量不改变语义, 仅为改进可读可选: 为避免意外的缩进错误导致的语义错误
  • 用'为'替代==, 为避免误写为=导致的无心之失. 在数学中, =的相等意义与赋值更接近. 数学中>, <作为判断条件使用, 与代码中意义相同, 适合沿用. 至于'大/小于等于', '不等于', 个人倾向于直接用≥, ≤, ≠符号. 而不用>=, <=, !=. 至少搜狗还算容易打出, 虽然效率挺低. (后得知易语言IDE也会自动将>=格式化为≥)
  • 避免//这种数学中没有的符号, 用'向下取整'是可读性优先于简短性
  • 数组/列表下标用(), 因为它们其实是索引/下标的函数, 类似Scala设计
  • [三] 是否用带空格设计, 个人认为不用强求(取决于技术可行性). 下面的语法如果不带空格, 也许会貌似自然语言而语法不够自然. 当然欢迎提出不带空格的示例程序!
  • 断句是否用换行或者特殊符号, 个人倾向于避免引入额外符号
  • 调用对象中的方法, 没有想到比"某实例.某方法(..)"之外的方案, 去掉"."分隔符同样会有不带空格设计类似问题, 从而间接添加了方法命名的限制
  • 支持全/半角. 选择有, 开发环境在编辑源码时就对源码自动转换到一种格式, 或者编译时自动转换到一种格式. 个人现在感觉前者更能使源码格式统一, 但开发环境和编译器的耦合度恐怕更高. 易语言好像采用前者, 日语编程语言"抚子"-第三版实现初探好像采用后者.
  • 不提供类似C或Java中(xx类)形式的类型强制转换. 一方面避免()的滥用, 一方面增强可读性, 比如(xx类)y.z的转换对象是y还是z不一目了然. 具体语法待定.
  • [三]语法糖: 复用区间的概念和符号. 比如:
如果 x 在 [1, 2]

等同于Python中:

if x >= 1 and x <= 2:

类似在循环中:

当 x 在 (1,2) {...}

等于Python中

while x > 1 and x < 2:

二分法示例代码:

定义 二分查找(数组, 目标) {
  左索引 = 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