avatar Nihil

Nichts Hsu

  • 首页
  • 子域
  • 分类
  • 标签
  • 归档
  • 关于
首页 为什么我反对炒作中文编程
文章

为什么我反对炒作中文编程

发表于 2023/02/01
作者 Nichts Hsu
17 分钟阅读
为什么我反对炒作中文编程
为什么我反对炒作中文编程

什么是中文编程

中文编程(或者称为中文编程语言)是指使用中文来书写的程序设计语言,其目的是为了减少对英语的学习,将精力集中在程序设计上,并且便于程序交流和代码维护。

摘自百度百科。

我认为中文编程可以从浅入深地划分为三种类型:

  1. 使用中文标识符
  2. 使用中文关键字
  3. 使用中文语法

使用中文标识符

这种中文编程是入门门槛最低的:绝大部分现代语言的编译器都支持 Unicode 标识符,以 Python 举例:

1
2
3
4
5
6
7
import types

打印 = print
学生 = types.SimpleNamespace()
学生.名字 = "张三"
学生.年龄 =  14
打印("学生的名字是%s,%d岁。" % (学生.名字, 学生.年龄))

如果只是想达到“减少对英语的学习,将精力集中在程序设计上,并且便于程序交流和代码维护”的目的,我认为到此为止就 OK 了。虽然语言的关键字还是英语,但是一门语言总共也就几十个关键字,用不了几个脑细胞的。当然,库的调用也是一个问题,毕竟人库作者可没有理由去用中文标识符,不过话说回来,如果有人真的想为这种“中文编程”做贡献,那他完全可以考虑把常用库全部用中文标识符重写一遍来造福世界对吧(笑)。

不过总的来说,我并不反感使用中文标识符的行为,无论如何,总比你写拼音或者写一个不知所云的单词当标识符要好得多。

使用中文关键字

谈到这个分类,无论如何也无法绕开那个“著名”的语言——易语言。

当然,我完全没有学过易语言,所以我只能从网络上搜索一个 Hello World 程序来展示:

1
2
3
4
5
6
7
公开 类 启动类
{
    公开 静态 启动()
    {
        控制台.输出行("你好世界!");
    }
}

从这段代码中我们就可以很容易看出这一类“中文编程”的问题:语法上照抄“英语编程”语言,在中文词语中引入了诸如空格、括号、小数点等语法,也完全不符合中文的文章文法,导致其在阅读上并没有什么明显的优势。用一句难听一点话就是“不伦不类”,完全不值得专门为了这种“中文编程”创建一门新的编程语言。

对此,我的评价是:不如 C 语言一根毛。与其去搞什么“中文编程语言”,不如把 C 语言的关键字全部 #define 成中文存在一个头文件里,想用“中文编程”的时候包进来就行了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#define 整数 int
#define 主函数 main
#define 字符串 char*
#define 指针 *
#define 返回 return
#define 以及 ,
#define 结束 ;
#define 入块 {
#define 出块 }
#define 打印 printf
#define 零 0
#define 换行 "\n"

整数 主函数(整数 参数数量 以及 字符串 指针 参数) 入块
    打印("你好世界" 换行) 结束
    返回 零 结束
出块

Unix/Linux/MinGW 用户请注意,GCC 在 10.0 之后才支持 Unicode 标识符。

使用中文语法

在这一类别中,令我印象深刻的是文言,这是官网的一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
吾有一術。名之曰「埃氏篩」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
    吾有一列。名之曰「掩」。為是「甲」遍。充「掩」以陽也。
    除「甲」以二。名之曰「甲半」。

    有數二。名之曰「戊」。恆為是。若「戊」不小於「甲半」者乃止也。
        有數二。名之曰「戌」。恆為是。若「戌」不小於「甲半」者乃止也。

            乘「戊」以「戌」。名之曰「合」
            若「合」不大於「甲」者。
                昔之「掩」之「合」者。今陰是矣。
            若非乃止也。
        加一以「戌」。昔之「戌」者。今其是矣云云。
    加一以「戊」。昔之「戊」者。今其是矣云云。

    吾有一列。名之曰「諸素」。
    昔之「戊」者。今二是矣。恆為是。若「戊」等於「掩」之長者乃止也。
        夫「掩」之「戊」。名之曰「素耶」。
        若「素耶」者充「諸素」以「戊」也。
    加一以「戊」。昔之「戊」者。今其是矣云云。
    乃得「諸素」。
