Русская Википедия:Сигил (программирование)

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

В программировании, сигил[1][2] — это символ, прикрепленный к имени переменной, обозначающий тип данных или область видимости, как правило, префикс, как в $foo, где $ является сигилом.

Sigil от латинского sigillum, что означает «маленький знак», означает знак или изображение, предположительно обладающее магической силой.[3] Сигилы могут использоваться для разграничения пространств имен, которые обладают разными свойствами и поведением.

Исторический контекст

Использование сигилов было популяризировано языком программирования Бейсик. Самый известный пример сигила в BASIC — знак доллара$»), добавляемый к именам всех строк. Многие диалекты BASIC используют и другие сигилы (например, «%») для обозначения целых чисел, чисел с плавающей запятой и, иногда, других типов.

Ларри Уолл добавил сигилы в свой язык программирования Perl, подражая сигилам в сценариях командной строки.Шаблон:Нет АИ В Perl сигилы определяют не типы данных, такие как строки и целые числа, а более общие категории: скаляры (префикс «$» от Шаблон:Lang-en), массивы (префикс «@» от Шаблон:Lang-en), хэши (префикс «%») и подпрограммы&»). Язык Raku также использует вспомогательные сигилы, располагающиеся между сигилами и названиями переменных, твигилы,[4] для обозначения областей видимости переменных. Яркие примеры твигилов в Raku: «^», используемый с самопровозглашёнными в теле блока или подпрограммы позиционными аргументами этого блока или подпрограммы; «.», используемый с атрибутами объектов (свойствами и методами).

В CLIPS, у скалярных переменных префикс «?», а у множественных (например, одноуровневых списков) — префикс «$?».

В Common Lisp переменные с динамической областью видимости обычно заключаются в «*» («earmuff convention»). Хотя это всего лишь соглашение, и вовсе не обязательно так делать, сам язык использует эту практику (например, *standard-output*). Некоторые программисты заключают константы в «+».

В CycL перед переменными стоит знак «?».[5] Имена констант начинаются с префикса «#$» (произносится как «хэш-доллар»).[6]

В Elixir сигилами называются формы синтаксиса, начинающиеся с символа «~», позволяющие объявлять регулярные выражения, строковые литералы, списки, даты.[7][8]

В MAPPER (он же BIS), именованные переменные берутся в треугольные скобки, так как строки и символы не требуют кавычек.

В сценариях MIRC, идентификаторы (возвращают вычисляемые значения[9]) пишутся с префиксом «$», а переменные — с префиксом «%» (как локальные, так и глобальные). У переменных для двоичных данных произвольного размера — префикс «&».

В языке программирования MUMPS символ «$» предшествует именам системных функций и «именам специальных переменных» (системным переменным для доступа к состоянию выполнения). Сигил «$Z» предшествует именам нестандартных системных функций. Сигил «$$» предшествует именам пользовательских функций. Имена подпрограмм (в некоторых случаях) и глобальных переменных (хранятся на диске), начинаются с символа «^».

В Objective-C строковые литералы, которым предшествует «@», являются экземплярами класса NSString или, начиная с clang v3.1 / LLVM v4.0, NSNumber, NSArray или NSDictionary . Префикс «@» также используется в ключевых словах @interface, @implementation и @end, используемых в синтаксисе определения классов. В классах также используется префикс «-» для обозначения методов и полей экземпляра (объекта), а префикс «+» указывает на элементы класса (то есть типа объектов).

В языке PHP, который во многом был вдохновлен Perl, «$» стоит перед именами всех переменных. Имена без этого префикса считаются константами, именами функций или классов (или именами интерфейсов или типажей, которые используют то же пространство имен, что и классы).

PILOT использует «$» для буферов (строковых переменных), «#» для целочисленных переменных и «*» для меток.

Python использует «@» (pie syntax) для навешивания декораторов[10] и «__», (dunder) для «приватных» членов класса.

В Ruby у обычных переменных нет сигилов, но перед глобальными переменными ставится «$», перед переменными экземпляров ставится префикс «@», а перед переменными класса — префикс «@@». В Ruby также используются (строго конвенциональные) суффиксные сигилы: «?» указывает метод предиката, возвращающий булевое значение; «!» указывает, что метод может иметь потенциально неожиданный эффект и требует осторожного обращения.[11]

