为什么C ++语言devise师不断重复使用关键字?

支持重新使用短关键字(并添加上下文相关的含义)的主要论点是什么,而不是仅仅添加更多的关键字?

难道你只是想避免破坏现有的可能已经使用了新的关键字的代码,还是有更深的原因?

C ++ 11中新的“枚举类”让我思考这个问题,但这是一个通用的语言devise问题。

难道你只是想避免破坏现有的可能已经使用了新的关键字的代码,还是有更深的原因?

不,这是原因。

按照定义,关键词始终被视为关键词,无论它们出现在源中的哪个位置,因此不能用于其他目的。 使某个关键字成为可能将该令牌用作variables,函数或types名称的代码。

C委员会采取不同的方法,使用_Reserved名称添加新的关键字,例如_Atomic, _Bool ,然后用更好的macros添加一个新的头( <stdatomic.h><stdbool.h> ),以便您可以select是否包含标题以获取名称atomicbool ,但不会自动声明,并且不会中断正在使用这些名称的代码。

C ++委员会不喜欢macros,并希望它们成为正确的关键字,所以要么重复使用现有的关键字(比如auto ),要么添加上下文相关的“关键字”(这不是真正的关键字,而是“具有特殊含义的标识符“所以他们可以用于其他的东西,如override )或使用奇怪的拼写,不可能与用户代码冲突(如decltype而不是广泛支持的typeof扩展)。

一些旧的语言根本没有关键字,特别是PL / 1

 IF IF=THEN THEN BEGIN; /* some more code */ END; 

是一段合法的代码,但完全不可读。 (也可以参考APL,作为一种主要编程语言的例子,几个月后甚至可以通过代码的原作者来阅读)。

C和C ++语言系列具有由语言规范定义的一组关键字。 但有数十亿条遗留源代码行使用非常广泛的语言。 如果你(或他们的标准化委员会)增加了一个新的关键词,那么就有可能与现有的某个程序发生冲突,而你猜测和其他人的回答是不好的。 因此,如果标准添加了enum_class作为新的关键字,那么很可能有人已经将它用作标识符,并且该实体会不高兴(在采用新的C ++标准时必须更改它们的代码)。

此外,C ++也被广为人知地被缓慢地parsing(特别是因为像<vector>这样的标准头文件正在拉动十几千行源代码,并且因为模块还没有在C ++中,而且因为语法是非常模糊的)parsing器来处理新的语法并不是什么大不了的事情(parsingC ++总是非常糟糕)。 例如,即使从C ++ 03跳转到C ++ 11,GCC社区在新的优化上比在新的C ++function上工作起来要困难得多(显然,C ++标准库的最新function需要比parsing新语法更多的工作)是一个巨大的跳跃,需要在C ++前端做很多工作。 对于C ++ 11到C ++ 14的跳转来说,这是不太正确的。

一些其他的语言(比如Lisp的一些方言,比如Common Lisp和一些Scheme ,你可以重新定义一个let或者ifmacros,以及像这样的同母语言的macros是非常不同的,因为在AST上运行粗略的文本replace机制在C或C ++中…)允许重新定义现有的关键字; 阅读有关卫生的macros 。 但是这可能会在几个月后使源代码难以理解。

我认为这主要是因为添加关键字会破坏在其他情况下使用此关键字的现有代码。

难道你只是想避免破坏现有的可能已经使用了新的关键字的代码,还是有更深的原因?

根据定义,关键字是一个特殊的令牌,不能在其他地方使用。 因此,引入一个关键字会破坏任何碰巧使用给定拼写的标识符的代码。

一些语言使用术语上下文关键字来指仅在特定上下文中被解释为关键字的拼写。 如果之前没有使用“wild”标识符,则保证上下文关键字的引入不会破坏现有的代码。 例如,由于在函数签名的closures圆括号之后没有标识符可以立即出现,所以这是一个可以引入所谓的上下文关键字(例如overridefinal )的地方。

另一方面,在任何标识符先前被允许的地方,添加关键字会带来风险。 例如:

  • struct H { my_type f; enum { g }; }; :使用enum class而不是新的关键字是因为在这种情况下,任何新的单词可能被错误地视为数据成员声明的开始; 只有一个关键字是明确的(在LL(1)),并且引入一个新的可能会破坏代码。
  • void h() { my_type f; auto x = g(); } void h() { my_type f; auto x = g(); } :使用auto而不是新的关键字是因为任何新的单词都可能与现有的types冲突。 这仍然是一个令人吃惊的select,因为它已经是一个可以在C中使用的关键字(默认为inttypes),但是它的含义被改变了(理由是它的使用率很低)。

正如一些人所说的,语言可以完全没有关键字的devise(Haskell非常接近),或者以比关键字可​​以无缝引入的方式创build语言(例如,如果每个声明都是由一个关键字开始的,那么引入一个新的关键字不会发生冲突)。 它恰好比C和C ++发生在那里,并没有这样做,事实上很多C语言。

“less就是多”的错误热情。 人们认为(不正确),通过使用更less的关键字,程序员将不得不学得更less,并且可以更快地提高生产力。 但这只会造成语法上的混乱。

“真正的Perl程序员更喜欢视觉上不同的东西。” —-拉里·沃尔

换句话说,只有一个关键字用于一个任务。