是謂「埃氏篩」之術也。

施「埃氏篩」於一百。書之。

然而在我看来,使用类似文言文的语法也是一种相对取巧的行为,因为文言文的结构相对于白话而言比较固定,例如 吾有一術名之曰「埃氏篩」,那么只需要简单地把 吾有一術名之曰「*」 当做一个语法进行匹配,替换成其他语言对应的语法即可;但是如果使用白话的话,同一个意思用白话能出现多少种表达,你说 我有一个方法叫做“埃及筛”,我说 我有一个叫做“埃及筛”的方法,他说 俺有一方法唤“埃及筛”,如果还是像文言一样,限制你只能使用某种特定的结构,那么这会极大地增加学习成本。

另一方面,使用中文的语法结构对于词法分析器而言也是灾难,因为拉丁语系的编程语言中天然带有使用空格来区分不同 token 的特性,在同一个 token 中也可以使用首字符大写的方式作为单词的边界(虽然现在有越来越多的语言都更提倡蛇形命名而不是驼峰命名);而正常的中文语句中,我们区分词语的边界几乎纯粹依赖于“经验”,想让词法分析器拆分 token 几乎是天方夜谭,所以你可以看到,在上面的文言代码中使用了许多的 「」 符号来协助词法分析器对 token 进行拆分。

不过,这个分类上有一个超级进化的概念,叫做自然语言编程(Natural-Language Programming),它与传统的基于词法分析器和语法树的编程方式不同,它应当能够理解语句所表达的真实含义而不仅仅只是文字匹配。曾经 chatGPT 的出现让很多人看到了曙光,但是实际使用了一下之后又感觉还完全差的太远,感觉至少二三十年内自然语言编程是没有希望成为生产力工具的。

但这并不是重点,如果你真想通过枚举的方式把各种可能的白话语法都塞进词法分析器里,也不是不可以对吧,比如 kæ 语言 就在做类似的事情。

那什么才是重点呢?是生态。生态才是吸引人使用这门编程语言的关键。例如 C++ 被人骂了这么多年,数不尽的编程语言打着要取代 C++ 的名号推广自己,为什么事到如今 C++ 仍然保有全编程语言中第一梯度的使用率?能跟 C++ 比用户量的,只有 Python,Java 和自己的前辈 C 语言。答案其实已经很明了了,那就是生态。如果一门编程语言,想写这个不支持,想写那个找不到库,你还有这个心情继续用它吗?中文编程语言,最大的窘境莫过于此,你弄出来了,没生态,就只能是个玩具语言。

那有人说,所有编程语言最开始不都是这样的吗,你怎么就唯独不看好中文编程语言呢?是的,除了像 Kotlin,TypeScript 这种直接建立在 Java,JavaScript 生态之上的后继语言之外,绝大部分语言最开始都是 0 生态的。这个阶段,编程语言吸引人的最大特色就是自身的理念,换句话来说就是相比于现有的语言,我这个新语言解决了哪些哪些痛点,那么那些正在被这些痛点所折磨的程序员们就很容易被吸引过去为其建立生态。那么中文编程语言解决了什么痛点呢,解决了程序员不会英语的痛点…呃,我并不否认这是一个痛点,但是对于有一定资历的程序员而言,这种痛点相比于语法、生态上的痛点而言轻如鸿毛,反而更是那些刚刚入门编程的新人们的痛点(总有人觉得自己学不会高数是因为高数用了字母符号)。因此中文编程语言对老程序员的吸引力极低,而吸引的这一批新人程序员,对于建设生态而言几乎是没有作用的,而且这些新人程序员们最终也会为了自己的发展和前途选择离开,回归到常用编程语言之中。没有生态->吸引不到用户->更加没有生态,这种恶性循环目前是每一个中文编程语言都无法逃脱的命运。

