Почему имена переменной не могут запуститься с чисел?

126
задан phuclv 24 November 2018 в 07:12
поделиться

12 ответов

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

int 17 = 497;
int 42 = 6 * 9;
String 1111 = "Totally text";
103
ответ дан 24 November 2019 в 00:50
поделиться

Я думаю, что простой ответ - то, что это может, ограничение быть базирующимся языком. В C++ и многих других это не может, потому что язык не поддерживает его. Это не встроено в правила позволить это.

вопрос сродни выяснению, почему Король не может переместить четыре пробелов за один раз в Шахматы? Это - потому что в Шахматах, которые являются недопустимым перемещением. Может это в другой уверенной игре. Это просто зависит от правил, играемых.

0
ответ дан 24 November 2019 в 00:50
поделиться

C++ не может иметь его, потому что разработчики языка сделали это правилом. Если бы необходимо было создать собственный язык, то Вы могли бы, конечно, позволить его, но Вы, вероятно, столкнулись бы с теми же проблемами, которые они сделали и решают не позволить его. Примеры имен переменной, которые вызвали бы проблемы:

0x, 2-й, 5555

2
ответ дан 24 November 2019 в 00:50
поделиться

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

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

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

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

4
ответ дан 24 November 2019 в 00:50
поделиться

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

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

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

4
ответ дан 24 November 2019 в 00:50
поделиться

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

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

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

6
ответ дан 24 November 2019 в 00:50
поделиться

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

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

, Что такое a? 2.0? или 42?

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

111
ответ дан 24 November 2019 в 00:50
поделиться

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

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

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

13
ответ дан 24 November 2019 в 00:50
поделиться

Probably because it makes it easier for the human to tell whether it's a number or an identifier, and because of tradition. Having identifiers that could begin with a digit wouldn't complicate the lexical scans all that much.

Not all languages have forbidden identifiers beginning with a digit. In Forth, they could be numbers, and small integers were normally defined as Forth words (essentially identifiers), since it was faster to read "2" as a routine to push a 2 onto the stack than to recognize "2" as a number whose value was 2. (In processing input from the programmer or the disk block, the Forth system would split up the input according to spaces. It would try to look the token up in the dictionary to see if it was a defined word, and if not would attempt to translate it into a number, and if not would flag an error.)

1
ответ дан 24 November 2019 в 00:50
поделиться

Предположим, вы разрешили имена символов начинаться с цифр. Теперь предположим, что вы хотите назвать переменную 12345foobar. Как бы вы отличили это от 12345? На самом деле это не так уж сложно сделать с регулярным выражением. Проблема на самом деле в производительности. Я не могу объяснить, почему это так подробно, но по сути это сводится к тому факту, что для отличия 12345foobar от 12345 требуется возврат. Это делает регулярное выражение недетерминированным.

Гораздо лучшее объяснение здесь .

1
ответ дан 24 November 2019 в 00:50
поделиться

I agree it would be handy to allow identifiers to begin with a digit. One or two people have mentioned that you can get around this restriction by prepending an underscore to your identifier, but that's really ugly.

I think part of the problem comes from number literals such as 0xdeadbeef, which make it hard to come up with easy to remember rules for identifiers that can start with a digit. One way to do it might be to allow anything matching [A-Za-z_]+ that is NOT a keyword or number literal. The problem is that it would lead to weird things like 0xdeadpork being allowed, but not 0xdeadbeef. Ultimately, I think we should be fair to all meats :P.

When I was first learning C, I remember feeling the rules for variable names were arbitrary and restrictive. Worst of all, they were hard to remember, so I gave up trying to learn them. I just did what felt right, and it worked pretty well. Now that I've learned alot more, it doesn't seem so bad, and I finally got around to learning it right.

7
ответ дан 24 November 2019 в 00:50
поделиться

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

Разве не Дайкстра сказал, что «наиболее важным аспектом любого инструмента является его влияние на его пользователя»?

2
ответ дан 24 November 2019 в 00:50
поделиться
Другие вопросы по тегам:

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