语法盐

科技工作者之家  |   2020-11-17 18:11

语法盐(英语:syntactic salt)是指在计算机语言设计中,不容易产生不良代码的特性。语法盐就像一个程序员必须跳过的圈,来证明他们知道将会发生什么,而不是只表达一个程序行为。

简介语法盐可以为容易犯的语法错误加上的额外语法限制,比如类型检查。再比如,有人建议在用end if,,end while等代替统一的end。1

具体内容在Java中,在没有额外的语言明确地说明意图的情形下,Java不允许将一个声明为float类型的变量赋值给一个声明为int类型的变量,但是C和C++会自动把float类型的变量缩短并赋值给int类型的变量。

在C#中,若隐藏一个继承类别的成员,需加上new关键字来说明是有意隐藏此成员,否则会产生一个警告。C语言或C++语言中Switch指令的case中若不加break也不会有错误讯息,因此有潜在错误的可能,C#在switch中未空白的case标记内,若没有goto、return、throw指令,就一定要加break指令(若要像C语言或C++语言一様,一个case后要执行另一个case指令,要加上goto并标示要跳转的标记)。

语法盐有可能会违背它的初衷,使得代码可读性下降或损害代码质量。在极端条件下,真正有用的代码可能要比为了满足语法盐要求而加的代码还要短。另外一种代替语法盐的方式是在代码非常有可能出错的时候,让编译器产生警告——这也是现代C和C++编译器常见的功能。

批评者开玩笑说:喜欢语法盐的同志们,一定都是受虐狂——自己没事找事给自己下套玩 。1

语法盐的例子C++相较于C中形如 (T)v 的 C 样式转换和 T(v) 的函数样式转换,C++通过引入 static_cast、reinterpret_cast、const_cast 和 dynamic_cast 这四种转换来强迫程序员多敲键盘,从而令他们少用转换2。

double d =0.1;const int i=static_cast(d);//静态转换:编译时能进行类型检查的转换void *pv=reinterpret_cast(i);//重解释转换:在不兼容的类型间进行转换(例如指针与非指针)const int *pi=&i;int *pi2=const_cast(pi);//常量转换:去掉 const、volatile 等修饰符class C{ public: virtual ~C(){};}; class D: pub lic C{};D d; const C &rc=d;const D &rd=dynamic_cast(rc); //动态转换:在类继承体系里上下转换,因必须在编译时检查(RTTI)而得名Java中并不允许将一个宣告为float类型的变量赋值给一个宣告为int类型的变量,但是C和C++会自动把float类型的变量舍去小数并赋值给int类型的变量。

int num1;float pi=3.14159;num1=pi; //赋值错误总结语法盐有可能会违背它的初衷,使代码的可读性降低或浪费代码的空间占用。在极端条件下,真正有用的代码可能要比为了满足语法盐要求而增加的代码还要短。另外一种替代语法盐的方法是在代码可能产生错误时,让编译器产生警告——这也是C和C++的编译器常见的作法。2

本词条内容贡献者为:

王沛 - 副教授、副研究员 - 中国科学院工程热物理研究所