Почему имена переменных не могут начинаться с цифр? - PullRequest
124 голосов
/ 05 декабря 2008

Я работал с новым разработчиком C ++ некоторое время назад, когда он задал вопрос: «Почему имена переменных не могут начинаться с цифр?»

Я не мог придумать ответ, за исключением того, что некоторые числа могут содержать текст (123456L, 123456U), и это было бы невозможно, если бы компиляторы думали, что все с некоторым количеством буквенных символов является именем переменной.

Это был правильный ответ? Есть еще причины?

string 2BeOrNot2Be = "that is the question"; // Why won't this compile?

Ответы [ 24 ]

110 голосов
/ 05 декабря 2008

Хорошо подумайте об этом:

int 2d = 42;
double a = 2d;

Что такое? 2,0? или 42?

Подсказка, если вы его не получите, d после числа означает число до того, как оно станет двойным литералом

101 голосов
/ 05 декабря 2008

Потому что тогда строка цифр будет действительным идентификатором, а также действительным числом.

int 17 = 497;
int 42 = 6 * 9;
String 1111 = "Totally text";
42 голосов
/ 26 апреля 2011

Сейчас это соглашение, но оно началось как техническое требование.

В старые времена синтаксические анализаторы языков, таких как FORTRAN или BASIC, не требовали использования пробелов. Итак, в основном, следующие идентичные:

10 V1=100
20 PRINT V1

и

10V1=100
20PRINTV1

Теперь предположим, что цифровые префиксы были разрешены. Как бы вы это истолковали?

101V=100

в

10 1V = 100

или как

101 V = 100

или как

1 01V = 100

Итак, это было объявлено незаконным.

35 голосов
/ 13 октября 2014

Потому что в лексическом анализе при компиляции избегается откат назад. Переменная типа:

Apple;

компилятор сразу узнает, что это идентификатор, когда встречает букву «А».

Однако переменная типа:

123apple;

компилятор не сможет решить, является ли он числом или идентификатором, пока не достигнет «а», и в результате ему потребуется откат.

13 голосов
/ 05 декабря 2008

Компиляторы / парсеры / лексические анализаторы были для меня давным-давно, но, думаю, я помню, что было трудно однозначно определить, представляет ли числовой символ в модуле компиляции литерал или идентификатор.

Языки, где пробел незначителен (например, АЛГОЛ и оригинальный ФОРТРАН, если я правильно помню), по этой причине не могли принимать числа для начала идентификаторов.

Это происходит задолго до специальных обозначений для обозначения хранилища или числовой базы.

7 голосов
/ 26 мая 2009

Я согласен, было бы удобно, чтобы идентификаторы начинались с цифры. Один или два человека упомянули, что вы можете обойти это ограничение, добавив подчеркивание к вашему идентификатору, но это действительно ужасно.

Я думаю, что часть проблемы связана с числовыми литералами, такими как 0xdeadbeef, из-за которых сложно придумать легко запоминающиеся правила для идентификаторов, которые могут начинаться с цифры. Один из способов сделать это - разрешить что-либо, совпадающее с [A-Za-z _] +, которое НЕ является ключевым словом или числовым литералом. Проблема в том, что это может привести к странным вещам, таким как 0xdeadpork, но не 0xdeadbeef. В конечном счете, я думаю, что мы должны быть справедливы ко всем видам мяса: P.

Когда я впервые изучал C, я помню, что правила имен переменных были произвольными и строгими. Хуже всего было то, что их было трудно запомнить, поэтому я перестал пытаться учить их. Я просто сделал то, что чувствовал себя хорошо, и это сработало довольно хорошо. Теперь, когда я многому научился, это не кажется таким уж плохим, и я наконец-то нашел способ научиться этому правильно.

6 голосов
/ 05 декабря 2008

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

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

Существует также стилистическое значение, идентификаторы которого должны быть мнемоническими, поэтому слова гораздо легче запомнить, чем числа. Когда было написано много оригинальных языков, устанавливающих стили на следующие несколько десятилетий, они не думали о замене «2» вместо «на».

4 голосов
/ 05 декабря 2008

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

Тем не менее, почти все время язык не позволяет именам переменных начинаться с цифр, потому что это правила дизайна языка. Часто это потому, что такое простое правило значительно упрощает синтаксический анализ и лексирование языка. Однако не все языковые дизайнеры знают, что это настоящая причина. Современные лексические инструменты помогают, потому что, если вы попытаетесь определить его как допустимый, они приведут к конфликтам при разборе.

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

Для примера довольно простого языка шаблонов HTML, который позволяет переменным начинаться с цифр и имеют встроенные пробелы, посмотрите Qompose .

4 голосов
/ 05 декабря 2008

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

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

Насколько я помню (около 40 лет), я не думаю, что когда-либо использовал язык, который позволял использовать цифру для начала имен переменных. Я уверен, что это было сделано хотя бы один раз. Может быть, кто-то здесь действительно где-то видел это.

4 голосов
/ 26 апреля 2011

Потому что, если вы позволите ключевому слову и идентификатору начинаться с цифровых символов, лексер (часть компилятора) не сможет легко различить начало числового литерала и ключевого слова, не усложняя (и медленнее) .

...