Русская Википедия:Сигил (программирование)
В программировании, сигил[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, и как префикс к литералу (для обозначения неэкранированных строк); в этом случае ни одно использование не является сигилом, поскольку оно влияет на синтаксис идентификаторов или семантику литералов, а не на семантику идентификаторов.
См. также
Примечания
- ↑ Шаблон:Cite web
- ↑ Шаблон:Cite web
- ↑ Шаблон:Cite web
- ↑ «Perl 6 variables:Twigils» Шаблон:Wayback, Perl 6 Documentation
- ↑ Шаблон:Cite web
- ↑ Шаблон:Cite web
- ↑ Шаблон:Cite web
- ↑ Шаблон:Cite web
- ↑ Шаблон:Cite web
- ↑ Шаблон:Cite web
- ↑ Шаблон:Cite web
- ↑ Шаблон:Cite web
- ↑ Шаблон:Cite journal
- ↑ Шаблон:Cite web
- ↑ Шаблон:Cite web
- ↑ Linux kernel coding style Шаблон:Wayback, by Linus Torvalds