为什么我反对炒作中文编程

两个字:没用。至少现阶段没用。

很多营销号炒作的所谓“中文编程语言”,大都只停留在使用中文关键字这个阶段,我的评价一直都是:不如 C 语言一根毛。如果你发自内心地觉得自己学不好编程是因为关键字都是英语的,那我只能友善地建议你早点转行,你可能真的不适合当程序员。

知乎上某些关于“中文编程语言”的回答也是令我大开眼界,连“自主研发”,“技术封锁”都讲出来了,令我怀疑他究竟有没有读过计算机相关专业,但凡学过《编译原理》这门课就不可能说出这种蠢话。一门编程语言的核心是它的设计,难道大漂亮国还能限制你思考不让你设计语言了吗?编译器的实现技术更是早就连底裤都不剩了,再不济,Github 上那么多开源的编译器,什么 GCC,rustc,您就不肯去下载下来看一看吗?谈什么“自主研发”,“技术封锁”,这就是典型的外行人指导内行人。每当这时候,我都觉得我 19 年注销知乎账号是极为正确的选择。

如果你真的决心成为一名程序员,我建议你不要去想这些乱七八糟没有用的,乖乖选一个常规语言学习,比如 C,Python 啥的才是正途。顺便一提,我不建议一个编程小白去接触 Rust,虽然我最喜欢做的事情就是吹 Rust,但是这玩意对于没有编程经验的人而言就是来一个劝退一个,来两个劝退一双。

杂记, 其他
python c++ 编程语言
本文由作者按照 CC BY 4.0 进行授权
分享

最近更新

  • 『I Wanna』 Best Bye To 2016
  • [译] Rust 中的内联
  • [Rust] 幽灵索引类型与匿名结构体
  • [C++] 深入了解左值与右值
  • Android.bp 中启用 openmp
外部链接
  • 996.icu
  •  此博客的 Github 仓库
  •  Olimi 的个人博客

文章内容

相关文章

2023/07/18

[C++] 不使用标准库和 lambda 实现柯里化

限制 由于 C++ 提供了 lambda 语法和强大的 functional 库,如果不做任何限制的话,那么实现柯里化是一件非常简单的事情。本文注重于介绍原理和过程,而不是最终结果,因此,让我们来做一些大胆的限制: 禁止使用任何标准库组件 禁止使用 lambda 语法 实现 Function 事实上,在我之前的文章 [C++] std::function 是如何实现 la...

2023/06/28

[C++] 深入了解左值与右值

C:左值与右值 最初,C 语言中的左值(lvalue)意味着任何可以赋值的东西,因为它们可以放在赋值等号的左边,因此它们被命名为左值;相反地,那些只能放在赋值等号右边的东西就被称为右值(rvalue)。 时过境迁,随着 C 语言的版本迭代,这种分类方法已经不再具有价值,左值和右值的定义也随之发生改变。 但是在开始之前,我们需要特别明确一个概念:左值和右值在 C/C++ 中是表达式(ex...

2023/04/24

初探 C++20 Coroutine

前言 近段时间研究了一下 C++20 的协程(Coroutine),大概了解了其中的工作原理,做一下记录。 初次接触 Coroutine 时,给我的感觉是一脸懵逼的。和其他语言简单的 async、await 不同,想要使用 C++20 的 Coroutine,它要求你定义一个包含 promise_type 的类型,其中 promise_type 又需要至少包含 get_return_ob...

记录在 Qt 重写事件时犯的蠢

[Rust] 当实例被移动时,究竟发生了什么?

© 2024 Nichts Hsu. 保留部分权利。

本站采用 Jekyll 主题 Chirpy

热门标签

编程语言 教程 rust c++ android c++20 usb 翻译 linux qt

发现新版本的内容。