myfreess

今日无事生非

Follow me on GitHub

这是一张中文编程小字报

有限于笔者水平,内容有误烦请见谅。欢迎大家提出宝贵意见!

概览

这张小字报的内容分为三块:

  • 在中文编程这杆大旗下,有哪几种主要思潮?各派别所试图解决的问题是什么?他们又提出过哪些解决方案?这些问题是否正确地描述了现状?
  • 针对中文编程的较合理反对意见又有哪几种?以及一些比较魔怔的反中文编程笑料。
  • 在无法逃离的编程总体化浪潮下,中文编程向何处去?

中文编程的支持者们

以下观点是我从数量不算太多的中文编程相关言论中提取出来的特征画像,这个词什么意思我不想解释,不过有一点需要提前声明:一个真实存在的中文编程人展现出的精神面貌应该是下述特征画像的线性组合,其实一个人有三张脸也很正常。

赤脚传码人

开发业务代码,往往更依赖对业务的理解而非编程技巧,如果我们的工人、农民、小商业者可以自行编程解决他们工作中的问题,这个社会对商业开发者的依赖就会降低、而各行各业的生产率则会更高。

传码人的理念可以非常简单地概括为:代码入万家,解放生产力,六亿神州尽舜尧。

这个理念(至少在我看来)还是很不错的,但有几个问题需要厘清。

中文编程语言:社会问题的纯技术解法

注:此处出现的中文编程语言仅指使用中文关键字和API的通用编程语言

传码人这一路思潮背后的指导思想显而易见:人是目的。解放生产力之后大家的生活都会变好,而这一目标可以通过纯技术的手段 - 一个易用易学的中文编程语言来达成。

目标是好的,论证是可疑的。下面的讨论将以

  • 解放生产力之后大家的生活都会变好而不是引发更严重的生产过剩现象/失业潮

  • 普罗大众的工作时间均不超过8小时至少有一部分人有充足的业余时间和意愿学习编程

为前提进行,这前提是否成立暂且搁置争议。

便民中文编程语言的设计方向

如果只是推出一个C++中文版,那跟便民无论如何是搭不上边的。

好在一个从头开始的编程语言可以参考其他语言的历史吸取教训。有一本700多页的大部头History of Programming Language,是同名讨论会的记录,可选择性阅读。

起个好名字

最好不要使用诸如”盘古”,”仓颉”,”麒麟”等已经存在大量关联网页的旧有名词,这不利于新手搜索学习资料。

这方面的好例子是MoonBit,可惜中文名又叫月兔了,直接叫月亮比特会更有辨识度。

下文中为了方便,会给这个可能存在的理想中文编程语言起名叫”便民”。

主要面向哪些领域以及生态建设向何处去

成本是新编程语言的大敌。旧语言本身设计可能有各种垃圾之处,但是它有经过大量用户测试反馈从而成熟的库,大量可供搜索的资料,以及一大批学过这语言很熟练招来就能干活的便宜程序员。即使新语言在设计上有充分的优越性,资料缺乏生态不成熟之类的问题也会让急于完成业务的职业程序员不敢将它用于商业项目。

便民语言不用获得商业上的成功,但仍没有完全避免上面的问题,毕竟非专业但是又在工作上需要写程序解决问题的人更需要常用功能基本没毛病的库和出了问题能马上找到解决方案的丰富资料。

依靠开源社区的力量固然很重要,雇一些老练的开发者全职维护一些重要的库却也必不可少。前期未成熟时可以考虑在大学生群体中做些宣传,并且给找到bug/提出好意见的用户一定物质奖励,以此来获得快速的用户反馈。

一种常见的纯粹技术幻想是通过良好(先不提口味问题)的语言特性吸引一批资深开发者,产出一批杀手级应用,然后在此基础上形成正反馈,吸引更多的用户和开源开发者,然后各种各样功能的库都有了 - 这个过程不是必然的。

此处可以参考:十年Erlang观察/Ten Years of Erlang

中文版

英文版

如果只要我们可以搞定一个大项目,那么开发者自然就会来,最终形成自然维持的生态。我认为这想法明显是错误的,主要是因为Erlang在其快速发展期有几十个杀手级的应用,但是社区仍然很小。例如:……

……其中上面很多都发生在Joe Armstrong的Erlang编程首次出版的时候,这为大量流行提供了一个完美的时机,Erlang吸引了大量的旁观者,甚至在Hacker News强制所有的讨论都集中在Erlang上的那一天也产生了显著的影响。然而结果是,很少有人留下来,绝大部分都止步于看一看就走了。

注意:erlang社区的过往只能说明从杀手应用到社区繁荣的必然性论证链有问题,但作为一种现象,它仍然可能出现。

