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

时间:2010-03-16 05:49:44

标签: c keyword identifier

例如(在C中):

int break = 1;
int for = 2;

为什么编译器在推断breakfor是变量时会有任何问题?


因此,我们需要关键字,因为

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

13 个答案:

答案 0 :(得分:28)

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

if if .eq. then then if = else else then = if endif

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

DO 10 I = 1,10

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

DO 10 I = 1.10

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

答案 1 :(得分:20)

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

while(1) {
  ...
  if (condition)
    break;
}

它真的会破裂吗?或者它应该将其视为1;

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

答案 2 :(得分:8)

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

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

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

答案 3 :(得分:6)

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

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

假设你做break;。那么编译器如何知道您是要声明名为break的变量还是使用关键字break

答案 4 :(得分:4)

有几个原因:

  • 关键字在您的样本中可能看起来毫不含糊。但这不是你使用变量'break'或变量'for'的唯一地方。

  • 编写解析器会更加困难,容易出错,但收效甚微。

  • 使用关键字作为库中的函数或过程名称可能会产生不希望的,可能与安全相关的副作用。

答案 5 :(得分:4)

正如其他人所说,这使编译器更容易解析源代码。 但我想多说一点:它还可以使您的源代码更具可读性;考虑这个例子:

if(if> 0)则then = 10 end if if

第二个“if”和第二个“then”是变量,而其他则不是。我认为这种代码不可读。 :)

答案 6 :(得分:2)

如果您编写如下内容,编译器会遇到问题:

while(*s++);
return(5);

这是一个循环还是对名为while的函数的调用?您是否要从当前函数返回值5,或者是否要调用名为return的函数?

如果具有特殊含义的构造只是具有可用于明确引用它们的特殊名称,它通常会简化事物。

答案 7 :(得分:2)

如果我们谈论C ++ - 它已经有非常复杂的语法。例如,允许将关键字用作变量名称会使其更加复杂。

答案 8 :(得分:2)

因为我们想要保持我们所拥有的小理智点:

void myfunction(bool) { .. };

funcp while = &myfunction;
while(true); 

答案 9 :(得分:0)

我想如果不是不可能编写解析器,它看起来很奇怪。 E.g

int break = 1;
while (true) {
   // code to change break
   if (!break) break;   // not very readable code.
}

答案 10 :(得分:0)

根据语言定义,编译器可能需要也可能不需要关键字。当它不知道该怎么做时,它可以尝试应用优先规则或者只是失败 一个例子:

void return(int i){printf("%d",i);}
public int foo(int a)
{
  if(a > 2)return (a+1)*2;
  return a + 3;
}

如果a大于2,会发生什么?

  • 语言规范可以 要求编译器失败
  • 语言规范可能要求编译器使用return 功能
  • 语言规范可能要求编译器返回

您可以定义不使用关键字的语言。您甚至可以定义一种语言,让您替换所有符号(因为它们只是非常短的关键词) 问题不在于编译器,如果您的规范是完整的并且没有错误,它将起作用。问题是PEBCAD,使用该语言功能的程序将难以阅读,因为您必须跟踪符号定义。

答案 11 :(得分:0)

FWIW,Tcl没有任何保留字。您可以拥有名为“if”,“break”等的变量和函数。令牌的解释完全取决于上下文。相同的标记可以表示一个上下文中的命令,另一个中的变量或另一个上的文字字符串。

答案 12 :(得分:0)

在许多情况下,编译器可以将关键字解释为普通标识符,如示例所示:

int break = 1;
int for = 2;

事实上,我只是为一个简单的类似汇编的玩具语言编写了一个编译器来执行此操作,但在这种情况下会警告用户。

但有时语法的定义方式是关键字和标识符不明确:

int break;

while(...)
{
    break; // <-- treat this as expression or statement?
}

最明显的原因是编辑会强调关键字,以便代码对人类更具可读性。允许将关键字视为标识符会使代码突出显示更加困难,并且还会导致代码的可读性变差。