关于语法糖的思考
语法糖是指在编程语言中,采用简洁的方式来表示复杂的过程。使用语法糖可以减少代码长度,降低理解难度。例如,重载运算符和模板都是经典的语法糖。然而,尽管可以采用 C 风格的强制类型转换 int(x)
,C++ 还是提出了效果相同但名字更长的 static_cast<int>(x)
,这种情况被称为语法盐。其目的在于规避不安全的隐式转换。
采用语法糖无疑是提高生产力的有效手段。最初,人们为了摆脱计算机底层的晶体三极管,想到了使用机器语言的 \(0\) 和 \(1\) 来代替,这就是机器语言的诞生;当人们苦于用肉眼分辨 \(0\) 和 \(1\) 时,发现可以使用汇编语言来封装这些基本指令;当人们在汇编的 jmp
mov
中迷路时,高级语言实现了高维护性。从晶体三极管,到机器语言,到汇编,到高级语言,这就是语法糖的探索历程。借助这些语法糖,晦涩难懂的底层实现得以被隐藏,编程语言很快做到了「飞入寻常百姓家」。
编程语言的飞速发展带来了语法糖的肆意扩张。不知何时开始,一些人对语法糖的追求超过了对算法本身的设计,明明底层相同或编译器优化后相同的代码,反而能争出个高低。明明编译器自己也说是未定义行为,出题人还能自己「猜」出一个标准去出试卷。正如艾伦·佩利斯所言,语法糖会引起分号癌。为了所谓的语法糖计较那一两个分号(在大多数编程语言中一个分号表示一句话),是苦了自己,还是苦了大家?
不仅仅是为了消除不必要的语法糖,还为了对程序员进行强调,语法盐就这样诞生了。如果说语法糖的本质是增加学习时间且减少代码时间,那么语法盐就是增加学习时间且增加代码时间。同时,增加学习门槛,迫使较低水平的程序员无法编写代码。另外,编译器给出警告信息,实际上也是语法盐的作用——即故意拖累你,让你再仔细想想。
然而,语法糖和语法盐的本质目的,仍然是为了避免代码书写错误,跳出难以维护的底层实现。真正会引起混乱的,永远只有不合理的重载运算符以及无意义的模板,而那些为我们生活创造便利的语法糖、语法盐,将会一直在计算机科学中流传下去。这些有意义的代码,作为人类智慧的瑰宝,已经被写入到胶片卷轴送到北极圈,在永久冻土 \(250\) 米以下,至少蕴藏 \(1000\) 年。这些代码定然能在未来的 \(1000\) 年后,继续为人类的生活带来便利,继续推动科技的进步。