多语言编程的设想:将变量名与自然语言解耦 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
这是一个专门讨论 idea 的地方。

每个人的时间,资源是有限的,有的时候你或许能够想到很多 idea,但是由于现实的限制,却并不是所有的 idea 都能够成为现实。

那这个时候,不妨可以把那些 idea 分享出来,启发别人。
Mindjet
V2EX    奇思妙想

多语言编程的设想:将变量名与自然语言解耦

  •  
  •   Mindjet 2020-08-25 20:03:29 +08:00 5360 次点击
    这是一个创建于 1878 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前排提醒,怕来低级黑

    1. 中文编程主要是用于变量名,在义务教育普及的年代,没人想改关键字。
    2. 中文编程普及的前提是编译器支持 UniCode,已经实现。但还有很多问题尚待解决,下文说的是重要问题之一。
    3. 中文在某些情况下可能优于英文,并不是要在任何场景下使用。

    重要问题

    用更熟练的语言思考,对于提高思考的质量和速度都有很好的帮助[1]。

    由于中文在编程界不是通用的语言,所以用它编程的重要问题是 没有办法和其他国家的人进行交流,老外一看变量名都是方块字,估计直接劝退了。

    软件界面多语言已经很常见了,代码也可以有这个思路。

    让自然语言和编程语言在写变量名方面解耦,可以先用母语写变量名,并用来思考编程问题,发布的时候,然后再逐渐翻译,就像现在的软件那样。

    变量名与自然语言解耦的好处

    1. 提升命名质量:
      • 专心思考:由于代码和自然语言解耦,可以用专门时间来思考变量名问题,而不是在思考编程问题,手忙脚乱的时候,同时考虑命名和翻译两大问题。
      • 后期修改:后期修改非常方便,当有灵感的时候修改 XML 文件就行,不用打开 IDE 重构。
      • 全球协作:由任何人提出 PR 随时修改英文变量名,总有人能比你想到更好的,比如英文更好,或者就是刚好有灵感。
    2. 提升编程体验:英文不熟练人,能很好的腾出工作记忆,在编程的时候,更好的专注于编程本身。
    3. 隐秘使用:如果周围的环境对中文变量名不够友好,可以自己用中文提交代码的时候用英文。
    4. 全球化支持:同一段代码不仅有中英双语,其他国家的人只要是有这个意思,也可以快速的进行翻译。GUI 软件常常会支持好几十个国家的语言,那么代码也可以。

    可能的实现途径

    JetBrains 系的 IDE,都有重构的功能,调用重构功能换变量名,应该就能实现。

    代码混淆器,好像会替换变量名而让软件功能保持不变,如果有开源的,应该可以利用。

    注释 1

    ...

    一个是 Leontiev 通过研究发现,在进行外语交流时,有一个把母语思想用外语形式表达之前的一个“过渡阶段”,在这个时候才用外语思维。其他时间一般都用母语思维。这也就是说,交流前的深度思维,或者“筹划阶段”,一般都是用母语思维的。但 Leontiev 研究的对象大部分都是使用“翻译法”学外语的。那么他研究的这种存在“过渡阶段”思维的对象,是否是因为用“翻译法”学外语造成的呢?这一问题成为了 Loentiev 研究结论的致命伤。

    另一个是 John-Steiner 提出的阶段性和统一性的理论:外语初学者习惯用母语思维来帮助理解外语,当达到中级阶段时,就会尽量避免依赖翻译而直接使用外语思维来理解外语,但真正到了高级阶段,大脑中的母语和外语形成的高度联系统一的“语义”系统,双语者可以很自由随意地使用两种语言代码。

    研究表明,有经验的翻译人员在翻译工作中,已经做到了可以表达超出单词表面意思的直译,达到深度含义的意译的翻译水平,指的就是这个高级阶段。许多对双语流利的人的研究也都显示:在思考问题时,经常会没有意识到自己刚才到底在用哪种语言思维或可能两种都使用了。

    ...

    《找对英语学习方法的第一本书》

    如果大多数英语不好的人都会用母语思维,然后再用翻译形成英语,那么根据工作记忆有限的事实,直接用母语思考,有可能会减轻负担,从而提高思考的质量。


    简单的查了一下,Multilingual variable name,和“多语言变量名”,好像没有发现类似的项目,所以将这个灵感发出来,如果有精通写 IDE 插件,这方面的人,也许会有点兴趣吧。

    37 条回复    2020-08-29 11:46:43 +08:00
    Accessing
        1
    Accessing  
       2020-08-25 20:10:02 +08:00
    有点意思
    CrazyMoon
        2
    CrazyMoon  
       2020-08-25 20:16:22 +08:00
    好想法,之前虽然有类似的帖子,但只说中文命名,境界不如楼主的多语言编程
    Mindjet
        3
    Mindjet  
    OP
       2020-08-25 20:21:42 +08:00
    这里说的用母语思考效率可能更高,指的是英语比母语熟练度明显差的,大多数人可能都会这样,因为毕竟在国内的环境中,练习的机会少很多。

    如果英语和母语已经差不多熟,那么不需要。
    gggxxxx
        4
    gggxxxx  
       2020-08-25 20:38:13 +08:00 via iPhone   10
    为啥总有人把编程语言和人类常规语言做类比?
    编程语言虽然字面有语言这个词,但是本质上是数学公式啊。理论上任何一个编程语言可以把源代码替换成任何国家文字而完全不影响使用。这就跟全世界的数学内容都一样但是大家约定统一用英语符号和阿拉伯数字表示是一样的原理。你学中文版数学和英语版数学没有任何差别。
    tuchg
        5
    tuchg  
       2020-08-25 21:08:12 +08:00 via Android
    这个是个好想,点赞,稍微想了下 jetbrains 的实现没毛病,问题不大
    哪段时间有空可以试着开发开发
    lance6716
        6
    lance6716  
       2020-08-25 23:31:18 +08:00 via Android
    啥意思,装一个谷歌翻译插件?
    secondwtq
        7
    secondwtq  
       2020-08-26 02:18:10 +08:00
    这个不是什么新鲜玩意。
    ”界面多语言“和”符号多语言“,以及”编程语言多语言“其实可以统一起来。

    现在 DCC 工具流行使用节点网络,你把软件汉化了,那些节点也汉化了。这就同时实现了界面、符号和编程语言的多语言。
    推而广之,编程语言和库本身也是一种”界面“,可以应用界面多语言的实践。节点网络或可视化的好处在于,因为键盘主要只需要输入一些数字(其实数字一般都是拖出来的 ...),没有输入方面的破事。不过我觉得这是现有实现的不足,可能不是特别大的问题。

    这里指的是接口部分,至于实现我倾向于保持简单直接。这里的问题是实现一般只是维护者在折腾,变动又比接口更频繁。折腾的性价比远不如接口高。
    ericls
        8
    ericls  
       2020-08-26 03:16:33 +08:00
    感觉光是变量名所使用的语言对思考的关系不大
    以前学数学的时候也是 x y z a b c 和一些希腊字母,没有觉得有什么 overhead
    Mutoo
        9
    Mutoo  
       2020-08-26 07:56:46 +08:00
    1 )基乎所有算法都可以用母语描述伪代码,而编码的过程实质上只是一种翻译过程。如果你不翻译名词也不会有什么大问题。
    不过实际工作中的编程很少直接编写算法,大多是 CRUD,你怎么命名只要团队里的人没意见就行了。
    如果你想发布一些开源框架,而英文又不好,那结果只能是小打小闹,对世界也没啥影响。

    2 )另外翻译本身是一种多对多的关系,一致性非常差,如果把这东西应用在编码上,各种冲突肯定是恶梦。
    sagaxu
        10
    sagaxu  
       2020-08-26 09:00:07 +08:00 via Android
    变量名多语言之后,如果输出一个 lib,对外接口用哪种语言命名?恐怕还是少不了提供 ascii 字符集内的命名。
    Mindjet
        11
    Mindjet  
    OP
       2020-08-26 09:10:10 +08:00
    案例畅想:假设我今天决定使用中文编程,以后的代码都是中文的

    1. 闭源公司项目:如果在公司里环境允许用中文那么很好,现在就可以用了;如果公司不让用,那么有了这个项目之后就可以偷偷的用,自己用中文写,在任何时候都可以改成英文的变量名,然后再提交。(可能是零碎时间,也可能是很大的空闲,这个无所谓,因为已经解耦了,可以随时随地改)

    2. 开源项目:用中文编程后,首先应该写英文的 README 等内容,让外国人检索到,然后就是写文档,但这些部分的确已经解耦了,所以完全不存在问题,很简单的就可以翻译过来。真正的问题是我写的代码别人看不懂,而且我也不好翻译,因为翻译起来太麻烦,有了这个项目之后,我就可以随时随地翻译。
    murmur
        12
    murmur  
       2020-08-26 09:15:02 +08:00
    以后的代码页是 i18n 的?有点过了
    Mindjet
        13
    Mindjet  
    OP
       2020-08-26 09:21:54 +08:00   1
    以后还是都在 GitHub 讨论吧,V2EX 不能编辑的设计,可能不太适合讨论这些问题,因为如果不能快速发帖就会被淹没在楼层中,但想法是需要常常修正的。
    https://github.com/program-in-chinese/overview/issues/179
    misaka19000
        14
    misaka19000  
       2020-08-26 09:25:43 +08:00
    好奇楼主用中文编程有多久了,有 1 年了吗,是否清晰的了解了中文编程的利与弊呢?

    我曾经用中文写过半年的代码,感觉中文编程毫无意义
    takemeaway
        15
    takemeaway  
       2020-08-26 09:32:18 +08:00
    4L 说得很对,编程语言本质上并不是语言。
    所以跟你中英文没有关系。
    hs0000t
        16
    hs0000t  
       2020-08-26 10:01:43 +08:00 via Android
    如果能有多语种变量名对照表就更好了,根据 IDE 中母语的设置,自动载入不同的代码语言配置文件,并替换和联想变量名,可能还会催生出一个“代码翻译”的职业来
    Halohoop
        17
    Halohoop  
       2020-08-26 10:11:44 +08:00
    4L 属于降维解读,个人觉得都对,不过是一个从宏观角度去聊,一个从深入编程细节去聊,都有意义。
    levn
        18
    levn  
       2020-08-26 10:56:14 +08:00
    PerlYuYan 是一个可以令人使用文言文开发 Perl 语言程序的 Perl 组件,由唐凤于 2002 年 1 月发表,只花了两个小时就编写完成。它是中文编程语言的尝试。作者利用中文的性质,将许多指令改成以汉字来表示,形成了文言文的效果。

    五言诗范例如下:

    #!/usr/local/bin/perl
    # The Sieve of Eratosthenes - 埃拉托斯芬筛法
    use Lingua::Sinica::PerlYuYan;

    用筹兮用严 井涸兮无碍。
    印曰最高矣 又道数然哉。
    截起吾纯风 赋小入大合。
    习予吾阵地 并二至纯风。
    当起段赋取 加阵地合始。
    阵地赋筛始 系系此杂段。
    终阵地兮印 正道次标哉。
    输空接段点 列终注泰来。
    timothyqiu
        19
    timothyqiu  
       2020-08-26 12:00:12 +08:00   1
    在循环里写 i 的时候,就已经人脑解耦过一次了,我们写的既不是 index 也不是「索引」。

    这就像数学一样,x = sin(BAC) 初到我国时会把它换成 甲=sin(丑子寅),但现在已经没人这么用了,因为一来写起来麻烦,二来交流起来需要翻译一次很麻烦。
    charten
        20
    charten  
       2020-08-26 13:37:39 +08:00
    想到现在的前端 web 项目都是基于 webpack 打包,babel 编译混淆,实际上 js 源码写不写中文变量名函数名并不影响最终输出的 js 代码。。。
    kiroter
        21
    kiroter  
       2020-08-26 17:24:25 +08:00   2
    说中英没差别的,角度太偏,主要集中在了写上,就写来说中英确实不怎么重要,到写这步时说明你脑子里已经构思完成了。中写还是英写区别确实不大。但换一个角度,读。那就明显不一样了。读别人代码,首先脑子里就是空的,你要解析代码再在脑里构思,这里就明显多了一步中英转换,这里影响很大。关键词还好,固定的,但变量就不一样了,就要去释放一遍转中文然后脑里构思。遇到大段注释那就更慢了。要是母语那一目十行就看完了,母语就少了一步转换。
    iConnect
        23
    iConnect  
       2020-08-26 18:00:42 +08:00 via Android
    中文编程和英语编程对母语不同的人来说,门槛是不一样的。这方面对国人的确不利,没办法,近代数理化大多是老外搞出来的,只好用一堆稀奇古怪的符合来表达。回过头看了一下周髀算经,发现也行正式汉字是象形文字,不利于抽象化表达,而哪些希腊字母,阿拉伯符合本来就是抽象的,所以,比较容易表达。
    sillydaddy
        24
    sillydaddy  
       2020-08-26 18:16:22 +08:00
    @kiroter #21,说得有道理,至少读的时候,母语应该可以做到快速扫掠。
    @Mindjet 楼主有没有实际的代码例子? 可以把代码贴出来,直观感受下。刚才我看了下面的代码示例,
    https://github.com/program-in-chinese/study/blob/master/1-%E5%9F%BA%E7%A1%80/%E5%9B%BE%E7%89%87%E5%A4%84%E7%90%86/%E7%BC%A9%E6%94%BE.py
    但代码量比较小,不能形成视觉冲击力,尤其是关键字还保留着 english 的。

    这个转换让我想到一个例子,就是目前使用的键盘,通过重新排布按键,打字速度是可以有很大提升空间的,但就是因为已经先入为主,导致现在几乎没办法更换因为带来的好处不足以克服惯性。母语编程是不是也属于这类呢?
    gggxxxx
        25
    gggxxxx  
       2020-08-26 21:14:26 +08:00
    我算知道为啥那么多人纠结中文英语的选择了,完全是教条思想所致嘛。是不是国内圈子里有个不好的风气,就是写代码必须用英语单词做变量名?
    事实上对于中国人来说,最好用的编程命名语言不是英语,也不是中文汉字,而是拼音。
    以#24 楼的例子来说,变量名直接可以写成拼音 tu,不仅比汉字省事,也比英语 image 啊 picture 啊简洁多了。从识别角度来说是最适合中国人的。比如,大家在网上看到 xjp 3 个字母,是不是脑海里第一时间浮现某个肥胖的人.....
    前面说过了,代码的本质是数学公式,那么数学公式就应该用最简洁最有辨识度的字符串来标记,舍近求远的去用英语单词显然是事倍功半,强迫症全改汉字也是自己给自己制造困难和麻烦。就用拼音或者拼音字母的简写怎么就不行呢?害怕别人嘲笑么?我不觉得。简洁,含义准确,阅读顺畅,这些都满足了啊。
    tuchg
        26
    tuchg  
       2020-08-26 21:28:49 +08:00 via Android   1
    @gggxxxx 用拼音不如用英语,拼音有多音字重音字各种组合,还容易和英语混淆
    英语和拼音混搭那种是真的难受,只会增加阅读障碍,不会提升体验,也不简洁
    gggxxxx
        27
    gggxxxx  
       2020-08-26 22:28:51 +08:00
    @tuchg 英语就从来不用缩写吗? us 这种不是也经常用? database 不也经常写成 db ?英语各种缩写怎么就不混淆了呢?
    代码里用拼音,本质上和用英语是一样的,可以缩写,也可以字母写全。一般一个代码片段里,场景单一,就那么几个变量,重音的几率能有多高?。你们不是纠结英语阅读困难么?换成自己最熟悉的符号怎么就不方便了?
    我的原意很简单,如果想追求中文写程序,还不如用拼音.....算了,各人按自己的喜好来吧....
    tuchg
        28
    tuchg  
       2020-08-26 22:39:46 +08:00 via Android
    @gggxxxx 并不存在阅读困难,相比拼音我可能更熟悉英语
    jones2000
        29
    jones2000  
       2020-08-27 02:29:51 +08:00
    为什么要用中文, 英文不好吗,编程跟语言没什么关系,主要看逻辑思维,能画出流程图,这个程序基本就可以出来了。
    这个东西除了可以去教育部拿经费,其他没什么用处了。
    jones2000
        30
    jones2000  
       2020-08-27 02:32:50 +08:00
    这个东西符合目前的大形式,就是内循环,编程内循环, 排除老外,中国人自己玩。
    ungrown
        31
    ungrown  
       2020-08-27 09:18:56 +08:00
    总觉得你这文不对题,想了想,这不是与自然语言解耦,而是和特定的自然语言(英文)解耦,或者就直观点叫做省却为变量命名找单词的过程

    Python 支持 Unicode 变量名,写 Python 完全可以直接用。中文编程阻碍重重不是语言本身的问题,是输入法在从中作梗:英文变量直接敲字母就能补全,中文还得切换输入法至少打出一个汉字才行,这能忍?

    其实也有折衷思路,变量以汉语拼音首字母组合开头,后接中文文本,ide 里面直接根据声母敲键盘就能自动补全了。

    但还是不如全英文敲起来便捷。
    tuchg
        32
    tuchg  
       2020-08-27 10:06:43 +08:00 via Android   1
    @ungrown vscode 和 jetbrains 都已有这类插件支持,输入拼音补全中文
    charlie21
        33
    charlie21  
       2020-08-27 23:16:38 +08:00
    tikazyq
        34
    tikazyq  
       2020-08-28 20:24:01 +08:00 via iPhone
    其实这个跟键盘的布局类似的,长期以来人们习惯了 qwerty,就不会过渡到更合理的 dvorak
    yksoft1test
        35
    yksoft1test  
       2020-08-29 10:44:41 +08:00
    解耦前就像看宏汇编,解耦后就像看调试器 /反汇编器里面没有符号文件的汇编?
    yksoft1test
        36
    yksoft1test  
       2020-08-29 10:46:51 +08:00
    @yksoft1test 最近在研究一个用宏汇编写的中型软件(口袋妖怪水晶)源代码,才会有这种感叹。
    zoharSoul
        37
    zoharSoul  
       2020-08-29 11:46:43 +08:00
    有点意思
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1012 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 23:02 PVG 07:02 LAX 16:02 JFK 19:02
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86