Magia (programmazione) - Magic (programming)

Nel contesto della programmazione informatica, la magia è un termine informale per astrazione ; è usato per descrivere il codice che gestisce compiti complessi nascondendo quella complessità per presentare un'interfaccia semplice. Il termine è un po' ironico e spesso ha connotazioni negative, il che implica che il vero comportamento del codice non è immediatamente evidente. Ad esempio, i meccanismi di tipizzazione e chiusura polimorfici di Perl sono spesso chiamati "magici". Il termine implica che la complessità nascosta sia almeno in linea di principio comprensibile, in contrasto con la magia nera e la magia profonda (vedi Varianti ), che descrivono tecniche arcane deliberatamente nascoste o estremamente difficili da comprendere. Tuttavia, il termine può anche essere applicato in modo accattivante, suggerendo un "fascino" sul codice. L'azione di tali astrazioni è descritta come eseguita "automagicamente" , un portmanteau di "automaticamente" e "magicamente".

Opacità referenziale

"Magia" si riferisce a procedure che effettuano calcoli sulla base di dati non chiaramente forniti loro, accedendo ad altri moduli, posizioni di memoria o variabili globali a cui non dovrebbero (in altre parole, non sono referenzialmente trasparenti). Secondo i più recenti modelli di architettura software , anche quando si utilizza la programmazione strutturata , si preferisce solitamente fare in modo che ogni funzione si comporti allo stesso modo ogni volta che le vengono passati gli stessi argomenti, seguendo così uno dei principi base della programmazione funzionale . Quando una funzione infrange questa regola, si dice spesso che contenga "magia".

Un esempio semplificato di magia negativa è il seguente codice in PHP :

function magic()
{
    global $somevariable;

    echo $somevariable;
}

$somevariable = true;

magic();

Mentre il codice sopra è chiaro e gestibile, se viene visto in un progetto di grandi dimensioni, è spesso difficile capire da dove la funzione magic()ottiene il suo valore. Si preferisce scrivere quel codice usando il seguente concetto:

function noMagic($myvariable)
{
    echo $myvariable;
}

$somevariable = true;

noMagic($somevariable);

Non ortogonalità

Qualsiasi SV [valore scalare] può essere magico, cioè ha caratteristiche speciali che un normale SV non ha.

—  Larry Wall , pagina man di perlguts , Perl 5

Questa definizione di magico o magico può essere estesa a un tipo di dati , frammento di codice, parola chiave o indirizzo macchina che ha proprietà non condivise da oggetti altrimenti identici. Le proprietà magiche possono o non possono essere documentate.

  • In ISO C , gli handle di file (di tipo FILE) non possono essere copiati in modo sicuro poiché i loro indirizzi potrebbero essere magici. Cioè, l'ambiente di runtime può piazzare handle di file originali in una hard-coded intervallo di indirizzi, e non fornisce il comportamento handle di file a una copia creato dall'utente a un altro indirizzo. Di conseguenza, le routine della libreria standard accettano invece puntatori a handle di file, di tipo FILE *.
  • In Perl 5, l'istruzione assegna implicitamente la riga letta dal file da <file_handle> alla variabile e applica la funzione all'espressione in modo che qualsiasi stringa letta con successo, anche o la stringa vuota , valuti come vera e continui il ciclo. Questo non accade con <file_handle> da nessun'altra parte o con qualsiasi altra espressione di controllo.while(<file_handle>)$_defined()"0"while()while()
  • In un emulatore , specialmente uno in fase di sviluppo, i call point di sistema della macchina emulata possono essere magici; quando vengono chiamati, l'emulatore può eseguire codice nativo per comodità, velocità o accesso all'hardware fisico e configurare la CPU e la memoria emulate come se avesse eseguito il codice originale.
    • Ad esempio, l' istruzione di
    BBC BASIC V tratta magicamente gli indirizzi delle chiamate di sistema di Acorn MOS ; invece di tentare di diramarsi al codice ARM a quegli indirizzi, genera un interrupt software nel sistema operativo RISC equivalente alla chiamata di sistema. L'effetto è quello di emulare Acorn MOS sufficientemente per l'esecuzione senza modifiche dei programmi BASIC a 8 bit che non contengono linguaggio assembly.CALL
  • Anche in BBC BASIC, non solo la formattazione di stampa del controllo della variabile numerica , accetta l'assegnazione diretta di stringhe di formato printf ANSI , normalmente un errore di mancata corrispondenza del tipo.@%
  • In JavaScript , la valutazione typeofdell'operatore ha esito positivo quando l'operando è un identificatore non dichiarato, che normalmente risulterebbe in un ReferenceError.
  • Qualsiasi commento che abbia un effetto sul codice è magico.
  • Anche gli indirizzi di I/O mappati in memoria e le variabili volatili sono magici in questo senso, sebbene il termine non venga normalmente applicato.
  • varianti

    La magia profonda si riferisce a tecniche che non sono molto conosciute e possono essere deliberatamente tenute segrete. Il numero di tali tecniche è probabilmente diminuito negli ultimi anni, specialmente nel campo della crittografia, dove la sicurezza attraverso l'oscurità è stata sempre più abbandonata a favore della sicurezza attraverso il design che consente, e spesso incoraggia, il controllo pubblico. Il Jargon File fa una distinzione tra magia profonda , che si riferisce al codice basato su conoscenze teoriche esoteriche, e magia nera , che si riferisce al codice basato su tecniche che sembrano funzionare ma che mancano di una spiegazione teorica. Definisce anche la magia pesante , che si riferisce al codice basato su complessità oscure o non documentate di particolari hardware o software.

    Guarda anche

    Riferimenti