便民语言无意于进军企业级Web应用开发,所以也就没有什么C10k C100k之类的问题。但是这是不是说就可以完全放弃web呢?不妥,web框架需要有,而且要想个办法让用户不用写javascript。

基本上,各种自动化功能都应该纳入考虑范围 - 现在连证件照都有细分领域的商业处理软件,即使Ps已经存在了很多年。

语法语义与语用

此处抄一下Design Concepts in Programming Languages这本书的解释

语法对应编程语言的形式

语义对应编程语言的意义

语用对应编程语言的实现

菜篮子工程

有没有可能现在设计一个程序语言,它能够充分吸收现存语言的优点,同时排除那些缺点?

答案是基本上没戏:https://www.zhihu.com/question/53959701/answer/138061972

当我们谈论语法时,我们在谈论什么?

一种较有趣的观点认为

  • 语法是语义范畴的初始对象

这种观点很有启发性,但是更多的时候讨论编程语言的语法是在讨论一些关于形式语言的东西。

语法需要简单一点

简单且一致性好的语法有利于用户学习,过度简单的语法可能让很多用户感觉不好写(这方面的”范例”是scheme语言,但也有人坚持认为它是好写的,我们暂且搁置这些争论。)。

更实际的好处是语法解析器好写,开发各种工具会方便一些。知名的反面例子是C和C++,对C这种”简单”语言为什么在此处榜上有名存在疑问的人可搜索

虽然C11的语法是上下文无关语法,但是在多处重要的地方它的语法规范存在模糊性,于是在实践中语法解析器不得不使用一定的上下文信息来排除错误选项。

另外这篇论文的成果虽然没有形式化验证,但是在扩展之后拿去给CompCert编译器用了。

如何解析中文标识符

https://www.unicode.org/reports/tr31/

拒绝继承

Object-oriented programming is an exceptionally bad idea which could only have originated in California.

– Edsger W. Dijkstra, attributed

延迟绑定与开放递归

“Open recursion Another handy feature offered by most languages with objects and classes is the ability for one method body to invoke another method of the same object via a special variable called self or, in some langauges, this. The special behavior of self is that it is late-bound, allowing a method defined in one class to invoke another method that is defined later, in some subclass of the first. “

协变逆变还是不变

引用自Comcx的这条回答: https://www.zhihu.com/question/511958588/answer/2995842148

如果AB的父类型,那么F<A>应该是F<B>的父类型吗?有没有可能二者完全没有关系?有没有可能F<B>反而是F<A>的父类型?到底是协变(covariant)、逆变(contravariant)还是不变(invariant)?其实三者皆有可能!这些都是理论上确实存在的问题,如果你忽视这些问题,很有可能为你带来运行时错误。

子类型如何与类型推导共存

https://guest0x0.xyz/introduction-to-algebraic-subtyping.pdf

以行多态(row polymorphism)替换子类型

参考rescript

类型系统

2023年了,连python和javascript都有静态类型检查了。

https://www.zhihu.com/question/21017354/answer/508114846

这个回答只是想吐槽一句那些拿 Facebook 举例来说明 Python/JavaScript/PHP 作为动态类型语言可以胜任大型项目,「只要公司大、人牛逼,用什么语言有什么区别?」得。FB 的 Python/JS/PHP 都是尽可能 fully-typed 得(PyRe/Flow/Hack),背靠着人数相当可观的一群做 Dev Infra 的人天天为这几个语言加 linter、类型系统、控制流分析、完整性检查等一大堆静态动态分析工具,从编写时就在跑,build/commit 时还有一堆等着在 clean sandbox 里接着跑,跑出问题就没法上生产。同时,FB 大量利用代码生成来静态保证跨语言的,端到端的类型安全。

你们也都这么写 Python/JS/PHP 得吗?

不过typescript包袱太重,python的类型标注第三方检查工具就好几个,还是让我们看看远处的elixir吧

  • Practical Type Inference Based on Success Typings: https://user.it.uu.se/~kostis/Papers/succ_types.pdf

不得不面对的Unicode问题

  • 你懂Unicode吗?可以教教我吗?- https://zhuanlan.zhihu.com/p/659797131

  • The Absolute Minimum Every Software Developer Must Know About Unicode in 2023 - https://tonsky.me/blog/unicode/

外部函数接口(FFI)

libffi

除非便民语言

标准库

构建工具

向cargo(Rust)和mix(Elixir)这种足够现代的构建系统看齐。

考虑到lean语言直接使用了修改版的cargo,出于节省成本的目的可以参考此做法,额外还需对输出信息进行中文本地化。

文档

教材与教程

从问题到程序这本书的前言,我劝你多读:

