Сигил (программирование)

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

В программировании, сигил[1][2] — это символ, прикрепленный к имени переменной, обозначающий тип данных или область видимости, как правило, префикс, как в $foo, где $ является сигилом.

Sigil от латинского sigillum, что означает «маленький знак», означает знак или изображение, предположительно обладающее магической силой.[3] Сигилы могут использоваться для разграничения пространств имен, которые обладают разными свойствами и поведением.

Исторический контекст[править | править код]

Использование сигилов было популяризировано языком программирования Бейсик. Самый известный пример сигила в BASIC — знак доллара$»), добавляемый к именам всех строк. Многие диалекты BASIC используют и другие сигилы (например, «%») для обозначения целых чисел, чисел с плавающей запятой и, иногда, других типов.

Ларри Уолл добавил сигилы в свой язык программирования Perl, подражая сигилам в сценариях командной строки.[источник не указан 1001 день] В 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, «$» — это унарный оператор, переводящий имя переменной в её содержимое. Несмотря на внешнее сходство, знак в данном случае не является частью имени, что заметно по его отсутствию в присваивании. Аналог в Сиоператор разыменования[англ.] указателей.

Соглашения об идентификаторах[править | править код]

В Фортране сигилы не используются, но все переменные, начинающиеся с букв I, J, K, L, M и N, по умолчанию являются целыми числами.[12] В документации Fortran это называется «неявная типизация», хотя всегда доступна явная типизация, позволяющая объявить любую переменную с любым типом. Выбор диапазона I-N соответствует традиционным соглашениям об именах переменных в математике.

Различные языки программирования, включая Prolog, Haskell, Ruby и Go, обрабатывают идентификаторы, начинающиеся с заглавной буквы, иначе, чем идентификаторы, начинающиеся с маленькой буквы.

Stropping[править | править код]

В Microsoft .NET Common Language Infrastructure (CLI) есть способ экранирования переменных на вызываемом языке, которые могут быть ключевыми словами на вызывающем языке, называемый в англоязычных источниках stropping[англ.][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, и как префикс к литералу (для обозначения неэкранированных строк); в этом случае ни одно использование не является сигилом, поскольку оно влияет на синтаксис идентификаторов или семантику литералов, а не на семантику идентификаторов.

См. также[править | править код]

Примечания[править | править код]

  1. Владимир Леттиев. Pragmatic Perl 13: Сигнатура функции в Perl 5.20. Pragmatic Perl (13 марта 2014). — «...можно использовать обычный сигил [...] В данном примере функцию интересуют только первый и четвёртый аргументы. Для остальных аргументов указаны заполнители позиций: сигилы $ и @, они не будут определяться внутри функции.» Дата обращения: 13 сентября 2021. Архивировано 13 сентября 2021 года.
  2. Андрей Шитов. Pragmatic Perl 22: Perl 6 XXI века. Pragmatic Perl (22 декабря 2014). — «В Perl 6 для переменных используются сигилы, частично совпадающие с тем, что есть в Perl 5. В частности, скаляры, списки и хеши используют, соответственно, сигилы $, @ и %.» Дата обращения: 13 сентября 2021. Архивировано 13 сентября 2021 года.
  3. Definition of sigil. Collins English Dictionary. Дата обращения: 22 мая 2012. Архивировано 1 мая 2021 года.
  4. «Perl 6 variables:Twigils» Архивная копия от 17 июня 2016 на Wayback Machine, Perl 6 Documentation
  5. Variables – Cycorp. www.Cyc.com. Дата обращения: 31 декабря 2017. Архивировано 25 января 2018 года.
  6. Constants – Cycorp. www.Cyc.com. Дата обращения: 31 декабря 2017. Архивировано 25 января 2018 года.
  7. Сигилы. Эликсир и Вунш (2020). Дата обращения: 13 сентября 2021. Архивировано 13 сентября 2021 года.
  8. Sigils (англ.). elixir-lang.github.com. Дата обращения: 27 июля 2021. Архивировано 2 августа 2021 года.
  9. mIRC Help. www.mirc.com. Дата обращения: 27 июля 2021. Архивировано 9 августа 2021 года.
  10. PEP 318 -- Decorators for Functions and Methods. Дата обращения: 9 августа 2021. Архивировано 3 июня 2020 года.
  11. Black. Bang methods; or, Danger, Will Rubyist! (15 августа 2007). Архивировано 22 мая 2016 года.
  12. Rules for Data Typing (FORTRAN 77 Language Reference). docs.oracle.com. Дата обращения: 4 августа 2021. Архивировано 25 февраля 2021 года.
  13. King, Peter R., ed. (1974-06-18). "Proceedings of an International Conference on ALGOL 68 Implementation". 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. Архивировано 9 августа 2021. Дата обращения: 9 августа 2021. 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; […]
  14. C# Keywords. MSDN. Дата обращения: 23 марта 2011. Архивировано 28 января 2017 года.
  15. string (C# Reference). MSDN. Дата обращения: 23 марта 2011. Архивировано 14 марта 2011 года.
  16. Linux kernel coding style Архивная копия от 9 августа 2021 на Wayback Machine, by Linus Torvalds