为什么C ++语言设计者会继续重复使用关键字?

时间:2015-09-24 09:12:48

标签: c++ c++11 keyword language-design

支持重新使用短关键字(并添加依赖于上下文的含义)而不仅仅是添加更多关键字的主要理由是什么?

是否只是想要避免破坏可能已经使用建议的新关键字的现有代码,还是有更深层次的原因?

新的" enum类"在C ++ 11中让我思考这个,但这是一个通用的语言设计问题。

5 个答案:

答案 0 :(得分:68)

  

是否只是想要避免破坏可能已经使用建议的新关键字的现有代码,还是有更深层次的原因?

不,这就是原因。

根据定义,关键字始终被视为关键字,无论它们出现在源中,因此它们不能用于其他目的。使某个关键字成为关键字会破坏可能将该标记用作变量,函数或类型名称的任何代码。

C委员会采用不同的方法,并使用_Reserved名称添加新关键字,例如_Atomic_Bool,然后他们添加了一个更好的宏标题(<stdatomic.h><stdbool.h>),以便您可以选择是否包含标题以获取名称atomicbool,但它不会自动声明,并且不会破坏恰好使用这些名称的代码。

C ++委员会不喜欢宏,并希望它们成为合适的关键字,因此要么重用现有的关键字(例如auto),要么添加依赖于上下文的&#34;关键字&#34; (它们不是真正的关键字,而是&#34;具有特殊含义的标识符&#34;因此它们可以用于其他事物,例如override)或使用奇怪的拼写不太可能与用户代码冲突(例如decltype而不是广泛支持的typeof扩展名。)

答案 1 :(得分:17)

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

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

是一段合法的代码,但完全不可读。 (另请参阅APL作为写主要编程语言的示例,几个月后阅读完全神秘,即使是代码的原作者也是如此。

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

众所周知,C ++被慢慢解析(特别是因为像<vector>这样的标准头文件正在拖动十几行源代码,并且因为模块还没有在C ++中,并且因为语法很强因为复杂的解析器来处理新的语法并不是什么大问题(解析C ++总是很糟糕)。例如,GCC社区在新的优化上比在新的C ++特性上更加努力(显然,C ++标准库的最新特性比解析新语法需要更多的工作),即使从C ++ 03跳转到C ++ 11是一个巨大的跳跃,需要在C ++前端做很多工作。对于C ++ 11到C ++ 14的跳转,情况就不那么正确了。

其他一些语言(例如Lisp的某些方言,例如Common Lisp和一些Scheme,您可以在其中重新定义letif宏,以及{{3} } macros这些语言的非常不同,因为在homoiconic上操作,来自C或C ++中粗略的文本替换AST许可重新定义现有关键字;另请阅读mechanism。但这可能会在几个月后难以理解源代码。

答案 2 :(得分:10)

我认为这主要是因为添加关键字会破坏在其他环境中使用此关键字的现有代码,正如您所建议的那样。

答案 3 :(得分:10)

  

是否只是想要避免破坏可能已经使用建议的新关键字的现有代码,还是有更深层次的原因?

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

某些语言使用术语上下文关键字来引用仅在特定上下文中被解释为关键字的拼写。如果没有&#34; wild&#34;之前可以在此上下文中使用标识符,然后保证contextual关键字的引入不会破坏现有代码。例如,由于在函数签名中的右括号后不会立即出现标识符,因此可以引入所谓的上下文关键字(例如overridefinal)。

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

  • struct H { my_type f; enum { g }; };:使用enum class而不是新关键字是因为在此上下文中任何新词都可能被错误地视为数据成员声明的开头;只有关键字是明确的(在LL(1)中),引入新的关键字可能会破坏代码。
  • void h() { my_type f; auto x = g(); }:使用auto而非新关键字是因为任何新词都可能与现有类型发生冲突。它仍然是一个令人惊讶的选择,因为它已经是一个可用于此位置的关键字 in C (默认为int类型)但其含义已被改变(理由是低概率)它的用法)。

正如一些人所提到的,语言可以完全没有关键字设计(Haskell非常接近),或者以一种方式制作,而不是关键字可以无缝地引入(例如,如果每个声明都是以关键字开头,那么引入一个新的关键字不能冲突)。它恰好发生在C和C ++中,而不是这样,实际上很多类似C语言。

答案 4 :(得分:-11)

错误的热情&#34;少了更多&#34;。人们认为(错误地)通过使用较少的关键字,程序员必须学得更少,并且可以更快地提高工作效率。但这只会造成语法混乱。

  

&#34; Real Perl程序员更喜欢视觉上截然不同的东西。&#34; ----拉里沃尔

换句话说,仅为一项任务使用关键字。