Сигил (программирование)
В программировании, сигил[1][2] — это символ, прикрепленный к имени переменной, обозначающий тип данных или область видимости, как правило, префикс, как в $foo
, где $
является сигилом.
Sigil от латинского sigillum, что означает «маленький знак», означает знак или изображение, предположительно обладающее магической силой.[3] Сигилы могут использоваться для разграничения пространств имен, которые обладают разными свойствами и поведением.
Исторический контекст
Использование сигилов было популяризировано языком программирования Бейсик. Самый известный пример сигила в BASIC — знак доллара («$
»), добавляемый к именам всех строк. Многие диалекты BASIC используют и другие сигилы (например, «%
») для обозначения целых чисел, чисел с плавающей запятой и, иногда, других типов.
Ларри Уолл добавил сигилы в свой язык программирования Perl, подражая сигилам в сценариях командной строки. В Perl сигилы определяют не типы данных, такие как строки и целые числа, а более общие категории: скаляры (префикс «$
» от англ. scalar), массивы (префикс «@
» от англ. array), хэши (префикс «%
») и подпрограммы («&
»). Язык 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, «$
» — это унарный оператор, переводящий имя переменной в ее содержимое. Хотя это может показаться похожим на сигилы, это, собственно, оператор непрямого обращения, аналогичный оператору разыменования «*
» для указателей в C, что заметно по тому, что знак доллара опускается при присвоении переменной.
Соглашения об идентификаторах
В Фортране сигилы не используются, но все переменные, начинающиеся с букв I, J, K, L, M и N, по умолчанию являются целыми числами.[12] В документации Fortran это называется «неявная типизация», хотя всегда доступна явная типизация, позволяющая объявить любую переменную с любым типом. Выбор диапазона I-N соответствует традиционным соглашениям об именах переменных в математике.
Различные языки программирования, включая Prolog, Haskell, Ruby и Go, обрабатывают идентификаторы, начинающиеся с заглавной буквы, иначе, чем идентификаторы, начинающиеся с маленькой буквы.
Stropping
В Microsoft .NET Common Language Infrastructure (CLI) есть способ экранирования переменных на вызываемом языке, которые могут быть ключевыми словами на вызывающем языке, называемый в англоязычных источниках[13] stropping. Иногда это делается с помощью префиксов. Например, в 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, и как префикс к литералу (для обозначения неэкранированных строк); в этом случае ни одно использование не является сигилом, поскольку оно влияет на синтаксис идентификаторов или семантику литералов, а не на семантику идентификаторов.
См. также
Примечания
- Владимир Леттиев. Pragmatic Perl 13: Сигнатура функции в Perl 5.20 . Pragmatic Perl (13 марта 2014). — «...можно использовать обычный сигил [...] В данном примере функцию интересуют только первый и четвёртый аргументы. Для остальных аргументов указаны заполнители позиций: сигилы $ и @, они не будут определяться внутри функции.».
- Андрей Шитов. Pragmatic Perl 22: Perl 6 XXI века . Pragmatic Perl (22 декабря 2014). — «В Perl 6 для переменных используются сигилы, частично совпадающие с тем, что есть в Perl 5. В частности, скаляры, списки и хеши используют, соответственно, сигилы $, @ и %.».
- Definition of sigil . Collins English Dictionary. Дата обращения: 22 мая 2012.
- «Perl 6 variables:Twigils», Perl 6 Documentation
- Variables – Cycorp . www.Cyc.com. Дата обращения: 31 декабря 2017.
- Constants – Cycorp . www.Cyc.com. Дата обращения: 31 декабря 2017.
- Сигилы . Эликсир и Вунш (2020).
- Sigils (англ.). elixir-lang.github.com. Дата обращения: 27 июля 2021.
- mIRC Help . www.mirc.com. Дата обращения: 27 июля 2021.
- PEP 318 -- Decorators for Functions and Methods .
- Black. Bang methods; or, Danger, Will Rubyist! (15 August 2007). Архивировано 22 мая 2016 года.
- Rules for Data Typing (FORTRAN 77 Language Reference) . docs.oracle.com. Дата обращения: 4 августа 2021.
- King, Peter R., ed. (1974-06-18). “(unknown)”. Proceedings of an International Conference on ALGOL 68 Implementation. Department of Computer Science, University of Manitoba, Winnipeg: University of Manitoba, Department of Computer Science: 148. ISBN 9780919628113.
More serious problems are posed by "stropping", the technique used to distinguish boldface text from roman text. Some implementations demand apostrophes around boldface (whence the name stropping); others require backspacing and underlining; […]
- C# Keywords . MSDN. Дата обращения: 23 марта 2011.
- string (C# Reference) . MSDN. Дата обращения: 23 марта 2011.
- Linux kernel coding style, by Linus Torvalds