2010-01-27 2 views
15

Sembra che ho avuto modo di concordare con questa post quando afferma chepiù dinamico linguaggio di programmazione dinamica

[...] il codice nei linguaggi dinamicamente tipizzati segue le convenzioni statico-battitura

Il codice di linguaggio molto dinamico che incontro sembra effettivamente essere statico (pensando a PHP) mentre gli approcci dinamici sembrano invece piuttosto goffi o non necessari.

La maggior parte delle volte si tratta di omettere le firme dei tipi, che, nel contesto dell'inferenza di tipo/tipizzazione strutturale, non devono nemmeno implicare la digitazione dinamica.

Quindi la mia domanda (e non è destinata ad essere troppo soggettiva) è, in cui linguaggi dinamici o campi di applicazione sono tutte queste caratteristiche del linguaggio dinamiche più avanzate (che couln't essere replicato in statica/compilato lingue che facilmente) effettivamente e idomaticamente utilizzato.

Esempi:

  • Reflection
  • continuazioni prima classe
  • runtime oggetto alterazione/generazione
  • Metaprogrammazione
  • runtime Analisi codice
  • comportamento membro inesistente

Quali sono le applicazioni utili per tali tecniche?

+0

Non voglio essere un pedante, ma penso che dobbiamo definire un "linguaggio dinamico" un po 'meglio, almeno al di là di queste caratteristiche. Ad esempio, Haskell è generalmente considerato il paragone di un linguaggio statico, ma ha riflessioni, continuazioni, metaprogrammazione (vedi Template Haskell) e valutazione del codice runtime. Stiamo parlando della tipizzazione dinamica rispetto a quella statica? Spedizione dinamica? Cos'è "dinamico"? – Chuck

+0

@Chuck: Beh, hai ragione e, ad essere onesti, non è così facile.Mi limiterei solo alle funzionalità che ho proposto, includo tutti i linguaggi di scripting/lingue digitate dinamicamente e faccio il resto ex negativo (nessuno considererà C++ un linguaggio dinamico);) – Dario

risposta

2

Tutte le funzionalità elencate sono disponibili anche in lingue con tipizzazione statica, alcune con vincoli.

  • Riflesso: Presente in Java, C# (non sicuro per tipo).
  • Continuazione di prima classe: supporto limitato in Scala (forse altri)
  • Alterazione oggetto di runtime: La modifica del tipo di un oggetto è supportata in una forma limitata in C# con metodi di estensione (sarà in Java 7) e tipo implicito conversioni in Scala. Sebbene la classe aperta non sia supportata, la maggior parte dei casi d'uso sono coperti dalle conversioni di tipo.
  • Metaprogrammazione: Direi Metaprogrammazione è il titolo per un sacco di funzionalità correlate quali la riflessione, il tipo di modifiche in fase di runtime, AOP ecc

Quindi non c'è molto a sinistra che è supportato solo da linguaggi dinamici discutere. Il supporto ad esempio per Reflection circoscrive il sistema di tipi, ma è utile in alcune situazioni in cui è necessario questo tipo di flessibilità. Lo stesso vale per le lingue dinamiche.

La funzione di classe aperta supportata da Ruby è qualcosa che i linguaggi compilati non supporteranno mai. È la forma più flessibile di Metaprogrammazione possibile (con tutte le implicazioni: sicurezza, prestazioni, manutenibilità). È possibile modificare le classi della piattaforma. Viene utilizzato da Ruby on Rails per creare metodi di oggetti di dominio da metadati al volo. In un linguaggio tipizzato staticamente devi almeno creare (o generare il codice di) l'interfaccia del tuo oggetto dominio.

Se stai cercando le "lingue più dime- miche" tutte le homoiconic languages come LISP e Prolog sono buone candidate. È interessante notare che C# è in qualche modo omoiconico con gli alberi di espressione in LINQ.

+0

