Кіріспе
Өзгергіш атауына қосылатын символ Компьютерлік бағдарламалауда, сигил ('/s//ɪ//dʒ//əl/) – өзгергіш атауына қосылатын символ, ол өзгергіштің дерек типін немесе қолданыс аймағын көрсетеді, әдетте префикс түрінде, мысалы, $foo, онда $ – сигил. Сигил сөзі латын тілінен алынған "кішкентай белгі" деген мағынаны білдіреді және сиқырлы күшке ие деп саналатын белгі немесе кескін дегенді білдіреді. Сигилдер әртүрлі қасиеттері немесе мінез-құлқы бар атау кеңістіктерін бөліп, оларды анықтау үшін қолданылуы мүмкін.
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-тегі сигилдің ең танымал мысалы – барлық жолдардың (string) аттарына қосылған доллар белгісі ("$"). Осының салдарынан, Америкадан тыс бағдарламашылар $-ды "доллар" емес, "жол" (string) деп айтуға бейім. Көптеген BASIC диалектілері бүтін сандар мен қозғалатын нүктелі сандарды және олардың дәлдігін, кейде басқа да түрлерін көрсету үшін басқа да сигильдерді ("%" сияқты) қолданады. Ларри Уолл өзінің Perl бағдарламалау тілі үшін shell скрипттеріндегі сигильдерді қолдануды қабылдады. Perl-де сигильдер жолдар мен бүтін сандар сияқты нақты дерек түрлерін емес, скалярлардың ("$" префиксімен), массивтердің ("@" қолданып), хэштердің ("%" қолданып) және кіші бағдарламалардың ("&" қолданып) жалпы санаттарын анықтайды. Raku сондай-ақ, айнымалылардың ауқымын көрсету үшін екіншілік сигильдерді немесе вигильдерді қолданады. Raku-дағы вигильдердің айқын мысалдары – өзіндік жарияланған формалды параметрлермен ("placeholder айнымалыларымен") қолданылатын "^" (карет) және объектінің атрибуттарымен (яғни, инстанция айнымалыларымен) қолданылатын ". " болып табылады.
Кейбір тілдерде мөртаңба қолдану
CLIPS-те скалярлық айнымалылар "?" белгісімен алдын-ала жазылады, ал көп өрістік (мысалы, 1 деңгейлі тізім) айнымалылар "$?" префиксімен беріледі. Common Lisp-те арнайы айнымалылар (динамикалық ауқымы бар) әдетте "құлақ тұтқасы" деп аталатын * белгісімен қоршалады. Бұл тек конвенция, міндетті емес, бірақ тілдің өзі осы практиканы қабылдайды (мысалы, *стандартты шығыс*). Сондай-ақ, кейбір бағдарламашылар тұрақтыларды + белгісімен қоршап алады. CycL-де айнымалылардың алдында "?" белгісі болады. Ал тұрақты атаулардың алдында "#$" (айтылуы "хаш доллар") болады. Elixir-де сигильдер "~" символы арқылы беріледі, содан кейін сигиль түрін білдіретін әріп, содан кейін айырғыштар. Мысалы, ~r(foo) – "foo" үлгісінің реттегіш өрнегі. Басқа сигильдерге ~s (жолдар үшін) және ~D (күндер үшін) жатады. Бағдарламашылар өздерінің сигильдерін де жасай алады. Эзотерикалық INTERCAL-да айнымалылар 16 биттік бүтін сандық идентификатор болып табылады, оның алдында "." (16 биттік мәндер үшін "spot" деп аталады), ":" (32 биттік мәндер үшін "twospot" деп аталады), "," ("tail" – 16 биттік мәндер массиві үшін) және ";" ("hybrid" – 32 биттік мәндер массиві үшін) болады. Кейінгі CLC Intercal өзгертілген компиляторды сақтау үшін қолданылатын "@" ("whirlpool") және мәні жоқ айнымалыға (сыныптар үшін пайдаланылады) " " қосты. 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 сондай-ақ (қатаң конвенция бойынша) суффикс сигильдерін рұқсат етеді: "?" boolean немесе truthy немесе falsy мәнін қайтаратын предикат әдісін көрсетеді, ал "!" әдістің күтпеген әсері болуы мүмкін екенін және оны мұқият қолдану қажет екенін көрсетеді. Scheme-де, конвенция бойынша, әрқашан boolean мәнін қайтаратын процедуралардың атаулары "?" таңбасымен аяқталады. Сол сияқты, бұрын бөлінген Scheme объектілерінің бөліктеріне (мысалы, жұптар, векторлар немесе тізбектер) мәндерді сақтайтын процедуралардың атаулары әдетте "!" таңбасымен аяқталады. Standard ML типке сілтеме жасайтын айнымалыға префикс сигилін "'" қолданады. Егер сигиль екі еселенген болса, онда ол теңдік анықталған типті білдіреді. "'" таңбасы айнымалының ішінде немесе соңында пайда болуы мүмкін, бұл жағдайда оның ерекше мәні жоқ. Transact SQL-де "@" жергілікті айнымалының немесе параметрдің атауынан бұрын келеді. Жүйелік функциялар (бұрын жаһандық айнымалылар деп аталатын) "@@" префиксімен ерекшеленеді. Уақытша кестелердің қолданылу аясын "#" префиксі (жергілікті үшін) және "##" префиксі (жаһандық үшін) көрсетеді. Windows PowerShell, Unix shell-дерінен және Perl-ден шабыттанған, айнымалы атаулары "$" сигилімен префикстеледі. XSLT-де айнымалылар мен параметрлерді пайдаланғанда алдынан "$" сигилі қойылады, бірақ <xsl:param> немесе <xsl:variable> элементтерінде "name" атрибутымен анықталғанда сигиль қосылмайды. XSLT-мен байланысты XQuery анықталғанда да, пайдаланғанда да "$" сигилін қолданады. MEL-де функциялар, командалар және басқа идентификаторлардан ажырату үшін айнымалы атаулары "$" префиксімен префикстеледі.
Shell скриптті айнымалылары
Unix shell скрипттерінде және Makefiles сияқты құралдарда "$" - айнымалы атауын оның мәніне айналдыратын бірлік оператор. Бұл сигилге ұқсас болғанымен, бұл лексикалық бағытталғандық үшін бірлік оператор, C тіліндегі көрсеткіштерге арналған * дерек алу операторына ұқсас, себебі айнымалыға мән берген кезде доллар белгісі қолданылмайды.
Идентификатор конвенциялары
Фортранда сигиллдер қолданылмайды, бірақ I, J, K, L, M және N әріптерімен басталатын барлық айнымалылар әдепкі бойынша бүтін сандар болып есептеледі. Фортран құжаттамасында мұны "жасырын типтеу" деп атайды. Кез келген айнымалыны кез келген типпен нақты түрде жариялау мүмкіндігі де бар. Пролог, Хаскелл, Руби және Go сияқты түрлі бағдарламалау тілдері үлкен әріппен басталатын идентификаторларды кіші әріппен басталатын идентификаторлардан өзгеше қарастырады, бұл сигиллдерді пайдаланумен байланысты.
Штрафтау
Шындығында, stropping-тің бір түрі, Microsoft-тің NET ортақ тілдік инфрақұрылымында (CLI) көптеген тілдерді қолдану, шақырушы тілде түйін сөздер болатын басқа тілдегі айнымалыларды пайдалану қажеттілігін тудырады. Мұндай жағдайларда префикстер қолданылады. C# тілінде кез келген айнымалы атауының басына "@" символын қоюға болады. Бұл, әсіресе, түйін сөздермен қақтығысатын айнымалы атауларын пайдалануға мүмкіндік береді. VB.Net-те осыған ұқсас әсерге атауды тік жақшалармен қоршау арқылы қол жеткізіледі, мысалы [end]. "@" префиксі мәтіндік литералдарға да қолданылуы мүмкін; қараңыз төмендегі литерал префикстері.
Венгриялық жазу
Сигильдермен байланысты мажар нотациясы – айнымалыларға ат қою ережесі, ол айнымалының типін айнымалы атауына белгілі бір әріптік префикстерді қосу арқылы көрсетеді. Дегенмен, сигильдерден өзгеше, мажар нотациясы компиляторға ешқандай ақпарат бермейді; сондықтан айнымалылар үшін типтерді қажетсіз ретте көрсету қажет (егер тіл типті анықтама мүмкіндігін ұсынбаса). Көптеген стандартты компиляторлар префикстерді міндетті етуге рұқсат бермейді, сондықтан оларды жіберуге болады, сонымен қатар, қате пайдалану нәтижесінде код шатасуға ұшырауы мүмкін.
Кітапша афикстер
Сигильдер атауларға (анықтамаларға) қолданылғанда, ұқсас префикстер мен суффикстерді литеральдерге, әсіресе бүтін сандар мен жол литеральдеріне қолдануға болады, бұл литераль қалай бағалануы керек екенін немесе оның дерек типін анықтайды. Мысалы, 0x10ULL C++-та 16 мәнін қол қойылмаған ұзын бүтін сан ретінде бағалайды: 0x префиксі он алтылықты білдіреді, ал ULL суффиксі қол қойылмаған ұзын типін көрсетеді. Сол сияқты, префикстер көбінесе шикі жолды көрсету үшін қолданылады, мысалы, Python-дағы r"C:\Windows", бұл C:\Windows мәнін беретін жолды білдіреді; қашқан жол ретінде бұл "C:\\Windows" деп жазылар еді. Бұл идентификатордың (атаудың) синтаксисі немесе семантикасына емес, литеральдің семантикасына (мәніне) әсер ететіндіктен, бұл не штроппинг (идентификатор синтаксисі), не сигиль (идентификатор семантикасы) емес, бірақ синтаксистік тұрғыдан ұқсас.
Java-да келтірілген түсініктемелер
@Override және @Deprecated сияқты Java аннотацияларын салыстырыңыз.
Аң-таңдық
Кейбір жағдайларда бір синтаксис әртүрлі мақсаттар үшін қолданылуы мүмкін, бұл шатастыруға алып келуі мүмкін. Мысалы, C# тілінде "@" префиксі идентификатор ретінде сақталған сөздерді пайдалануға мүмкіндік беру үшін немесе әдебиеттік тұрақтының алдына қойылып, оны шикі жол ретінде көрсету үшін қолданылуы мүмкін. Бұл жағдайда екі қолданыс та сигил емес, себебі ол идентификаторлардың семантикасына емес, идентификаторлардың синтаксисіне немесе әдебиеттік тұрақтылардың семантикасына әсер етеді.