2009-02-28 9 views
5

Qui la parola "magia" viene buttata molto in contesti come "il linguaggio X ha troppa magia" o "la piattaforma Y evita in genere la magia". Tuttavia, sembra che il termine sia piuttosto mal definito, qualcosa che le persone sanno quando lo vedono. Ad esempio, Java è noto per contenere pochissima magia, ma il suo garbage collector nasconde molto dal programmatore. Se la magia significa semplicemente astrazione che nasconde i dettagli, allora perché è considerata una cosa negativa, dato che nessuno scrive più grandi programmi in linguaggio assembly? Se la magia significa qualcosa di più, allora cosa significa?Quando si parla di linguaggi di programmazione, qual è la definizione di Magic?

risposta

10

"Qualsiasi tecnologia sufficientemente avanzata è indistinguibile dalla magia" - Arthur C. Clarke.

In realtà non è così - la magia viene utilizzato per complicato e nascosti piuttosto che avanzato (anche se presumibilmente i progettisti pensato che venivano avanzate), come ad esempio i sistemi che richiedono specifici stati prima di chiamate di procedura (modelli di threading COM) così come ' conversioni di tipo automagic (varianti VB, Javascript ==, autoboxing Java).

Una volta che i sistemi nascondono i dettagli dal programmatore che non sono più prevedibili, diventano magici. Sei bloccato a ripetere un'invocazione in una lingua che non capisci perché ha avuto l'effetto giusto in passato. Questa è una brutta magia, o voodoo.

C'è anche la magia buona - http://aggregate.org/MAGIC/

+2

+1 per la citazione di Clarke. – tvanfosson

+0

Oh, se stiamo citando: Gregory Benford dice "Qualsiasi tecnologia distinguibile dalla magia non è sufficientemente avanzata". –

0

Per Java

  • GC - IMHO non è magia, è proprio come avere una casa più pulita
  • Auto-boxing - magia - invisibile transmogrification di una cosa in qualcos'altro
8

Qualcosa è magico mentre lo ignori/non sai come funziona.

+1

Il bit "mentre lo ignori" è importante: l'uso della "magia" consente di evitare di definire qualcosa che non è (ancora) in esame o è dettagliato altrove e non pertinente alla discussione corrente/ecc. –

3

Magic ha lo stesso significato che in altro contesto: qualcosa con complessità nascosta e la logica. Non è sempre male, ma per i programmatori (che sono maghi per persone non techie) lo è. La magia non è magia quando puoi (puoi) sapere come funziona come sembra.

Ad esempio, costanti magiche: costanti con un significato nascosto.

Quando parliamo di "magia nera" che si verifica in un codice offuscato, intendiamo che qualcosa accade in questo codice che non capiamo; o che qualcosa di non scritto avvenga ma è nascosto dal lettore di codice.

In alcuni casi, si parla di magia in modo positivo: quando non si vede la reale complessità di un semplice capire come usare la cosa. Ad esempio, alcuni codici molto complessi possono essere nascosti in una classe di interfaccia piccola e semplice da usare. Sembra magico perché fa cose complesse con un semplice utilizzo. Questa è una buona magia (ma rara).

+0

Nel "ritorno", "la magia nera" era solo un pezzo di codice macchina davvero stretto. Inoltre, l'uso di interfacce non comuni o non documentate. In breve, dimostrando grande abilità e conoscenza dell'architettura del sistema. – Chris

+0

... scrivendo codice ristretto che rischia di rompere con le future modifiche all'architettura del sistema, quando sarà anche impossibile per il povero programmatore di manutenzione capire quale dovrebbe essere il codice ristretto. Freddo! – MarkJ

3

Ruby on Rails, ad esempio, è Magic.

Al livello di base, specialmente quando ci si avvicina in modo ingenuo, c'è un grande strato spesso tra il codice minimalista e il database, e poi Magic Happens, e si ottiene funzionalità grossolane e tutto il resto.

Alcune persone possono vivere con un'esperienza di altissimo livello, ma alla fine inizierai a correre verso barriere dove devi capire il "segreto" del "trucco", in modo da poterlo manipolare verso la tua fine.

Le lingue stesse non hanno un sacco di magia (beh, forse Prolog - il suo nucleo è un po 'magico), ma i moderni framework e il middleware possono essere pieni zeppi di esso.

Francamente, ogni volta che incontri un sistema o un componente che fa "qualcosa di incredibile" e ti chiedi "come fanno a farlo", è magico.

0

Unknown comportamento è molto spesso parlato di come magia. Alcune cose accadono senza una ragione apparente.

Ma ci sono tho re di sconosciuto:

  • La mancanza di conoscenza sul lato sviluppatori su come funzionano le cose. (Per esempio GC, non è magia, semplicemente troppo pochi sviluppatori in realtà si sono preoccupati di scoprire e capire che è basi)

  • comportamento indefinito magia, dove accadono le cose dietro le tende e non c'è alcuna conoscenza pubblica su come realmente lavoro. Questa è la vera magia nella programmazione.

Ad esempio Rails, Non è magia e Ruby non è magia, ma di certo può sembrare così per alcune delle persone se non hanno mai preso la briga di capire i meccanismi interni (che sono di dominio pubblico e disponibili).

4

In Microsoft questo tende ad essere utilizzato in due modi

1) in modo negativo (probabilmente l'uso più comune). Ad esempio, qualcuno potrebbe dire quanto segue "Non capisco, in primo luogo si rifatterà l'API, in seguito manterrai la vecchia API e avrai uno strato tra di loro che esegue la magia?"

L'implicazione è che la componente magica è troppo complessa, troppo indefinita o troppo "qualcosa".

L'altro contesto negativo è quando qualcosa è definito in modo ingenuo: questo accade spesso quando qualcuno assume che ci sia una soluzione semplice a un problema complesso perché non si rende conto che il problema è davvero complesso. Raymond Chen's blog è pieno di questi tipi di esempi.

2) È meno frequente che il termine "magia" sia usato in modo positivo. Ma succede. Utilmente per riferirsi a cose che svolgono compiti complessi che funzionano. Per me NTFS è quel tipo di magia. NTFS è davvero, davvero maturo e nasconde molta complessità dietro alcune API piuttosto semplici. Anche in questo modo il compilatore può essere visto come "magico" - comprendi veramente, profondamente, come funziona un compilatore C++? Io non - ho solo fiducia che lo fanno.

