Например (в C):
int break = 1;
int for = 2;
Почему компилятор будет иметь какие-либо проблемы вообще в выведении этого break
и for
переменные здесь?
Так, нам нужны ключевые слова потому что
Тогда что сделает компьютер, когда он встретит утверждение вроде:
while(1) {
...
if (condition)
break;
}
Должен ли он действительно сломаться? Или он должен рассматривать его как 1;
?
В некоторых случаях язык может стать неоднозначным, или вам придется создать очень умный синтаксический анализатор, который может вывести тонкий синтаксис, а это просто ненужная дополнительная работа .
несколько причин:
Ключевые слова могут показаться однозначными в ваших примерах. Но это не единственное место, где вы можете использовать переменную break или for.
написание синтаксического анализатора было бы намного сложнее и подвержено ошибкам с небольшой выгодой.
использование ключевого слова в качестве имени функции или процедуры в библиотеке может иметь нежелательные, возможно, связанные с безопасностью побочные эффекты.
Поскольку он помечен как C, исходный язык C был таким, что по умолчанию любая переменная определялась как тип int
.
Это означает, что foo;
объявляет переменную типа int
.
Допустим, вы делаете перерыв;
. Итак, как компилятор узнает, хотите ли вы объявить переменную с именем break
или использовать ключевое слово break
?
У компилятора возникнут проблемы, если вы напишете что-то вроде этого:
while(*s++);
return(5);
Это цикл или вызов функции с именем , а
? Вы хотите вернуть значение 5 из текущей функции или вы хотите вызвать функцию с именем return
?
Это часто упрощает ситуацию, если конструкции со специальным значением просто имеют специальные имена, которые можно использовать однозначно относиться к ним.
Если мы говорим о C ++ - он уже имеет очень сложную грамматику. Например, разрешение использовать ключевые слова в качестве имен переменных еще больше усложнит задачу.
Потому что мы хотим сохранить те маленькие точки здравомыслия, которые у нас есть:
void myfunction(bool) { .. };
funcp while = &myfunction;
while(true);
В этом нет необходимости - Фортран не зарезервировал никаких слов, поэтому такие вещи, как:
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 также поддерживает неявные (необъявленные) переменные, это (или было) все совершенно законно, и некоторые компиляторы даже принимают это без предупреждения!
Как говорили другие, это упрощает анализ исходного кода компилятором. Но я хотел бы сказать немного больше: он также может сделать ваш исходный код более читабельный; рассмотрим следующий пример:
if (if> 0) then = 10 end if
Второе «if» и второе «then» являются переменными, а другие - нет. Я думаю, что такой код не читается. :)
Они этого не делают. Как известно, PL / 1 не имеет ключевых слов; каждое «ключевое слово» (BEGIN, DO, ...) также может использоваться в качестве имени переменной. Но это означает, что вы можете написать действительно непонятный код: IF DO> BEGIN THEN PRINT: = CALL-GOTO; Сохранение "ключевых слов операторов" в качестве языка обычно не является потерей, если это набор имен скромен (как и на всех языках, которые я когда-либо видел, кроме PL / 1 :-).
Также известно, что APL не имеет ключевых слов. Но в нем есть набор из примерно 200 удивительных знаковых символов, с помощью которых можно писать сложные операторы.(оператор «домино» [не спрашивайте!] представляет собой квадратную рамку со знаком деления калькулятора посередине). В этом случае разработчики языка просто использовали значки вместо ключевых слов. Как следствие, APL имеет репутацию языка, предназначенного только для записи.
Итог: не является требованием, но он делает программы более удобочитаемыми, если ключевые слова являются зарезервированными идентификаторами из небольшого набора, известного программистам. (Некоторые языки настаивают на том, чтобы "ключевые слова" начинались со специального символа пунктуации, такого как ".", Чтобы можно было использовать все возможные идентификаторы, но это не стоит дополнительных хлопот по вводу текста или беспорядка на странице; это довольно легко держитесь подальше от "идентификаторов", которые соответствуют ключевым словам, когда набор ключевых слов невелик).
Я полагаю, что написание парсера выглядит очень странно, если не невозможно. Например
int break = 1;
while (true) {
// code to change break
if (!break) break; // not very readable code.
}
В зависимости от определения языка компилятору могут потребоваться ключевые слова, а могут и не потребоваться. Когда он не знает, что делать, он может попытаться применить правила приоритета или просто потерпеть неудачу.
Пример:
void return(int i){printf("%d",i);}
public int foo(int a)
{
if(a > 2)return (a+1)*2;
return a + 3;
}
Что произойдет, если a больше 2?
Вы можете определить язык, на котором не используются ключевые слова. Вы даже можете определить язык, который позволит вам заменять все символы (поскольку они сами по себе являются очень короткими ключевыми словами).
Проблема не в компиляторе. Если ваша спецификация заполнена и не содержит ошибок, она будет работать. Проблема в PEBCAD, программы, использующие эту функцию языка, будет трудно читать, так как вам нужно отслеживать определения символов.
Во многих случаях компилятор может интерпретировать ключевые слова как обычные идентификаторы, как в вашем примере:
int break = 1;
int for = 2;
Фактически, я просто написал компилятор для простого игрушечного языка ассемблера, который делает это, но предупреждает пользователя в таких случаях.
Но иногда синтаксис определяется таким образом, что ключевые слова и идентификаторы неоднозначны:
int break;
while(...)
{
break; // <-- treat this as expression or statement?
}
И наиболее очевидная причина состоит в том, что редакторы будут выделять ключевые слова, чтобы код был более читабельным для людей. Разрешение обработки ключевых слов как идентификаторов затруднит выделение кода, а также приведет к плохой читаемости вашего кода.
FWIW, Tcl не имеет зарезервированных слов. Вы можете иметь переменные и функции с именами «if», «break» и т. Д. Интерпретация токена полностью зависит от контекста. Один и тот же токен может представлять команду в одном контексте, переменную в другом или буквальную строку в другом.