Sigil (programowanie komputerowe) - Sigil (computer programming)
W programowaniu komputerowym , w Sigil ( / s ɪ dʒ əl / ) to symbol umieszczony na zmiennej nazwy, pokazując zmiennej typ danych lub zakresu , zwykle prefiks, jak w $foo
, gdzie $
jest Sigil.
Sigil , od łacińskiego sigillum , oznaczającego „mały znak”, oznacza znak lub obraz rzekomo posiadający magiczną moc . Sigilów można używać do oddzielania i rozgraniczania przestrzeni nazw, które mają różne właściwości lub zachowania.
Kontekst historyczny
Stosowanie sigili spopularyzował język programowania BASIC . Najbardziej znanym przykładem sigila w języku BASIC jest znak dolara (" $
") dołączany do nazw wszystkich łańcuchów . Wiele dialektów języka BASIC używa innych sigili (takich jak " %
") do oznaczania liczb całkowitych i zmiennoprzecinkowych oraz ich dokładności, a czasem także innych typów.
Larry Wall przyjął użycie sigili w skryptach powłoki w swoim języku programowania Perl . W Perlu sigile nie określają drobnoziarnistych typów danych, takich jak łańcuchy i liczby całkowite, ale bardziej ogólne kategorie skalarów (z prefiksem „ $
”), tablic (przy użyciu „ @
”), skrótów (przy użyciu „ %
”) i podprogramów (używając „ &
”). Raku używa również drugorzędnych sigili lub twigilów , aby wskazać zakres zmiennych. Wybitnymi przykładami twigilów w Raku są „ ^
”, używane z zadeklarowanymi przez siebie parametrami formalnymi („zmienne zastępcze”) oraz „ .
”, używane z metodami dostępu do atrybutów obiektów (tj. Zmiennymi instancji).
W CLIPS zmienne skalarne są poprzedzone znakiem „ ?
”, podczas gdy zmienne wielopola (np. Lista 1-poziomowa) są poprzedzone przedrostkiem „ $?
”.
W Common Lisp zmienne specjalne (z zakresem dynamicznym) są zwykle otoczone *
tym, co nazywa się „ konwencją nauszników ”. Chociaż jest to tylko konwencja, a nie narzucona, język sam przyjmuje praktykę (np. * Standardowe wyjście *). Podobnie, niektórzy programiści otaczają stałe znakami +
.
W CycL zmienne są poprzedzone sigilem?
. Podobnie, nazwy stałych są poprzedzone przedrostkiem „ #$
” (wymawiane jako „krzyżyk-dolar”).
W Elixirze sigile są dostarczane za pośrednictwem ~
symbolu „ ”.
W MAPPER (aka BIS) nazwane zmienne są poprzedzone przedrostkiem „<” i zakończone przedrostkiem „>”, ponieważ ciągi znaków lub wartości znaków nie wymagają cudzysłowów.
W skrypcie mIRC identyfikatory mają „ $
” sigil, podczas gdy wszystkie zmienne mają %
przedrostek „ ” (niezależnie od zmiennych lokalnych lub globalnych lub typu danych). Zmienne binarne są poprzedzone znakiem „ &
”.
W języku programowania MUMPS „ $
” poprzedza wewnętrzne nazwy funkcji i „specjalne nazwy zmiennych” (wbudowane zmienne umożliwiające dostęp do stanu wykonania). „ $Z
” poprzedza niestandardowe nazwy funkcji wewnętrznych. „ $$
” poprzedza nazwy funkcji zewnętrznych. Procedury (używane dla procedur, podprogramów, funkcji) i zmienne globalne (pamięć bazy danych) są poprzedzone znakiem daszka (^). Do ostatniego poddrzewa zmiennej globalnej można się odwoływać pośrednio za pomocą daszka i ostatniego indeksu dolnego; jest to określane jako „nagie odniesienie”. Procedury systemowe i zmienne globalne (przechowywane w niektórych współużytkowanych bazach danych) są poprzedzone prefiksem ^%; są one określane jako „procedury procentowe” i „wartości globalne procentowe”.
W Objective-C , literały łańcuchowe poprzedzone znakiem „ @
” są instancjami typu obiektu NSString
lub, od wersji Clang 3.1 / LLVM 4.0 NSNumber
, NSArray
lub NSDictionary
. Prefix- @
stosowany jest również na słowa kluczowe interface
, implementation
oraz end
wyrazić strukturę definicji klasy. Również w deklaracjach i definicjach klas przedrostek -
jest używany do wskazania metod i zmiennych +
składowych , a przedrostek wskazuje elementy klasy.
W języku PHP , który został w dużej mierze zainspirowany Perlem, " $
" poprzedza nazwę zmiennej . Nazwy nie poprzedzone tym prefiksem są uważane za stałe , funkcje lub nazwy klas (lub nazwy interfejsów lub cech, które mają tę samą przestrzeń nazw co klasy).
PILOT używa „ $
” dla buforów (zmiennych łańcuchowych), „ #
” dla zmiennych całkowitych i „ *
” dla etykiet programu.
Python używa @
przedrostka „ ”, zwanego składnią kołową , do stosowania dekoratorów i __
przedrostka „ ”, zwanego dunder , dla atrybutów „prywatnych” .
W Rubim zwykłe zmienne nie mają sigilów, ale „ $
” jest poprzedzone przedrostkiem zmiennych globalnych , „ @
” jest poprzedzone zmiennymi instancji , a „ @@
” jest poprzedzone zmiennymi klasowymi . Ruby używa również (ściśle konwencjonalnych) sigili sufiksów: " ?
" wskazuje metodę predykatu zwracającą (zwykle) wartość logiczną ; a „ !
” oznacza, że metoda może mieć potencjalnie nieoczekiwany efekt i należy obchodzić się z nią ostrożnie.
W Scheme , zgodnie z konwencją, nazwy procedur, które zawsze zwracają wartość logiczną, zwykle kończą się na „ ?
”. Podobnie nazwy procedur, które przechowują wartości w częściach wcześniej przydzielonych obiektów Scheme (takich jak pary, wektory lub łańcuchy), zwykle kończą się „ !
”.
Standardowa ML używa przedrostka sigil „ '
” w zmiennej, która odwołuje się do typu. Jeśli sigil jest podwojony, odnosi się do typu, dla którego zdefiniowano równość. Znak „ '
” może również pojawić się w zmiennej lub na końcu zmiennej, w którym to przypadku nie ma specjalnego znaczenia.
W języku Transact-SQL „ @
” poprzedza lokalną nazwę zmiennej lub parametru. Zmienne systemowe (znane jako zmienne globalne) są rozróżniane @@
prefiksem „ ”.
W programie Windows PowerShell , który został częściowo zainspirowany powłokami Unix i Perl, nazwy zmiennych są poprzedzone przedrostkiem „ $
” sigil.
W XSLT zmienne i parametry mają $
początkowy " " sigil podczas użycia, chociaż gdy są zdefiniowane w atrybucie " " <xsl:param>
lub <xsl:variable>
z name
atrybutem, sigil nie jest uwzględniany. W odniesieniu do XSLT, XQuery używa $
formy " " sigila zarówno w definicji, jak iw użyciu.
W MEL nazwy zmiennych są poprzedzone znakiem „ $
”, aby odróżnić je od funkcji, poleceń i innych identyfikatorów.
Podobne zjawiska
Zmienne skryptowe powłoki
W skryptach powłoki systemu Unix oraz w narzędziach, takich jak Makefiles , „ $
” jest operatorem jednoargumentowym, który tłumaczy nazwę zmiennej na jej zawartość. Chociaż może się to wydawać podobne do sigila, jest właściwie operatorem jednoargumentowym dla pośrednictwa leksykalnego , podobnym do *
operatora dereferencji dla wskaźników w C , co można zauważyć z faktu, że znak dolara jest pomijany podczas przypisywania do zmiennej.
Konwencje dotyczące identyfikatorów
W Fortranie sigile nie są używane, ale wszystkie zmienne zaczynające się na litery I, J, K, L, M i N są domyślnie liczbami całkowitymi . Dokumentacja języka Fortran określa to jako „niejawne typowanie”, chociaż jawne typowanie jest zawsze dostępne, aby umożliwić zadeklarowanie dowolnej zmiennej dowolnego typu. (Wybór zakresu I – N jest zgodny z tradycyjnymi konwencjami nazewnictwa matematycznego ).
Różne języki programowania, w tym Prolog , Haskell , Ruby i Go, traktują identyfikatory zaczynające się od dużej litery inaczej niż identyfikatory zaczynające się od małej litery, co jest praktyką związaną z użyciem sigili.
Obcinanie
Faktycznie formą wyrównywania , stosowanie wielu języków w Microsoft .NET Common Language Infrastructure (CLI) wymaga drogę do zmiennych USE w innym języku, które mogą być wyszukiwane w wywołującego języku. Odbywa się to czasami za pomocą przedrostków. W języku C # wszystkie nazwy zmiennych mogą być poprzedzone przedrostkiem „ @
”. Jest to używane głównie w celu umożliwienia używania nazw zmiennych, które w przeciwnym razie byłyby sprzeczne ze słowami kluczowymi. To samo można osiągnąć w VB.Net , umieszczając nazwę w nawiasach kwadratowych, jak w [end]
.
@
Prefiks „ ” można również zastosować do literałów łańcuchowych; patrz dosłowne afiksy poniżej.
Notacja węgierska
Z sigilami wiąże się notacja węgierska , konwencja nazewnictwa zmiennych, która określa typ zmiennej przez dołączenie pewnych przedrostków alfabetycznych do nazwy zmiennej. Jednak w przeciwieństwie do sigilów notacja węgierska nie dostarcza kompilatorowi żadnych informacji; jako takie, jawne typy muszą być redundantnie określone dla zmiennych (chyba że używa się języka z wnioskiem o typie ). Ponieważ większość standardowych kompilatorów nie wymusza używania prefiksów, pozwala to na pominięcie, a także sprawia, że kod jest podatny na pomyłki z powodu przypadkowego błędnego użycia.
Dosłowne afiksy
Podczas gdy sigile są stosowane do nazw (identyfikatorów), podobne przedrostki i sufiksy można zastosować do literałów , zwłaszcza literałów całkowitych i literałów łańcuchowych , określając, w jaki sposób literał powinien być oceniany lub jaki to jest typ danych. Na przykład 0x10ULL
przyjmuje wartość 16 jako długą liczbę całkowitą bez znaku w języku C ++: 0x
prefiks wskazuje wartość szesnastkową, a sufiks ULL
oznacza długość bez znaku. Podobnie, przedrostki są często używane do wskazania nieprzetworzonego łańcucha , na przykład r"C:\Windows"
w Pythonie, który reprezentuje ciąg z wartością C:\Windows
; jako ciąg znaków ucieczki zostanie to zapisane jako "C:\\Windows"
.
Ponieważ ma to wpływ na semantykę (wartość) literału, a nie na składnię lub semantykę identyfikatora (nazwy), nie jest to ani stropping (składnia identyfikatora), ani sigil (semantyka identyfikatora), ale jest składniowo podobny.
Adnotacje Java
Porównaj adnotacje Java, takie jak @Override i @Deprecated.
Zamieszanie
W niektórych przypadkach ta sama składnia może być używana do różnych celów, co może powodować zamieszanie. Na przykład w języku C # @
prefiks „ ” może być używany do usuwania (aby umożliwić używanie słów zastrzeżonych jako identyfikatorów) lub jako prefiks do literału (w celu wskazania nieprzetworzonego ciągu znaków ); w tym przypadku użycie nie jest sigilem, ponieważ wpływa na składnię identyfikatorów lub semantykę literałów, a nie na semantykę identyfikatorów.