4

La magia è molto relativa alla vostra comprensione.

Ho scritto una buona quantità di C e C++ prima di iniziare a scrivere in Java. Ho dovuto allocare e deallocare tutta la mia memoria. Non è stato molto divertente una volta che ho iniziato a ricevere perdite di memoria. Una volta iniziato a scrivere in Java, sapevo (in sostanza) cosa stava succedendo dietro le quinte per realizzare tutti i miei oggetti di istanza.Quindi, per me, non è vicino a tanto magia (ho fatto assegnamento ma come effettivamente memorizza oggetti e sa quando deallocarli è un po 'più "magico" per me) come sarebbe per qualcuno che aveva iniziato su Java (che non ha mai dovuto gestire manualmente la memoria.)

Un altro esempio è ORM. Ho lanciato la mia struttura temporanea di mappatura relazionale oggettiva all'inizio di un progetto fino a quando ho avuto il tempo di piegarmi davvero e imparare Hibernate o qualcosa di simile. Ho dovuto scrivere in cose come i mapper ResultSet, il caricamento pigro e alcuni caching di base. Ora, quando torno indietro e sostituisco questa roba con Hibernate più mature o entità mappate JPA, avrò comunque una comprensione di base di ciò che sta accadendo. Se non hai mai usato JBDC o qualcosa di simile, tutto quello che saprai è che i dati vanno dal database all'oggetto e viceversa.

Ognuno si occupa di un certo livello di magia nella propria carriera. Non possiamo sapere tutto. La magia può davvero essere sinonimo di astrazione. Quando diventa "troppo magico" è quando l'Astrazione inizia a coprire le cose che è necessario essere in grado di controllare. Un esempio l'altro giorno è stato che in un programma JSF, non sapevo come avviare un contesto JSF. JSF lo fa solo quando si accede a una pagina JSF per la prima volta. Avevo bisogno di avviare il contesto da un servlet regolare. Alla fine ho dovuto creare una pagina JSF fittizia per gestirla. Semplicemente non ho avuto tempo in questo progetto per imparare la "magia" della gestione del contesto JSF.

2

Un interessante spunto: il termine magic è collegato ai linguaggi di programmazione formale, che sono uno dei fondamenti teorici dell'informatica. Nel libro di Morgan "Programmazione da tecnici", abbiamo questa definizione di magia:

w:[true, false] 

Questa notazione è della forma:

w:[P, Q] 

e rappresenta un programma che, quando eseguito in uno stato in cui P è vero, terminerà in uno stato in cui Q è true, cambiando solo le variabili in w.

In questo contesto, allora, "magico", è un programma di infeasable che può prendere un programma da qualsiasi stato (dal true è sempre true) in una che è impossibile (poiché false non può mai essere true).

Un programma molto più semplice è:

w:[true, true] 

che è il programma che termina sempre, ma garantisce nessun particolare risultato. Questo può essere implementato con un semplice skip.

Ovviamente, questa definizione tecnica è stata abusata quando le persone parlano dei programmi magic, poiché ciò dovrebbe significare un programma che è probabilmente non fattibile. Tuttavia, il termine rimane colloquialmente, dal momento che è bello immaginare che qualcosa di magico accade dietro le quinte quando non lo sappiamo, o capisci come funziona qualcosa.

0

Un contesto in cui utilizzo il termine "magia nera" è la manipolazione del codice (in Java) - la trasformazione del codice del programma in fase di esecuzione in modo che faccia qualcosa di diverso da quello che farebbe il codice semplice. Spesso la manipolazione del bytecode è molto utile, ma è anche molto facile spararti al piede con esso.

Molti framework e middleware utilizzano la manipolazione AOP e bytecode per implementare problemi trasversali. Ciò riduce il lavoro dei programmatori, ma in alcune situazioni può rendere difficile il debug del comportamento del sistema.Ed è facile mantenere alcuni bug sottili nelle trasformazioni di bytecode.

Ho eseguito personalmente alcune manipolazioni del codice byte, quindi in pratica so come le istruzioni del bytecode possono essere modificate e non è "magica" per me in quel senso, che non capirò come funziona. Ma ancora mi riferisco ad esso come "magico", perché cambia il modo in cui il codice normalmente funziona e non è visibile nel codice sorgente delle classi che vengono cambiate.

1

ti chiamano qualcosa di "magico", quando non si capisce esso.

Le persone erano bruciate nel Medioevo quando facevano/sapevano/dicevano qualcosa, che il resto degli uomini non capiva. Sono stati accusati di fare "magia".

chiamate un codice/quadro/lingua una "magia" quando non si capisce che cosa fa. È più facile chiamare qualcosa di "magico" che passare il tempo per capirlo.

magica non esiste!

Invece di chiamare qualcosa di "magico" sporcarsi le mani e capire cosa sta facendo quella cosa ... o chiamarla "parte inesplorata della (tua) conoscenza".

0

Per alcuni bei esempi di magia nera, guarda la documentazione nel codice sorgente perl ;-)

Problemi correlati