Domanda

la ricerca di un linguaggio di programmazione per la quale esiste un compilatore e che supporta la modifica del codice di sé. Ho heared che Lisp supporta queste caratteristiche, ma mi chiedevo se esiste un C / C ++ linguaggio più / D-Come con queste caratteristiche.

Per chiarire cosa intendo:

Voglio essere in grado di avere in qualche modo l'accesso al codice programms in fase di esecuzione e applicare qualsiasi tipo di modifiche ad esso, cioè, eliminando i comandi, l'aggiunta di comandi, cambiando. Come se ho avuto l'AstTree del mio programma. Naturalmente non posso avere quel albero in un linguaggio compilato, quindi deve essere fatto diverso. La compilazione dovrebbe tradurre i comandi autonomi modifica nei loro modifiche equivalenti binari così avrebbero lavorato in esecuzione con il codice compilato.

Non voglio essere dipendente da un VM, questo è quello che volevo dire con compilati:)

È stato utile?

Soluzione

Probabilmente c'è un motivo Lisp è come è? Lisp è stato progettato per programmare altre lingue e da calcolare con rappresentazioni simboliche di codice e dati . Il confine tra codice e dati non c'è più. Questo influenza la progettazione e l'implementazione di un linguaggio di programmazione.

Lisp ha le sue caratteristiche sintattiche per generare un nuovo codice, tradurre il codice ed eseguirlo. Così il codice pre-analizzata è anche utilizzando le stesse strutture di dati (simboli, elenchi, numeri, caratteri, ...) che vengono utilizzati per altri programmi, anche.

Lisp conosce i suoi dati in fase di esecuzione - è possibile interrogare tutto per il suo tipo o classe. Le classi sono oggetti stessi, così come le funzioni. Quindi questi elementi del linguaggio di programmazione ed i programmi sono anche oggetti di prima classe, che possono essere manipolati in quanto tale. dinamica della lingua non ha nulla a che fare con 'la tipizzazione dinamica'.

'linguaggio dinamico' significa che gli elementi del linguaggio di programmazione (ad esempio tramite meta classi e il protocollo metaoggetto) e il programma (sua classi, funzioni, metodi, slot, eredità, ...) può essere guardato in fase di esecuzione e può essere modificato in fase di esecuzione.

Probabilmente il più di queste funzioni si aggiunge ad una lingua, tanto più essa sarà simile a Lisp. Dal momento che Lisp è più o meno il massimo locale di una semplice, dinamica, linguaggio di programmazione programmabile. Se volete un po 'di queste caratteristiche, allora si potrebbe desiderare di pensare che le caratteristiche del vostro altro linguaggio di programmazione si deve rinunciare o sono disposti a rinunciare. Ad esempio per un semplice linguaggio di codice-as-dati, l'intero modello di sintassi C potrebbe non essere pratico.

C-like e 'linguaggio dinamico' potrebbe non essere davvero una buona misura - la sintassi è una parte di tutto il quadro. Ma anche il modello di sintassi del C ci limita la facilità possiamo lavorare con un linguaggio dinamico.

Altri suggerimenti

C # è sempre consentito per il codice di auto-modifica.

  • C # 1 ha permesso di creare essenzialmente e compilare il codice al volo.
  • C # 3 ha aggiunto "alberi espressione", che ha offerto un modo limitato per generare dinamicamente codice utilizzando un modello a oggetti e gli alberi sintassi astratta.
  • C # 4 si basa su che incorporando il supporto per il "Dynamic Language Runtime". Questo è probabilmente il più vicino si sta per arrivare a capacità LISP-like sulla piattaforma .NET in un linguaggio compilato.

Si potrebbe voler considerare l'utilizzo di C ++ con LLVM per (quasi) la generazione di codice portabile. Si può anche tirare in clang anche per il lavoro in alberi di analisi C (notare che clang ha il supporto incompleto per C ++ attualmente, ma è scritto in C ++ per sé)

Per esempio, si potrebbe scrivere un nucleo di auto-modifica in C ++ per interfacciarsi con clangore e LLVM, e il resto del programma in C. Conservare l'albero di analisi per il programma principale a fianco del codice di auto-modifica, poi manipolarlo con clangore in fase di esecuzione. Clang vi permetterà di manipolare direttamente l'albero AST in alcun modo, quindi compila tutta la strada fino al codice macchina.

Tieni presente che manipolare il vostro AST in un linguaggio compilato sarà sempre significa tra cui un compilatore (o interprete) con il vostro programma. LLVM è solo una scelta facile per questo.

"dinamica della lingua" è un termine ampio che copre una vasta gamma di concetti. tipizzazione dinamica è supportata da C # 4.0, che è un linguaggio compilato. Objective-C supporta anche alcune caratteristiche di linguaggi dinamici. Tuttavia, nessuno di loro sono anche vicino a Lisp in termini di supporto codice automodificante.

Per supportare un tale grado di dinamismo e il codice di auto-modifica, si dovrebbe avere un compilatore completo per chiamare in fase di esecuzione; questo è più o meno quello che un interprete è in realtà.

Prova groove. Si tratta di un linguaggio basato dinamica Java JVM che viene compilato in fase di esecuzione. Dovrebbe essere in grado di eseguire il proprio codice.

http://groovy.codehaus.org/

In caso contrario, hai sempre avuto Perl, PHP, ecc ... ma quelli non sono, come lei suggerisce, C / C ++ / D- come le lingue.

JavaScirpt + V8 (il compilatore JavaScript Chrome)

JavaScript è

  • dinamica
  • auto-modifica (auto-valutazione) (beh, più o meno, a seconda della definizione)
  • ha una sintassi C-like (ancora una volta, una sorta di, questo è il meglio si ottiene per dinamica)

E ora è possibile compilare con V8: http://code.google.com/p / V8 /

  

Non voglio essere dipendente da un VM, questo è quello che volevo dire con compilati:)

Se questo è tutto quello che stai cercando, io consiglierei di Python o Ruby. Entrambi possono funzionare su proprie macchine virtuali e la JVM e .NET CLR. Così, è possibile scegliere qualsiasi fase di esecuzione che si desidera. Dei due, Ruby sembra avere strutture più meta-programmazione, ma Python sembra avere implementazioni più maturi su altre piattaforme.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top