程序设计也是一种工程性工作,需要寻找可能的解决方案,评价不同方案并做出选择,还要对所做选择有清醒的认识(优点、缺点、倾向性或不足)。工程中通常没有完美的结果,更多是权衡和折中。程序设计也是如此。本书的许多实例包含较详细的分析讨论,不少实例给出了基于不同考虑形成的多种解法和性质比较,有时还指出其他可能性,提出了还可能如何看问题、如何做等,以帮助读者理解程序设计的真谛。书中还常给读者提出一些问题,希望读者发挥思维能力和主观能动性。书中练习也力图反映这些想法。

本书强调:编程问题没有需要记住的标准答案。由于对问题的不同考虑,设计中的不同选择,对同一问题可以得到许多合理而正确的不同程序。它们常常各有长短或各有侧重,或反映了对问题的不同认识。在这里应特别学习如何分析问题,如何把复杂问题分解为相对简单的部分,如何在可用功能中选择等。进而,还应该认清各种选择的后果,包括收获和损失。各种书籍(包括本书)里的程序不是“金科玉律”,只是作者对问题的一种理解,必然存在很多其他可能性。要学好程序设计,应该养成一种习惯:读程序时要特别注意思考作者的考虑和选择,分析其中哪些是合理而有价值的(或不合理无价值的),还可能有哪种选择,采纳其他选择可能得到什么(或失去什么)等。这样思考将使人受益无穷。当然,这并不是说书中示例不重要。恰恰相反,因为程序设计中有许多可能选择,好的教科书应当给出好的分析和选择,供读者参考。入门书还应解释所做选择的理由,指出带来的问题(缺点和限制等)。正如本书书名所示,程序设计是“从问题到程序”的思考和工作过程。学好程序设计,既要发挥聪明才智,也需要细致认真、一丝不苟的工作态度。

大方向能做到这样就不错了,还有些具体措施:

现代的在线编程教程对于终端程序一般都在代码块上提供有运行功能,如:

  • https://course.rs/about-book.html
  • https://www.liaoxuefeng.com/wiki/1252599548343744

有些教程还以此提供可以直接在线自动批改的题目

  • https://rust-book.cs.brown.edu/

编辑器/IDE支持

微软的 LSP 的根本性设计错误

成本

语言养护工作

著名计算机科学教材计算机程序的构造和解释开头便说,这个世界上存在两种风格迥异的语言,以Pascal和Lisp为代表。Pascal为建造金字塔而生 - 壮丽辉煌,令人震撼,是由各就其位的沉重巨石筑成的静态结构。Lisp则更像细胞,最终的程序更接近于有机体,由永不静止的简单片段组成的动态结构。

这个比喻结合这两种语言的现状来看有点微妙,静止的Pascal半死不活,靠Lazarus延续生命,活泼的lisp不断分化,方言满地跑。扯远了,一个致力于实用的语言应该避免以上两种情况,这就需要在保持语言稳定性的同时做到与时俱进。

GHC Haskell是个很坏的例子,曾经做出过好几个破坏语言兼容性的更改

  • 从 Functor => Monad 到 Functor => Applicative => Monad, 直接让整个hackage下线了
  • Simplify subsumption
  • 对用于判等的typeclass Eq进行改动:[1][2]。不过这个做了影响分析,他们说问题不大。

C则是死不悔改方面的头号问题人物

  • C Is Not a Low-level Language :Your computer is not a fast PDP-11
  • How ISO C became unusable for operating systems development
  • Into the Depths of C: Elaborating the De Facto Standards
  • To Save C, We Must Save ABI
  • C Isn’t A Programming Language Anymore

一个通用编程语言还是多个领域特定语言

学会一种编程语言和能使用它编写实用程序是两件事

可供参考:

  • Stata

  • processing

局部性人件

我是硕士毕业,英文读写肯定熟练没问题,看懂各种英文原始文档也没问题

我支持在编程中尽可能使用中文枚举,变量,函数名,等等,不限制编程语言,包括C++,JAVA,Python等

因为好多特定行业术语等场合,用中文大家都看得懂,省去脱裤子放屁的翻译步骤,而且好多术语都是行业自创的,没有翻译,翻译了也词不达意,一个人一个译法

程序员也没必要学习不同行业的术语单词,没必要,给自己找麻烦,医疗行业的术语,你能都了解吗?

写的代码都是项目内部国人看,有几个有国际协作需求的?公司项目有几个要开源的?

我支持中文编程,是因为我之前做过军工项目,我发现里面好多术语根本不好翻译,即使翻译了也很ugly,而这些术语好多都是四字词语,如“指控演练”,。。。如果用中文变量,就很规整整齐,很美观,翻译成英文就长短不一,丑陋无比。

你可以找下医院不同科室的中文名称 排列在一起感受下,再找一下对应的英文名称,排列在一起感受下,哪个整齐美观易懂