Né i metodi di estensione né impliciti alterano o addirittura estendono un tipo ** durante il runtime ** - È quindi al 100% statico. Inoltre, questa domanda non riguarda le caratteristiche * esclusivamente dinamiche * ma in cui vengono utilizzate. Non penso che si possa utilizzare in modo idiomatico la generazione di oggetti runtime in .NET. – Dario

+0

+1 per il resto se – Dario

+0

@Dario Sì. Entrambi sono completamente tipizzati in modo statico. La mia risposta è più sul problema che cerchi di risolvere con caratteristiche linguistiche diverse. Le lingue tipizzate staticamente trovano soluzioni diverse rispetto ai linguaggi dinamici agli stessi problemi (come le lingue funzionali trovano soluzioni diverse rispetto alle lingue imperative). –

8

Alcuni esempi di applicazione diffusa delle tecniche di cui sopra sono:

  • Continuazioni fanno la loro comparsa nel framework web come Rails o al mare. Possono essere utilizzati per consentire a un'API di simulare un contesto locale. In Seaside o Rails ciò rende l'API molto più simile a un gestore di moduli GUI locali che a un gestore di richieste HTTP, che serve a semplificare l'attività di codifica degli elementi dell'interfaccia utente dell'applicazione. Tuttavia, sebbene molte lingue dinamiche abbiano un forte supporto per le continuazioni, non sono certamente uniche per questo tipo di linguaggio.

  • Reflection è ampiamente utilizzato per i mapper O/R e la serializzazione, ma molte langages con caratteri statici supportano anche il riflesso. Sui linguaggi tipografici anatra può essere usato per scoprirlo in fase di esecuzione se una funzione viene implementata osservando i metadati dell'oggetto. Alcuni mapper O/R (e strumenti simili) funzionano implementando gli accessi alle variabili di istanza e reindirizzando gli aggiornamenti a un record memorizzato nella cache nel livello di accesso ai dati. Ciò aiuta a rendere la persistenza relativamente trasparente allo sviluppatore in quanto gli accessi al campo assomigliano molto alle variabili locali.

  • L'alterazione dell'oggetto di runtime è leggermente utile (si pensi al patch di scimmia), ma soprattutto una trovata. Non ci sono molti usi veramente killer per questo che vengono in mente immediatamente, ma sicuramente la gente lo usa. Un possibile utilizzo è che fissa un comportamento leggermente interrotto quando la sottoclasse non è un'opzione per qualche motivo.

  • La metaprogrammazione è una definizione piuttosto sfocata per un termine, ma probabilmente i generici e i modelli C++ sono un esempio di metaprogrammazione - che si svolge su linguaggi tipizzati staticamente. Nelle lingue con supporto di metaclassi, è possibile utilizzare metaclassi personalizzati per implementare comportamenti particolari come singoletti o registri di oggetti.

    Un altro esempio di metaprogrammazione è il metodo #notImplemented: di Smalltalk che viene chiamato nei tentativi di richiamare metodi inesistenti. Il nome e i parametri del metodo vengono forniti all'implementatore di #notImplemented: e possono essere successivamente utilizzati per costruire un richiamo del metodo in modo riflessivo. Intrappolamento di questo può essere utilizzato (ad esempio) per implementare meccanismi proxy generici.

programmatori LISP sostengono che LISP è la lingua più dinamica di tutti grazie al suo primo supporto classe per fregare direttamente con gli alberi di analisi del codice (noti come 'macro'). Questa funzione rende banale l'implementazione di DSL in LISP e li integra in modo trasparente nella base di codice.

0

In definitiva non sono i linguaggi che scrivono il codice dinamico, ma i programmatori; e ci sarà una curva di apprendimento per adattare i tuoi pattern a stili a cui non sei abituato. Quindi quali tipi di lavoro possono sfruttare al meglio le capacità dinamiche? Il primo che mi viene in mente è il middleware; interfacce tra sistemi eterogenei; specialmente quelli con API o API imperfettamente documentate che cambiano molto e la serializzazione dei dati è dinamica.

Direi che ovunque tu veda REST e jason applicati, è più probabile che tu trovi il codice dinamico, ad esempio, dove javascript, php, perl, ruby, ... sono popolari almeno parzialmente perché sono capace di adattamento dinamico.

