Magia (programowanie)
W kontekście programowania komputerowego magia to nieformalne określenie abstrakcji ; służy do opisywania kodu, który obsługuje złożone zadania, jednocześnie ukrywając tę złożoność, aby przedstawić prosty interfejs. Termin ten jest nieco żartobliwy i często ma złe konotacje, sugerując, że prawdziwe zachowanie kodu nie jest od razu widoczne. Na przykład polimorficzne pisanie i zamykanie Perla mechanizmy są często nazywane „magią”. Termin sugeruje, że ukryta złożoność jest przynajmniej w zasadzie zrozumiała, w przeciwieństwie do czarnej magii i głębokiej magii (patrz Warianty ), które opisują tajemne techniki, które są celowo ukryte lub niezwykle trudne do zrozumienia. Jednak termin ten można również zastosować ujmująco, sugerując „urok” kodu. Działanie takich abstrakcji jest opisywane jako wykonywane „automagicznie” , połączenie słów „automatycznie” i „magicznie”.
Nieprzezroczystość referencyjna
„Magia” odnosi się do procedur , które wykonują obliczenia na podstawie danych, które nie są im jasno dostarczone, poprzez dostęp do innych modułów, pozycji pamięci lub zmiennych globalnych , których nie powinny (innymi słowy, nie są przezroczyste referencyjnie). Zgodnie z najnowszymi modelami architektury oprogramowania , nawet przy użyciu programowania strukturalnego zwykle preferuje się , aby każda funkcja zachowywała się w ten sam sposób za każdym razem, gdy przekazywane są do niej te same argumenty, przestrzegając w ten sposób jednej z podstawowych zasad programowania funkcjonalnego . Kiedy funkcja łamie tę regułę, często mówi się, że zawiera „magię”.
Uproszczonym przykładem negatywnej magii jest następujący kod w PHP :
magiczna funkcja () { global $niektórezmienne ; echo $niektórezmienne ; } $niektórezmienne = true ; magia ();
Chociaż powyższy kod jest przejrzysty i łatwy w utrzymaniu, jeśli jest widziany w dużym projekcie, często trudno jest zrozumieć, skąd funkcja magic()
bierze swoją wartość. Preferowane jest napisanie tego kodu przy użyciu następującej koncepcji:
function noMagic ( $mojazmienna ) { echo $mojazmienna ; } $niektórezmienne = true ; noMagic ( $niektórezmienne );
Nieortogonalność
Każda SV [wartość skalarna] może być magiczna, to znaczy ma specjalne cechy, których nie ma normalna SV.
— Larry Wall , strona podręcznika perlguts , Perl 5
Ta definicja magii lub magii może zostać rozszerzona na typ danych , fragment kodu, słowo kluczowe lub adres maszyny, który ma właściwości, których nie mają inne identyczne obiekty. Magiczne właściwości mogą być udokumentowane lub nie.
- W ISO C uchwyty plików (typu
FILE
) nie mogą być bezpiecznie kopiowane, ponieważ ich adresy mogą być magiczne. Oznacza to, że środowisko wykonawcze może umieszczać oryginalne uchwyty plików w zakodowanym na stałe zakresie adresów i nie zapewniać zachowania uchwytów plików kopii utworzonej przez użytkownika pod innym adresem. W konsekwencji standardowe procedury biblioteczne akceptują zamiast tego wskaźniki do uchwytów plików typuFILE *
. - W Perlu 5 instrukcja
while( <uchwyt_pliku> )
niejawnie przypisuje wiersz odczytany z pliku przez <uchwyt_pliku> do zmiennej$_
i stosujezdefiniowaną funkcję ()
do wyrażenia, tak że każdy pomyślnie odczytany ciąg, nawet„0 "
lub pusty łańcuch , ocenia jako prawda i kontynuuje pętlęwhile ()
. Nie dzieje się tak z <file_handle> nigdzie indziej ani zwhile ()
z dowolnym innym wyrażeniem sterującym. - W emulatorze , zwłaszcza w fazie rozwoju, systemowe punkty wywoławcze emulowanej maszyny mogą być magiczne; kiedy są wywoływane, emulator może uruchamiać natywny kod dla wygody, szybkości lub dostępu do fizycznego sprzętu oraz konfigurować emulowany procesor i pamięć tak, jakby wykonał oryginalny kod.
- Na przykład instrukcja
CALL
w BBC BASIC V magicznie traktuje adresy wywołań systemowych Acorn MOS ; zamiast próbować rozgałęzić się do kodu ARM pod tymi adresami, wywołuje przerwanie programowe RISC OS odpowiednik wywołania systemowego. [ potrzebne źródło inne niż podstawowe ] Efektem jest emulacja Acorn MOS w stopniu wystarczającym, aby 8-bitowe programy BASIC niezawierające asemblera działały bez modyfikacji.
- Na przykład instrukcja
-
Również w BBC BASIC zmienna numeryczna
@%
kontroluje formatowanie wydruku, ale akceptuje bezpośrednie przypisanie ciągów formatu ANSI printf , co zwykle jest błędem niezgodności typu. - W JavaScript ocena operatora
typeof
kończy się powodzeniem, gdy operand jest niezadeklarowanym identyfikatorem, co normalnie skutkowałobyReferenceError
. - Każdy komentarz , który ma wpływ na kod, to magia.
- I/O mapowane w pamięci i zmienne ulotne są również magiczne w tym sensie, chociaż termin ten nie jest zwykle stosowany.
Warianty
Głęboka magia odnosi się do technik, które nie są powszechnie znane i mogą być celowo utrzymywane w tajemnicy. Liczba takich technik prawdopodobnie spadła w ostatnich latach, [ kiedy? ], zwłaszcza w dziedzinie kryptografii , gdzie bezpieczeństwo poprzez niejasność jest coraz częściej porzucane na rzecz bezpieczeństwa poprzez projektowanie, które umożliwia i często zachęca do publicznej kontroli. The Jargon File rozróżnia głęboką magię , która odnosi się do kodu opartego na ezoterycznej wiedzy teoretycznej, oraz czarną magię , który odnosi się do kodu opartego na technikach, które wydają się działać, ale którym brakuje teoretycznego wyjaśnienia.
Definiuje również ciężką magię , która odnosi się do kodu opartego na niejasnych lub nieudokumentowanych zawiłościach określonego sprzętu lub oprogramowania. Na przykład niesławny komentarz „Nie oczekuje się, że to zrozumiesz” : wielu czytelników Lions Book, komentarza z adnotacjami dydaktycznymi na kodzie źródłowym jądra Uniksa w wersji 6, zinterpretował ten komentarz znaleziony w kodzie, aby zasugerować, że w niejasnym fragmencie widać było jakąś głęboką teoretyczną mądrość, ale w rzeczywistości jego „magiczna” funkcja była jedynie zależna od osobliwości sposobu, w jaki Kompilator C został zoptymalizowany pod kątem PDP-11 , na którym zaprojektowana została wersja 6 systemu Unix.