В компьютерном программировании сигил ( / ˈ s ɪ dʒ əl / ) — это символ, прикрепляемый к имени переменной и показывающий тип данных или область действия переменной , обычно префикс, например , где — сигил.$foo
$
Sigil , от латинского sigillum , что означает «маленький знак», означает знак или изображение, предположительно имеющее магическую силу . [1] Сигилы могут использоваться для разделения и разграничения пространств имен , обладающих различными свойствами или поведением.
Использование сигилов было популяризировано языком программирования BASIC . Наиболее известным примером сигила в BASIC является знак доллара (" $
"), добавляемый к именам всех строк . Следовательно, программисты за пределами Америки склонны [ неопределенно ] произносить $
как "string" вместо "dollar". [ необходима цитата ] Многие диалекты BASIC используют другие сигилы (например, " %
") для обозначения целых чисел и чисел с плавающей точкой и их точности, а иногда и других типов.
Ларри Уолл перенял использование сигилов из сценариев оболочки для своего языка программирования Perl . [ требуется ссылка ] В Perl сигилы не определяют мелкозернистые типы данных, такие как строки и целые числа, а более общие категории скаляров (с использованием префикса " $
"), массивов (с использованием " @
"), хэшей (с использованием " %
") и подпрограмм (с использованием " &
"). Raku также использует вторичные сигилы, или твигилы , [2] для указания области действия переменных. Известные примеры твигилов в Raku включают " ^
" ( вставка ), используемую с самообъявленными формальными параметрами ("переменными-заполнителями"), и " .
", используемую с аксессорами атрибутов объектов (т. е. переменными экземпляра).
В CLIPS скалярные переменные имеют префикс " ?
", в то время как многополевые переменные (например, одноуровневый список) имеют префикс " $?
".
В Common Lisp специальные переменные (с динамической областью действия) обычно окружаются *
в так называемом " earmuff convention ". Хотя это всего лишь соглашение, а не принудительное, сам язык принимает эту практику (например, *standard-output*). Аналогично, некоторые программисты окружают константы в +
.
В CycL переменные имеют префикс " ?
". [3] Аналогично, имена констант имеют префикс " #$
" (произносится как "хэш-доллар"). [4]
В Elixir сигилы предоставляются с помощью ~
символа " ", за которым следует буква для обозначения типа сигила, а затем разделители. Например, ~r(foo)
является регулярным выражением "foo". Другие сигилы включают ~s
для строк и ~D
для дат. Программисты также могут создавать свои собственные сигилы. [5]
В эзотерическом INTERCAL переменные представляют собой 16-битный целочисленный идентификатор с префиксом " .
" (называемым "spot") для 16-битных значений, " :
" (называемым "twospot") для 32-битных значений, " ,
" ("tail") для массивов 16-битных значений и " ;
" ("hybrid") для массивов 32-битных значений. [6] Более поздний CLC-Intercal добавил " @
" ("whirlpool") для переменной, которая не может содержать значения (используется для классов ) и " _
", используемый для хранения измененного компилятора . [7]
В MAPPER (он же BIS) именованные переменные имеют префикс «<» и суффикс «>», поскольку строки или символьные значения не требуют кавычек.
В скрипте mIRC идентификаторы имеют $
сигил " ", в то время как все переменные имеют %
префикс " " (независимо от того, являются ли переменные локальными или глобальными или типом данных). Двоичные переменные имеют префикс " &
".
В языке программирования MUMPS$
" " предшествует именам внутренних функций и "именам специальных переменных" (встроенные переменные для доступа к состоянию выполнения). " $Z
" предшествует нестандартным именам внутренних функций. " $$
" предшествует именам внешних функций. Процедуры (используемые для процедур, подпрограмм, функций) и глобальные переменные (хранилище базы данных) имеют префикс в виде вставки (^). На последнее поддерево глобальных переменных можно ссылаться косвенно с помощью вставки и последнего нижнего индекса; это называется "голой ссылкой". Общесистемные процедуры и глобальные переменные (хранящиеся в определенных общих базах данных)) имеют префикс в виде ^%; они называются "процентными процедурами" и "процентными глобальными переменными".
В Objective-C строковые литералы, начинающиеся с " @
", являются экземплярами типа объекта NSString
или, начиная с clang v3.1 / LLVM v4.0, NSNumber
, NSArray
или NSDictionary
. Префикс @
также используется в ключевых словах interface
, implementation
, и end
для выражения структуры определений классов. Внутри объявлений и определений классов префикс -
используется для указания методов-членов и переменных, в то время как префикс +
указывает на элементы класса.
В языке PHP , который во многом был вдохновлен Perl, " $
" предшествует любому имени переменной . Имена без этого префикса считаются константами , функциями или именами классов (или именами интерфейсов или черт, которые разделяют то же пространство имен, что и классы).
PILOT использует « $
» для буферов (строковых переменных), « #
» для целочисленных переменных и « *
» для меток программ.
Python использует __
префикс " ", называемый dunder , для "приватных" атрибутов .
В Ruby обычные переменные не имеют сигилов, но " $
" является префиксом для глобальных переменных , " @
" является префиксом для переменных экземпляра , а " @@
" является префиксом для переменных класса . Ruby также допускает (строго общепринятые) суффиксные сигилы: " ?
" указывает на предикатный метод, возвращающий логическое значение или истинное или ложное значение, а " !
" указывает на то, что метод может иметь потенциально неожиданный эффект и с ним нужно обращаться осторожно. [8]
В Scheme по соглашению имена процедур, которые всегда возвращают логическое значение, обычно заканчиваются на " ?
". Аналогично имена процедур, которые сохраняют значения в частях ранее выделенных объектов Scheme (таких как пары, векторы или строки), обычно заканчиваются на " !
".
Стандартный ML использует префикс сигил " '
" для переменной, которая ссылается на тип. Если сигил удваивается, он ссылается на тип, для которого определено равенство. '
Символ " " может также появляться внутри или в конце переменной, в этом случае он не имеет особого значения.
В Transact-SQL " @
" предшествует имени локальной переменной или параметра. Системные функции (ранее известные как глобальные переменные) различаются префиксом " @@
". Область действия временных таблиц обозначается префиксом " #
", обозначающим локальный, и " ##
", обозначающим глобальный.
В Windows PowerShell , который частично был вдохновлен оболочками Unix и Perl, имена переменных начинаются с $
символа " ".
В XSLT переменные и параметры имеют начальный $
символ " " при использовании, хотя при определении в атрибуте " " <xsl:param>
или <xsl:variable>
с ним name
символ не включается. В связи с XSLT, XQuery использует $
форму символа " " как в определении, так и при использовании.
В MEL имена переменных начинаются с префикса « $
», чтобы отличать их от функций, команд и других идентификаторов.
В скриптах оболочки Unix и в таких утилитах, как Makefiles , " $
" — это унарный оператор, который переводит имя переменной в ее содержимое. Хотя это может показаться похожим на сигил, на самом деле это унарный оператор для лексической косвенности , похожий на *
оператор разыменования для указателей в C , как заметно по тому факту, что знак доллара опускается при назначении переменной.
В Fortran сигилы не используются, но все переменные, начинающиеся с букв I, J, K, L, M и N, по умолчанию являются целыми числами . В документации Fortran это называется «неявной типизацией». Явная типизация также доступна, позволяя объявлять любую переменную с любым типом.
Различные языки программирования, включая Prolog , Haskell , Ruby и Go, обрабатывают идентификаторы, начинающиеся с заглавной буквы, иначе, чем идентификаторы, начинающиеся с маленькой буквы, что связано с использованием сигилов.
На самом деле, это форма стропинга , использование многих языков в .NET Common Language Infrastructure (CLI) Microsoft требует способа использования переменных на другом языке, которые могут быть ключевыми словами в вызывающем языке. Иногда это делается с помощью префиксов. В C# любые имена переменных могут иметь префикс " @
". Это в основном используется для того, чтобы разрешить использование имен переменных, которые в противном случае конфликтовали бы с ключевыми словами. [9] То же самое достигается в VB.Net путем заключения имени в квадратные скобки, как в [end]
. [10]
Префикс « @
» также может применяться к строковым литералам; см. литеральные аффиксы ниже.
С сигилами связана венгерская нотация — соглашение об именовании переменных, которое определяет тип переменной путем присоединения определенных буквенных префиксов к имени переменной. Однако, в отличие от сигил, венгерская нотация не предоставляет никакой информации компилятору; как таковые, явные типы должны быть избыточно указаны для переменных (если только не используется язык с выводом типа ). Поскольку большинство стандартных компиляторов не требуют использования префиксов, это допускает пропуски и также делает код подверженным путанице из-за случайного ошибочного использования. [11]
В то время как сигилы применяются к именам (идентификаторам), аналогичные префиксы и суффиксы могут применяться к литералам , в частности, к целочисленным литералам и строковым литералам , указывая либо то, как литерал должен быть оценен, либо какой у него тип данных. Например, 0x10ULL
вычисляется значение 16 как беззнаковое длинное целое число в C++: 0x
префикс указывает на шестнадцатеричное число, а суффикс ULL
указывает на беззнаковое длинное. Аналогично префиксы часто используются для указания на необработанную строку , например, r"C:\Windows"
в Python, которая представляет строку со значением C:\Windows
; как экранированная строка это будет записано как "C:\\Windows"
.
Поскольку это влияет на семантику (значение) литерала, а не на синтаксис или семантику идентификатора (имени), это не является ни исправлением (синтаксис идентификатора), ни сигилом (семантика идентификатора), но синтаксически похоже.
Сравните аннотации Java , такие как @Override и @Deprecated.
В некоторых случаях один и тот же синтаксис может использоваться для разных целей, что может вызвать путаницу. Например, в C# префикс " @
" может использоваться либо для стропинга (чтобы разрешить использовать зарезервированные слова в качестве идентификаторов), либо как префикс к литералу (чтобы указать на необработанную строку ); в этом случае ни одно из этих применений не является сигилом, поскольку влияет на синтаксис идентификаторов или семантику литералов, а не на семантику идентификаторов.