Почему языку программирования нужны ключевые слова?

Например (в C):

int break = 1;
int for = 2;

Почему компилятор будет иметь какие-либо проблемы вообще в выведении этого break и for переменные здесь?


Так, нам нужны ключевые слова потому что

  • мы хотим, чтобы программы были читаемы
  • мы не хотим сверхусложнять задание уже сложных компиляторов сегодня
  • но самое главное, язык является партией, более мощной, если некоторые 'key'words резервируются для некоторых специальных действий. Затем язык может думать о том, чтобы быть полезным в более высоком уровне вместо того, чтобы умереть в попытке реализовать для цикла однозначным способом.
32
задан tshepang 1 November 2014 в 06:26
поделиться

13 ответов

Тогда что сделает компьютер, когда он встретит утверждение вроде:

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

Должен ли он действительно сломаться? Или он должен рассматривать его как 1; ?

В некоторых случаях язык может стать неоднозначным, или вам придется создать очень умный синтаксический анализатор, который может вывести тонкий синтаксис, а это просто ненужная дополнительная работа .

20
ответ дан 27 November 2019 в 20:16
поделиться

несколько причин:

  • Ключевые слова могут показаться однозначными в ваших примерах. Но это не единственное место, где вы можете использовать переменную break или for.

  • написание синтаксического анализатора было бы намного сложнее и подвержено ошибкам с небольшой выгодой.

  • использование ключевого слова в качестве имени функции или процедуры в библиотеке может иметь нежелательные, возможно, связанные с безопасностью побочные эффекты.

4
ответ дан 27 November 2019 в 20:16
поделиться

Поскольку он помечен как C, исходный язык C был таким, что по умолчанию любая переменная определялась как тип int .

Это означает, что foo; объявляет переменную типа int .

Допустим, вы делаете перерыв; . Итак, как компилятор узнает, хотите ли вы объявить переменную с именем break или использовать ключевое слово break ?

6
ответ дан 27 November 2019 в 20:16
поделиться

У компилятора возникнут проблемы, если вы напишете что-то вроде этого:

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

Это цикл или вызов функции с именем , а ? Вы хотите вернуть значение 5 из текущей функции или вы хотите вызвать функцию с именем return ?

Это часто упрощает ситуацию, если конструкции со специальным значением просто имеют специальные имена, которые можно использовать однозначно относиться к ним.

2
ответ дан 27 November 2019 в 20:16
поделиться

Если мы говорим о C ++ - он уже имеет очень сложную грамматику. Например, разрешение использовать ключевые слова в качестве имен переменных еще больше усложнит задачу.

2
ответ дан 27 November 2019 в 20:16
поделиться

Потому что мы хотим сохранить те маленькие точки здравомыслия, которые у нас есть:

void myfunction(bool) { .. };

funcp while = &myfunction;
while(true); 
2
ответ дан 27 November 2019 в 20:16
поделиться

В этом нет необходимости - Фортран не зарезервировал никаких слов, поэтому такие вещи, как:

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

, полностью допустимы. Это не только усложняет синтаксический анализ языка компилятором , но часто почти не позволяет человеку прочитать или обнаружить ошибки. например, рассмотрим классический Fortran (скажем, до Fortran 77 - я не использовал его в последнее время, но, по крайней мере, надеюсь, что они исправили некоторые подобные вещи в более поздних стандартах). Цикл DO в Fortran выглядит так:

DO 10 I = 1,10

Если бы они не были рядом, вы, вероятно, могли бы увидеть, как бы вы упустили, чем это было по-другому:

DO 10 I = 1.10

К сожалению, последний цикл вообще не является циклом DO - - это простое присвоение значения 1.10 переменной с именем DO 10 I (да, это также позволяет использовать пробелы в имени). Поскольку Fortran также поддерживает неявные (необъявленные) переменные, это (или было) все совершенно законно, и некоторые компиляторы даже принимают это без предупреждения!

28
ответ дан 27 November 2019 в 20:16
поделиться

Как говорили другие, это упрощает анализ исходного кода компилятором. Но я хотел бы сказать немного больше: он также может сделать ваш исходный код более читабельный; рассмотрим следующий пример:

if (if> 0) then = 10 end if

Второе «if» и второе «then» являются переменными, а другие - нет. Я думаю, что такой код не читается. :)

4
ответ дан 27 November 2019 в 20:16
поделиться

Они этого не делают. Как известно, PL / 1 не имеет ключевых слов; каждое «ключевое слово» (BEGIN, DO, ...) также может использоваться в качестве имени переменной. Но это означает, что вы можете написать действительно непонятный код: IF DO> BEGIN THEN PRINT: = CALL-GOTO; Сохранение "ключевых слов операторов" в качестве языка обычно не является потерей, если это набор имен скромен (как и на всех языках, которые я когда-либо видел, кроме PL / 1 :-).

Также известно, что APL не имеет ключевых слов. Но в нем есть набор из примерно 200 удивительных знаковых символов, с помощью которых можно писать сложные операторы.(оператор «домино» [не спрашивайте!] представляет собой квадратную рамку со знаком деления калькулятора посередине). В этом случае разработчики языка просто использовали значки вместо ключевых слов. Как следствие, APL имеет репутацию языка, предназначенного только для записи.

Итог: не является требованием, но он делает программы более удобочитаемыми, если ключевые слова являются зарезервированными идентификаторами из небольшого набора, известного программистам. (Некоторые языки настаивают на том, чтобы "ключевые слова" начинались со специального символа пунктуации, такого как ".", Чтобы можно было использовать все возможные идентификаторы, но это не стоит дополнительных хлопот по вводу текста или беспорядка на странице; это довольно легко держитесь подальше от "идентификаторов", которые соответствуют ключевым словам, когда набор ключевых слов невелик).

8
ответ дан 27 November 2019 в 20:16
поделиться

Я полагаю, что написание парсера выглядит очень странно, если не невозможно. Например

int break = 1;
while (true) {
   // code to change break
   if (!break) break;   // not very readable code.
}
0
ответ дан 27 November 2019 в 20:16
поделиться

В зависимости от определения языка компилятору могут потребоваться ключевые слова, а могут и не потребоваться. Когда он не знает, что делать, он может попытаться применить правила приоритета или просто потерпеть неудачу.
Пример:

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, программы, использующие эту функцию языка, будет трудно читать, так как вам нужно отслеживать определения символов.

0
ответ дан 27 November 2019 в 20:16
поделиться

Во многих случаях компилятор может интерпретировать ключевые слова как обычные идентификаторы, как в вашем примере:

int break = 1;
int for = 2;

Фактически, я просто написал компилятор для простого игрушечного языка ассемблера, который делает это, но предупреждает пользователя в таких случаях.

Но иногда синтаксис определяется таким образом, что ключевые слова и идентификаторы неоднозначны:

int break;

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

И наиболее очевидная причина состоит в том, что редакторы будут выделять ключевые слова, чтобы код был более читабельным для людей. Разрешение обработки ключевых слов как идентификаторов затруднит выделение кода, а также приведет к плохой читаемости вашего кода.

0
ответ дан 27 November 2019 в 20:16
поделиться

FWIW, Tcl не имеет зарезервированных слов. Вы можете иметь переменные и функции с именами «if», «break» и т. Д. Интерпретация токена полностью зависит от контекста. Один и тот же токен может представлять команду в одном контексте, переменную в другом или буквальную строку в другом.

0
ответ дан 27 November 2019 в 20:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: