Введение

Символ, добавляемый к имени переменной. В компьютерном программировании сигил (произносится /ˈsɪdʒəl/) — это символ, добавляемый к имени переменной для обозначения её типа данных или области видимости, как правило, в виде префикса, например, в $foo, где $ является сигилом. Слово «сигил» происходит от латинского sigillum, означающего «маленький знак», и первоначально обозначало знак или изображение, которому приписывалась магическая сила. Сигилы могут использоваться для разделения и разграничения пространств имён, обладающих различными свойствами или поведением.

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

Использование сигил стало популярным благодаря языку программирования BASIC. Наиболее известным примером сигила в BASIC является знак доллара ("$"), добавляемый к именам всех строк. В результате программисты за пределами Америки склонны произносить "$" как "строка", а не "доллар". Многие диалекты BASIC используют другие сигилы (например, "%") для обозначения целых чисел, чисел с плавающей точкой и их точности, а иногда и других типов данных. Ларри Уолл перенял использование сигил из оболочечных скриптов для своего языка программирования Perl. В Perl сигилы не определяют конкретные типы данных, такие как строки и целые числа, а более общие категории: скаляры (с префиксом "$"), массивы (с префиксом "@"), хеши (с префиксом "%") и подпрограммы (с префиксом "&"). Raku также использует вторичные сигилы, или твигилы, для указания области видимости переменных. Яркими примерами твигилов в Raku являются "^" (карет), используемый с самоопределяемыми формальными параметрами ("заполнители"), и ".", используемый для доступа к атрибутам объектов (то есть, переменным экземпляра).

Сигилы на некоторых языках

В CLIPS скалярные переменные имеют префикс "?" sigil, а многопольные (например, список первого уровня) переменные – префикс "$?". В Common Lisp специальные переменные (с динамической областью видимости) обычно заключаются в * в так называемой "конвенции earmuff". Хотя это лишь соглашение, а не требование, сам язык принимает эту практику (например, *стандартный вывод*). Аналогично, некоторые программисты заключают константы в +. В CycL переменные имеют префикс "?" sigil. Имена констант также имеют префикс "#$" (произносится "hash dollar"). В Elixir sigils предоставляются с помощью символа "~", за которым следует буква, обозначающая тип sigil, а затем разделители. Например, ~r(foo) – это регулярное выражение "foo". Другие sigils включают ~s для строк и ~D для дат. Программисты также могут создавать свои собственные sigils. В эзотерическом INTERCAL переменные являются 16-битным целым числом с префиксом "." (называемым "spot") для 16-битных значений, ":" (называемым "twospot") для 32-битных значений, "," ("tail") для массивов 16-битных значений и ";" ("hybrid") для массивов 32-битных значений. Позднее CLC Intercal добавил "@" ("whirlpool") для переменной, которая не может содержать значение (используется для классов), и " " используется для хранения модифицированного компилятора. В MAPPER (также известном как BIS) именованные переменные имеют префикс "<" и суффикс ">", поскольку строки или символьные значения не требуют кавычек. В mIRC-скрипте идентификаторы имеют sigil "$", а все переменные имеют префикс "%" (независимо от локальных или глобальных переменных или типа данных). Бинарные переменные имеют префикс "&". В языке программирования MUMPS "$" предшествует именам встроенных функций и "специальным именам переменных" (встроенным переменным для доступа к состоянию выполнения). "$Z" предшествует нестандартным встроенным функциям. "$$" предшествует внешним функциям. Рутины (используемые для процедур, подпрограмм, функций) и глобальные переменные (хранение в базе данных) имеют префикс "^". Последнее поддерево глобальной переменной может быть сослано косвенно с помощью "^" и последнего индекса; это называется "голым обращением". Системные рутины и глобальные переменные (хранящиеся в определенных общих базах данных) имеют префикс ^%; они называются "процентными рутинами" и "процентными глобальными". В Objective C строковые литералы с префиксом "@" являются экземплярами типа объекта NSString или, начиная с clang v3.1 / LLVM v4.0, NSNumber, NSArray или NSDictionary. Префикс @ также используется в ключевых словах interface, implementation и end для выражения структуры определений классов. В объявлениях и определениях классов префикс используется для обозначения методов и переменных-членов, а префикс + указывает элементы класса. В языке PHP, который во многом вдохновлен Perl, "$" предшествует любому имени переменной. Имена, не имеющие этого префикса, считаются константами, функциями или именами классов (или именами интерфейсов или трейтов, которые используют то же пространство имен, что и классы). PILOT использует "$" для буферов (строковых переменных), "#" для целочисленных переменных и "*" для меток программы. Python использует префикс " " (dunder) для "приватных" атрибутов. В Ruby обычные переменные не имеют sigils, но "$" предшествует глобальным переменным, "@" – переменным экземпляра, а "@@" – переменным класса. Ruby также допускает (строго по соглашению) суффиксы sigils: "?" указывает на предикатный метод, возвращающий булево или истинное/ложное значение, а "!" указывает на то, что метод может иметь потенциально неожиданный эффект и требует осторожного обращения. В Scheme по соглашению имена процедур, которые всегда возвращают булево значение, обычно заканчиваются на "?". Аналогично, имена процедур, которые сохраняют значения в части ранее выделенных объектов Scheme (таких как пары, векторы или строки), обычно заканчиваются на "!". Standard ML использует префикс "'" для переменной, которая относится к типу. Если sigil удваивается, он относится к типу, для которого определено равенство. Символ "'" также может появляться внутри или в конце переменной, в этом случае он не имеет специального значения. В Transact SQL "@" предшествует имени локальной переменной или параметра. Системные функции (ранее известные как глобальные переменные) отличаются префиксом "@@". Область временных таблиц обозначается префиксом "#", обозначающим локальную, и "##", обозначающим глобальную. В Windows PowerShell, который частично вдохновлен Unix shells и Perl, имена переменных имеют префикс "$" sigil. В XSLT переменные и параметры имеют ведущий "$" sigil при использовании, хотя при определении в <xsl:param> или <xsl:variable> с атрибутом "name" sigil не включается. В связи с XSLT, XQuery использует "$" sigil как при определении, так и при использовании. В MEL имена переменных имеют префикс "$", чтобы отличить их от функций, команд и других идентификаторов.