В Scheme по соглашению имена процедур, которые всегда возвращают логическое значение, обычно оканчиваются на «?». Имена процедур, которые хранят значения в частях предварительно выделенных объектов Scheme (таких как пары, векторы или строки), обычно заканчиваются на «!».

Standard ML использует префиксный сигил «'» для переменных, которые относятся к типам. Если сигил удваивается, это относится к типу, для которого определено равенство. Символ «'» также может появляться внутри или в конце имён переменных, и в этом случае у него нет чёткого значения.

В Transact-SQL символ «@» предшествует имени локальной переменной или параметра. Системные переменные (известные как глобальные переменные) выделяются с помощью «@@».

В Windows PowerShell, который частично был вдохновлен оболочкой Unix и Perl, имена переменных начинаются с символа «$».

В XSLT у переменных и параметров при использовании есть префикс «$», хотя при определении в <xsl:param> или <xsl:variable> в атрибуте name сигил не добавляется. Связанный с XSLT язык XQuery использует «$» как в определении, так и при использовании.

В MEL у имён переменных есть префикс «$», чтобы их можно было отличать от функций, команд и других идентификаторов.

Похожие явления

Переменные командной оболочки

В Unix shell и таких утилитах, как Makefiles, «$» — это унарный оператор, переводящий имя переменной в её содержимое. Несмотря на внешнее сходство, знак в данном случае не является частью имени, что заметно по его отсутствию в присваивании. Аналог в СиШаблон:Iw указателей.

Соглашения об идентификаторах

В Фортране сигилы не используются, но все переменные, начинающиеся с букв I, J, K, L, M и N, по умолчанию являются целыми числами.[12] В документации Fortran это называется «неявная типизация», хотя всегда доступна явная типизация, позволяющая объявить любую переменную с любым типом. Выбор диапазона I-N соответствует традиционным соглашениям об именах переменных в математике.

Различные языки программирования, включая Prolog, Haskell, Ruby и Go, обрабатывают идентификаторы, начинающиеся с заглавной буквы, иначе, чем идентификаторы, начинающиеся с маленькой буквы.

Stropping

В Microsoft .NET Common Language Infrastructure (CLI) есть способ экранирования переменных на вызываемом языке, которые могут быть ключевыми словами на вызывающем языке, называемый в англоязычных источниках Шаблон:Iw[13]. Иногда это делается с помощью префиксов. Например, в C# имена переменных могут начинаться с префикса «@».[14] В VB.Net для той же цели используются квадратные скобки.[15]

Венгерская нотация

С сигилами связана венгерская нотация — соглашение об именах переменных, которое определяет тип переменной путем добавления определенных буквенных префиксов к имени переменной. В отличие от сигилов, венгерская нотация не предоставляет компилятору никакой информации; типы должны быть явно указаны для переменных (если не используется язык с выводом типов). Поскольку большинство стандартных компиляторов не предписывают использование префиксов, это позволяет совершать ошибки и делает код подверженным путанице из-за случайного неверного использования.[16]

Буквенные аффиксы

В то время как сигилы применяются к именам (идентификаторам), аналогичные префиксы и суффиксы могут применяться к литералам, особенно к целочисленным и строковым, определяя либо способ интерпретации литерала, либо его тип данных. Например, 0x10ULL расценивается как значение 16 с типом данных unsigned long long в C++: 0x указывает, что это шестнадцатеричное число, а суффикс ULL обозначает тип. Префиксы часто используются для обозначения строк без экранирования символов. Например r"C:\Windows" в Python в виде экранированной строки было бы записано как "C:\\Windows".

Поскольку это влияет на семантику (значение) литерала, а не на синтаксис или семантику идентификатора (имени), это не stropping (синтаксис идентификатора) и не сигил (семантика идентификатора), несмотря на синтаксическое сходство.

Аннотации Java

Например, встроенные аннотации Java, такие как @Override и @Deprecated.

Путаница

В некоторых случаях один и тот же синтаксис может использоваться для разных целей, что может вызвать путаницу. Например, в C# префикс «@» может использоваться и как stropping, и как префикс к литералу (для обозначения неэкранированных строк); в этом случае ни одно использование не является сигилом, поскольку оно влияет на синтаксис идентификаторов или семантику литералов, а не на семантику идентификаторов.

См. также

Примечания

Шаблон:Примечания