Введение
Символ, добавляемый к имени переменной. В компьютерном программировании сигил (произносится /ˈsɪdʒəl/) — это символ, добавляемый к имени переменной для обозначения её типа данных или области видимости, как правило, в виде префикса, например, в $foo, где $ является сигилом. Слово «сигил» происходит от латинского sigillum, означающего «маленький знак», и первоначально обозначало знак или изображение, которому приписывалась магическая сила. Сигилы могут использоваться для разделения и разграничения пространств имён, обладающих различными свойствами или поведением.
In computer programming, a sigil ('/s//ɪ//dʒ//əl/) is a symbol affixed to a variable name, showing the variable's datatype or scope, usually a prefix, as in $foo, where $ is the sigil. Sigil, from the Latin sigillum, meaning a "little sign", means a sign or image supposedly having magical power. Sigils can be used to separate and demarcate namespaces that possess different properties or behaviors.
Исторический контекст
Использование сигил стало популярным благодаря языку программирования 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# префикс "@" может использоваться как для стропирования (чтобы разрешить использование зарезервированных слов в качестве идентификаторов), так и как префикс литерала (для обозначения необработанной строки); в этом случае ни один из вариантов использования не является сигилом, поскольку он влияет на синтаксис идентификаторов или семантику литералов, а не на семантику идентификаторов.