Inoltre, c'è un sacco di codice del browser javascript che si occupa della versione del browser e dell'incompatibilità del marchio utilizzando tecniche dinamiche.

+0

JSON può essere analizzato in modo abbastanza statico e in realtà non lo è richiedono una valutazione dinamica sebbene sia utilizzabile in modo abbastanza conciso in questo contesto. – Dario

+0

Hai ragione, certo. Tutto ciò può essere fatto staticamente, in qualche modo. La domanda riguardava lo stile del codice e il punto di vista. Per me, Jason ha i dati digitati a forma di anatra e si combina bene con i linguaggi di dattilografia. Ricorda, che cosa è json, è serializzato dichiarazioni di oggetti javascript - dinamicamente auto-definizione, dati non tipizzati (compresi gli oggetti). – dkretz

2

Si consiglia di visitare Douglas Crockford's Wrrrld Wide Web e vedere le sue magie su Javascript. Javascript è solitamente scritto in modo abbastanza semplice e semplice, come C. leggermente semplificato Ma è solo la superficie. Le parole chiave immutabili sono una piccola percentuale del potere linguistico. La maggior parte si trova negli oggetti e nei metodi esportati dal sistema e questi sono completamente mutabili. È possibile sostituire/estendere i metodi al volo, è possibile sostituire i metodi di sistema piuttosto profondamente radicati, nidificare eval(), caricare il carico generato <SCRIPT> al volo e così via. Questo è utilizzabile nella scrittura di tutti i tipi di estensioni linguistiche, framework, toolbox e così via. Invece di 200 linee di codice del tuo programma in Javascript semplice, scrivi 50 linee che modificano il funzionamento di Javascript e altre 50 che usano la nuova sintassi per eseguire il lavoro. Puoi generare intere pagine al volo, incluso JS incorporato in esse. Trasformi la struttura della pagina web nell'archivio dati. Sostituisci i metodi usati frequentemente con oggetti popolari, e il tuo, per cambiare il loro comportamento al volo, cambiando non solo l'aspetto ma anche la funzione di una pagina web in un clic.

Sembra davvero che Javascript diventi un metalinguaggio per modificare il motore di Javascript e faccia funzionare JavaScript come una lingua diversa, quindi lo si modifica ulteriormente utilizzando il già modificato e l'app finale vera e propria prende una dozzina di linee estremamente intuitive fare in modo che il linguaggio faccia esattamente ciò di cui ha bisogno. Oh, e rattoppa gli innumerevoli bug e difetti dell'implementazione Javascript su MSIE nel processo.

1

io non pretendo Lisp è il "più dinamico" (io non sono nemmeno sicuro di cosa ciò significhi), ma i programmatori Lisp spesso fare cose che sono difficili da impossibile in altre lingue:

  • creare nuove strutture di controllo
  • creare nuova sintassi per costrutti esistenti (penso che ogni metaclasse che abbia mai visto ha una sua forma defwhatever)
  • estendere il tempo di esecuzione (ogni .emacs è un'estensione runtime, ad esempio, che cosa sarebbe prendere per scrivere la modalità di calendario per un altro editor?)

Yegge talks about it some here w.r.t. Emacs, ad esempio, analizza il codice XML convertendolo in espressioni S, scrivendo le funzioni per i tag che si desidera elaborare e in effetti eseguendoli.

0

Sì, mi sento JavaScript come buono.
JavaScript è così flessibile che le persone che lavorano in lingue diverse hanno varianti diverse per loro. Come Microsoft ha una libreria Ajax con sintassi tipica di tipo .NET/C#. Inoltre ci sono alcune librerie JavaScript che usano $ che sembrano simili come le sintassi PHP. È tutto lì perché JavaScript è efficace Quante altre lingue si possono dire che possono facilitare qualcosa di simile?
E si dovrebbe conoscere la funzione di chiusura di JavaScript che è allo stato dell'arte e aiutare a creare algoritmi sorprendenti con ottimi risultati.