语言作为整体
学了陆俭明先生的《现代汉语语法研究》课程, 得知语法的单位可按大小来分类:
| 单位 | 说明 |
|---|---|
| 语素 | 最小的单位 |
| 词 | 最小的可独立运用的语法单位 |
| 词组 | 由词根据句法规则组成 |
| 句子 | 一定有句调,是最大一级的语法单位 |
然而设计程序语言时, 人们通常只是在设计最大一个层次的词组如何组成句子。 完全忽视了更小一层次的词。
对于词的语法设计,被视为是「风格」而不是语法。 通常,一个软件项目,通过「命名规范」来约定构词的风格。 不同的软件项目,即便使用同一个程序语言,也会因为命名风格而分歧。 这种现象,正是因为设计者忽略了这更小一层次的语法单位之设计。
言说
由此还产生了很多坏的现象, 比如在构词过程中,产生很多不可读的函数名。
例如:
- C 的
strlenuint64_t - scheme 的
member?set! - common-lisp 的
member-p
_t 和 -p 后缀勉强可以读其字母。 但是有人搞怪,把 scheme 中 ? 强行读为 huh 这个疑问语气词, 把 ! 强行读为 bang,就很无厘头了。
语言作为言说的媒介,不应该失去可读性。
构词
在用基于英语的程序语言写程序时, 常常会在构词的时候使用不可言说的缩写。
其原因有二。
首先,英语不像德语和汉语,有用以构词的语法, 英语没有直接通过连词来直接构造新词的能力。 必须使用不可言说的连字符来表达词组, 比如下划线和短横线,或者用大小写间隔来分词。 这使得人们倾向于避开复合词,转而使用缩写。
其次,想要使用自然的英语词组来命名变量和函数, 就需要受到英语语法的限制。 程序员为了不被英语语法阻碍思路与项目的进度, 而直接抛弃英语语法,在构词时完全使用缩写。 早期的 C 程序员群体是最为典型的例子。
程序员中流传着这种说法:
计算机科学中只有两件难事:缓存失效和命名事物。
每个程序员都有经历,自己在写程序的过程中, 因为需要命名某个变量或者函数的时候,停下来思考很久。 这种思考甚至会占据编程过程的大部分时间。
然而,函数名与变量名,本质上来说是完全不重要的。 对于语言的编译与执行而言,命名与注释的职责相当。
人们之所以挺下来思考很久,是因为要符合英语的语法与语感。
比如 TODO (以 laravel 的 API 名字设计为例子)。
C 语言的早期程序员,之所以使用大量缩写, 正是为了在词法方面突破英语语法的桎梏。
耦合
英语对于写程序而言的「桎梏」来自于语法关系与语义关系的耦合。 语法上固定的主谓结构,与「施事-动作」这个语义关系耦合。
汉语没有这种耦合。
结论
设计中文程序语言时,要设计完整。 包括词法,甚至也要考虑到重音等,语音对语法的影响。