引用 - 知乎用户维天有汉(https://www.zhihu.com/people/wei-tian-you-han-13)

局部性(locality)在此处指开发团队里的程序员全是以简体中文为母语的人。

简单的中文命名好过蹩脚的英文命名

业务名词翻译有成本

除了互联网,还有很多工作在特定领域的程序员。

保守性

新冷战准备者

我想买台电脑。

这台电脑我要定制,但我不想这台电脑,有任何被美国及其盟友的制裁的可能性。

操作系统,我想用中文系统,从底层到最终界面,都必须是中文,因为我英文不好,不想看到任何英文。

制造上,从CPU到外壳,我都要求国内生产,制作。所有生产,制作所需要的设备,技术,都没有被国外封锁或制裁的可能性。

脆弱的”现代社会”与工业体系是新冷战准备者的助产士,保守主义则是他们毫无疑问的大爹。其实心里有个大爹没什么不好,起码还有点念想,虽然外面的一切都像烈日下的冰山一样脆弱,但是爹还是你的后盾,电脑会有的,操作系统也会有的,游戏照样打,短视频照样看!

新旧思潮对比

旧时代的冷战准备者们是有直面全球核战争的心理准备的,至少在他们看来,过苦日子比死还是强些。

新冷战准备者们就拉胯多了,还在考虑”新冷战爆发了大爹应该怎么保卫我的现代生活”,评价为投降的,小布尔乔亚的,没有前途的!

劝大家多了解一下现在的国产PLC和国内做工业软件的苦逼公司,办公自有龙芯笔记本可以解决问题。

最后,如果你觉得所谓的文明世界注定会完蛋而你仍然渴望在废土上能有个带操作系统的计算机可用,请关注collapse os

  • http://collapseos.org/

  • https://www.bilibili.com/read/cv3861042/

野生产品经理

“我不懂计算机科学和编程,但是我想做有XXX功能的……”

夸张的表演者

技术是和社会组织息息相关的,所以技术领域当然存在政治问题。但是参与技术社群的政治活动有多种方式,这种基本上不涉及任何实质性技术的嘴炮可说是最卑劣的行为之一。

中文优越论者

我想说我觉得可以这样做的原因不是我英语不好, 而是我觉得, 编程语言很大程度上支持了英语世界第一语言的霸权, 而汉字这样的表意文字, 失去了这方面的竞争力, 汉字的信息熵非常大,我觉得如果是汉字编程对于我们的未来可能更高效(习惯英语的职业程序员例外)

中文编程行为艺术家

设计理念独特,往往不走寻常路的一些中文编程语言。

  • 名语言:https://docs.racket-lang.org/ming/index.html

  • 粤语编程语言:https://github.com/StepfenShawn/Cantonese

  • 源语言:https://gitlab.com/genshinlaunch/genshinscript

  • 豫言:https://github.com/yuyan-lang/yuyan

  • wenyan-lang: https://github.com/wenyan-lang/wenyan

中文编程反对言论

较合理的

扬弃万应灵药情结

https://www.zhihu.com/question/349028712/answer/846079498

很多国人都有这样的一种观点,我姑且称之为“银弹情结”:这个世界上必定存在这样的一个编程语言,它在任何领域都适用,在适用的领域比该领域的所有语言都要好(至少是不差),学完这个语言之后其他语言手到擒来,找工作指哪打哪,可以吊打往前三十年往后三十年的所有领域专家;这大概也是为什么人们到现在还在问诸如“初学者学什么语言最好”这样的问题以及为什么大陆程序员社区的语言fanboy尤其多。人们曾经对这个语言是啥有不同的理解,范围包括但不限于C/C++/Java/Python/JavaScript/LISP(!)/Prolog/Erlang/APL;当这些fanboy语言的问题开始浮现出来的时候,人们就开始问,能不能把这些语言的好处全部集中起来,打造出真·银弹?

答案很可能是不能。

更加糟糕的是,对于某些人而言,这样的很可能无法存在的语言不仅一定要(以他们的意思)存在,最好还要是中文的,最好还要简单,一看就懂。

唉。

“银弹情结”、“一学就会”和“弯道超车”的背后其实还是浮躁;而浮躁在无论什么时候都是最要不得的。

难绷的

我之前出理过一个五六十万的高并发场景 因为某个字段有可能是中文 被用来做判断 高并发场景下 某些数据判断直接假死了 调试发展 中文乱码了 但是在少量请求的时候 是正常的 最后把判断字段改成了一定是英文的 修改后 就一直没发生这个问题

无法逃离的总体化

尾声:意料之外的阻碍

一个中文编程语言设计者因为把自己的实现挂在gitee上,README被”内容可能含有违规信息”掉了(2023/9/21)。

https://gitee.com/linux_23/kaelang