Зачем языку программирования нужны ключевые слова? - PullRequest
32 голосов
/ 16 марта 2010

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

int break = 1;
int for = 2;

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


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

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

Ответы [ 13 ]

28 голосов
/ 16 марта 2010

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

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 также поддерживает неявные (необъявленные) переменные, это (или было) все совершенно допустимо, и некоторые компиляторы даже приняли бы это без предупреждения!

20 голосов
/ 16 марта 2010

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

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

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

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

8 голосов
/ 16 марта 2010

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

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

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

6 голосов
/ 16 марта 2010

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

.

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

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

4 голосов
/ 16 марта 2010

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

если (если> 0), то = 10 завершится, если

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

4 голосов
/ 16 марта 2010

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

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

  • написание парсера будет намного сложнее и может привести к ошибкам из-за небольшого усиления.

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

2 голосов
/ 16 марта 2010

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

void myfunction(bool) { .. };

funcp while = &myfunction;
while(true); 
2 голосов
/ 16 марта 2010

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

2 голосов
/ 16 марта 2010

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

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

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

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

0 голосов
/ 19 марта 2010

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

int break = 1;
int for = 2;

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

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

int break;

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...