为什么编程语言需要关键字?

Laz*_*zer 32 c identifier keyword

例如(在C中):

int break = 1;
int for = 2;
Run Code Online (Sandbox Code Playgroud)

为什么编译器必须在所有推断出任何问题,breakfor这里的变量?


所以,我们需要关键字,因为

  • 我们希望程序可读
  • 我们不想让今天已经很复杂的编译器的工作过于复杂
  • 但最重要的是,如果某些"关键词"保留用于某些特殊操作,则语言会更强大.然后,语言可以认为在更高级别上有用,而不是试图以明确的方式实现for循环.

Jer*_*fin 28

没有必要 - Fortran没有保留任何单词,所以类似于:

if if .eq. then then if = else else then = if endif
Run Code Online (Sandbox Code Playgroud)

是完全合法的.这不仅使编译器难以解析语言,而且通常几乎不可能让人阅读或发现错误.例如,考虑一下经典的Fortran(比如说,通过Fortran 77 - 我最近没有使用它,但至少希望他们在最近的标准中修复了一些这样的东西).Fortran DO循环如下所示:

DO 10 I = 1,10
Run Code Online (Sandbox Code Playgroud)

没有它们并排,你可能会看到你如何错过这是如何不同的:

DO 10 I = 1.10
Run Code Online (Sandbox Code Playgroud)

不幸的是,后者根本不是一个DO循环 - 它是一个简单的值赋值1.10给一个名为的变量DO 10 I(是的,它还允许名称中的空格).由于Fortran还支持隐式(未声明)变量,因此这些(或者是)完全合法,并且一些编译器甚至会在没有警告的情况下接受它!


Kac*_*che 20

然后,当遇到如下声明时,计算机会做什么:

while(1) {
  ...
  if (condition)
    break;
}
Run Code Online (Sandbox Code Playgroud)

它真的会破裂吗?还是应该把它当作1;

在某些情况下,语言会变得模棱两可,或者您必须创建一个非常智能的解析器,可以推断出微妙的语法,这只是不必要的额外工作.

  • 更糟糕的是,如果你声明了一个名为`while`的函数指针(或函数)...... (3认同)

Ira*_*ter 8

他们没有.PL/1着名的没有关键词; 每个"关键字"(BEGIN,DO,...)也可以用作变量名.但允许这意味着你可以写出非常模糊的代码:如果DO> BEGIN THEN PRINT:= CALL-GOTO; 保留"语句关键字"作为语言通常不会丢失,如果这组名称是适度的(因为它在我见过的每个语言中除了PL/1 :-).

APL也很有名,没有关键词.但它有一套约200个令人惊叹的标志性符号,用于编写复杂的运算符.("多米诺"运算符[不要问!]是一个方框,中间有一个计算器分号)在这种情况下,语言设计师只使用图标而不是关键字.结果是APL具有"只写"语言的美誉.

底线:不是要求,但如果关键字是程序员已知的小集合中的保留标识符,它往往会使程序更具可读性.(有些langauges坚持认为"关键字"以一个特殊的标点符号开头,如".",以允许使用所有可能的标识符,但这不值得在页面上键入或混乱的额外麻烦;它很容易远离在关键字集很小时匹配关键字的"标识符".

  • 优秀的APL程序员不会对操作员的行为或行为感到困惑.他们确实完全混淆了APL声明试图完成的事情. (6认同)

Ber*_*ron 6

由于它标记为C,因此原始C语言默认情况下将任何变量定义为类型int.

这意味着foo;将声明一个类型的变量int.

让我们说你做break;.那么编译器如何知道您是否要声明一个名为的变量break或使用该关键字break