Переменные скриптов оболочки

В скриптах оболочки Unix и в утилитах, таких как Makefiles, символ "$" является унарным оператором, который заменяет имя переменной её значением. Хотя это может показаться похожим на сигил, это, строго говоря, унарный оператор для лексической косвенности, аналогичный оператору * для разыменования указателей в C, что заметно по тому факту, что знак доллара опускается при присваивании значения переменной.

Идентификационные соглашения

В Фортране сигилы не используются, но все переменные, начинающиеся с букв I, J, K, L, M и N, по умолчанию являются целыми числами. В документации Fortran это называется "неявным приведением типов". Также доступна явная типизация, позволяющая объявлять любую переменную с любым типом. Различные языки программирования, включая Prolog, Haskell, Ruby и Go, по-разному обрабатывают идентификаторы, начинающиеся с заглавной буквы, по сравнению с идентификаторами, начинающимися со строчной буквы, что связано с практикой использования сигил.

Ударение

На самом деле, это разновидность строппинга. Использование множества языков в общей языковой инфраструктуре Microsoft .NET (CLI) требует способа использования переменных в языке, отличном от языка, который их вызывает, при этом эти переменные могут совпадать с ключевыми словами в вызывающем языке. Для этого иногда используются префиксы. В C# любое имя переменной может быть предварено символом "@". Это в основном используется для того, чтобы разрешить использование имен переменных, которые в противном случае конфликтовали бы с ключевыми словами. В VB.NET того же эффекта достигают, заключая имя переменной в квадратные скобки, например, [end]. Символ "@" также может применяться к строковым литералам; подробнее см. в разделе о литеральных суффиксах ниже.

Венгерская обозначение

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

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

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

Аннотации Java

Сравните аннотации Java, такие как @Override и @Deprecated.

Спутанность

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