Идентификатор (компьютерные языки)
Эта статья нуждается в дополнительных цитатах для проверки . ( сентябрь 2019 г. ) |
В этой статье отсутствует информация о символах Юникода и рекомендациях UAX31. ( март 2021 г. ) |
В языках компьютерного программирования идентификатор — это лексический токен (также называемый символом , но не путать с примитивным типом данных символа ), который называет сущности языка. Некоторые из типов объектов, которые может обозначать идентификатор, включают переменные , типы данных , метки , подпрограммы и модули .
Лексическая форма
[ редактировать ]Какие последовательности символов составляют идентификаторы, зависит от лексической грамматики языка. Общим правилом являются буквенно-цифровые последовательности, с подчеркиванием также разрешено (в некоторых языках _ не разрешено) и с условием, что оно не может начинаться с числовой цифры (чтобы упростить лексику и не путать с целочисленными литералами ) – так foo, foo1, foo_bar, _foo
разрешены, но 1foo
нет – это определение использовалось в более ранних версиях C и C++ , Python и многих других языках. Более поздние версии этих языков, как и многие другие современные языки, поддерживают Юникода в идентификаторах гораздо больше символов . Однако общим ограничением является запрет на использование пробельных символов и языковых операторов; это упрощает токенизацию, делая ее свободной и контекстно-свободной . Например, запретить +
в идентификаторах из-за его использования в качестве двоичной операции означает, что a+b
и a + b
могут быть токенизированы одинаково, а если бы это было разрешено, a+b
будет идентификатором, а не дополнением. Пробелы в идентификаторах особенно проблематичны, так как если в идентификаторах разрешены пробелы, то такое предложение, как if rainy day then 1
является законным, с rainy day
в качестве идентификатора, но для его токенизации требуется фразовый контекст нахождения в условии предложения if. Однако некоторые языки допускают пробелы в идентификаторах, например АЛГОЛ 68 и некоторые варианты АЛГОЛа. Например, допустимым утверждением является следующее: real half pi;
который можно было бы ввести как .real. half pi;
(ключевые слова выделены жирным шрифтом, конкретно через обрезку ). В АЛГОЛе это было возможно, поскольку ключевые слова синтаксически дифференцированы, поэтому нет риска коллизий или двусмысленности, пробелы устраняются на этапе восстановления строки , а источник обрабатывался посредством синтаксического анализа без сканирования , поэтому лексирование может быть контекстно-зависимым.
В большинстве языков некоторые последовательности символов имеют лексическую форму идентификатора, но известны как ключевые слова , например: if
часто является ключевым словом для предложения if, но лексически имеет ту же форму, что и ig
или foo
а именно последовательность букв. Это перекрытие можно обрабатывать различными способами: им можно запретить быть идентификаторами – что упрощает токенизацию и синтаксический анализ – и в этом случае они являются зарезервированными словами ; они оба могут быть разрешены, но различаться другими способами, например, посредством ограничения; или последовательности ключевых слов могут быть разрешены в качестве идентификаторов, смысл которых определяется из контекста, что требует контекстно-зависимого лексера. Неключевые слова также могут быть зарезервированными словами (запрещенными в качестве идентификаторов), особенно для прямой совместимости , на случай, если слово может стать ключевым словом в будущем. В некоторых языках, например PL/1 , различие неясно.
Семантика
[ редактировать ]Область действия или доступность идентификатора в программе может быть локальной или глобальной. Глобальный идентификатор объявляется вне функций и доступен во всей программе. Локальный идентификатор объявляется внутри определенной функции и доступен только внутри этой функции. [1]
Для реализаций языков программирования, использующих компилятор , идентификаторы часто представляют собой только объекты времени компиляции . То есть во время выполнения скомпилированная программа содержит ссылки на адреса и смещения памяти, а не на токены текстовых идентификаторов (эти адреса памяти или смещения присваиваются компилятором каждому идентификатору).
В языках, поддерживающих отражение , например интерактивную оценку исходного кода (с использованием интерпретатора или инкрементального компилятора), идентификаторы также являются сущностями времени выполнения, иногда даже как первоклассные объекты , которыми можно свободно манипулировать и оценивать. В Лиспе они называются символами .
Компиляторы и интерпретаторы обычно не придают идентификатору никакого семантического значения на основе фактической используемой последовательности символов. Однако есть исключения. Например:
- В Perl переменная обозначается с помощью префикса, называемого сигилом , который определяет аспекты интерпретации переменной в выражениях .
- В Ruby переменная автоматически считается неизменяемой , если ее идентификатор начинается с заглавной буквы.
- В Go использование заглавной буквы имени переменной определяет ее видимость (прописные для общедоступных, строчные для частных).
В некоторых языках, таких как Go, уникальность идентификаторов основана на их написании и видимости. [2]
В HTML идентификатор — это один из возможных атрибутов элемента HTML- . Он уникален в пределах документа.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Малик, Д. (2014). Программирование на C++: от анализа проблем к проектированию программ (7-е изд.). Cengage Обучение. п. 397. ИСБН 978-1-285-85274-4 .
- ^ «Спецификация языка программирования Go — Язык программирования Go» . Голанг.орг. 08.05.2013 . Проверено 5 июня 2013 г.