Domanda

Ho sentito che ci sono alcune cose che non si possono fare come programmatori di computer, ma non so cosa siano. Una cosa che mi è venuta in mente di recente è stata: non sarebbe bello avere una classe in grado di fare una copia del sorgente del programma che esegue, modificare quel programma e aggiungere un metodo alla classe che è, e quindi eseguire la copia del programma e terminare se stessa. È possibile per il codice scrivere codice?

È stato utile?

Soluzione

Inizia guardando quines , quindi su Macro-Assemblers e poi lex & amp; yacc e flex & amp; bisonti. Quindi considera codice automodificante .

Ecco un quine (formattato, usa l'output come nuovo input):

#include<stdio.h>

main()
{
  char *a = "main(){char *a = %c%s%c; int b = '%c'; printf(a,b,a,b,b);}";
  int b = '"';
  printf(a,b,a,b,b);
}

Ora se stai solo cercando cose che i programmatori non possono fare per cercare l'opposto di np-complete.

Altri suggerimenti

Se vuoi conoscere i limiti della calcolabilità, leggi il problema di interruzione

  

Nella teoria della computabilità, l'arresto   problema è un problema decisionale che   può essere dichiarato come segue: dato a   descrizione di un programma e un finito   input, decidere se il programma   finisce di funzionare o funzionerà per sempre,   dato questo input.

     

Alan Turing dimostrò nel 1936 che a   algoritmo generale per risolvere il problema dell'arresto per tutti   non possono esistere possibili coppie di input del programma

Certo che lo è. Ecco come funzionano molti virus!

Sì, è quello che fanno la maggior parte delle macro Lisp (solo per un esempio).

Sì, certamente, anche se forse non nel contesto a cui ti riferisci per dare un'occhiata a questo su t4.

Se guardi alla Programmazione Funzionale che ha molte opportunità di scrivere codice che genera ulteriore codice, il modo in cui un linguaggio come Lisp non distingue tra codice e dati è una parte significativa della sua potenza.

Rails genera i vari modelli predefiniti e classi controller dallo schema del database durante la creazione di una nuova applicazione. È abbastanza standard fare questo tipo di cose con linguaggi dinamici: ho alcuni frammenti di PHP in giro che generano file php, solo perché era la soluzione più semplice al problema che stavo affrontando in quel momento.

Quindi è possibile. Per quanto riguarda la domanda che stai ponendo, tuttavia, che è forse un po 'vaga, quale ambiente e lingua stai usando? Cosa ti aspetti che faccia il codice e perché è necessario aggiungerlo? Un esempio concreto può fornire risposte più direttamente pertinenti.

Sì, è possibile creare generatori di codice. Il più delle volte prendono l'input dell'utente e producono un codice valido. Ma ci sono altre possibilità.

Sono anche possibili programmi di modifica automatica. Ma erano più comuni nell'era del DOS.

Certo che puoi! In effetti, se si utilizza un linguaggio dinamico, la classe può cambiare se stessa (o un'altra classe) mentre il programma è ancora in esecuzione. Può persino creare nuove classi che prima non esistevano. Questo si chiama metaprogrammazione e consente al tuo codice di diventare molto flessibile.

Stai confondendo / fondendo due significati della parola "scrivi". Un significato è la scrittura fisica di byte su un supporto e l'altro è la progettazione di software. Ovviamente puoi fare in modo che il programma esegua il primo, se è stato progettato per farlo.

L'unico modo per un programma di fare qualcosa che il programmatore non intendeva esplicitamente fare è comportarsi come una creatura vivente: mutare (incorporare in sé frammenti di ambiente) e replicare mutanti diversi a velocità diverse (a evitare la completa estinzione, se una mutazione è terminale).

Certo che lo è. Ho scritto un effetto per Paint.NET * che ti dà un editor e ti permette di scrivere un effetto grafico "al volo". Quando si interrompe la digitazione, lo compila in una dll, lo carica e lo esegue. Ora, nell'editor, devi solo scrivere la funzione di rendering attuale, tutto il resto necessario per creare una dll è scritto dall'editor e inviato al compilatore C #.

Puoi scaricarlo gratuitamente qui: http://www.boltbait.com/pdn/codelab /

In effetti, c'è anche un'opzione per vedere tutto il codice che è stato scritto per te prima che venga inviato al compilatore. Il file di aiuto (linkato sopra) ne parla interamente.

Il codice sorgente è disponibile per il download anche da quella pagina.

* Paint.NET è un editor di immagini gratuito che puoi scaricare qui: http://getpaint.net

In relazione all'intelligenza artificiale, dai un'occhiata a Algoritmi evolutivi .

  

crea una copia del sorgente del programma che esegue, modifica quel programma e aggiungi un metodo alla classe che è, quindi esegui la copia del programma e termina da solo

Puoi anche generare codice, crearlo in una libreria anziché in un eseguibile, quindi caricare dinamicamente la libreria senza nemmeno uscire dal programma attualmente in esecuzione.

I linguaggi dinamici di solito non funzionano come suggerisci, in quanto non hanno una fase di compilazione completamente separata. Non è necessario che un programma modifichi il proprio codice sorgente, si ricompili e inizi da zero. In genere la nuova funzionalità viene compilata e collegata al volo.

Common Lisp è un ottimo linguaggio in cui esercitarsi, ma ce ne sono altri in cui è possibile creare codice ed eseguirlo in quel momento. Tipicamente, ciò avverrà tramite una funzione chiamata "eval" o qualcosa di simile. Perl ha un " eval " ed è generalmente comune per i linguaggi di scripting avere la possibilità.

Esistono molti programmi che scrivono altri programmi, come yacc o bison, ma non hanno la stessa qualità dinamica che sembra stia cercando.

Dai un'occhiata a il ciclo di Langtom . Questo è l'esempio più semplice di auto-riproduzione del "programma".

Esiste un'intera classe di cose chiamate "Generatori di codice". (Anche se, un compilatore si adatta anche alla descrizione mentre lo si imposta). E quelli descrivono le due aree di queste bestie.

La maggior parte del codice viene generato, assume una qualche forma di input dell'utente (la maggior parte utilizza uno schema del database) e il codice sorgente del prodotto che viene quindi compilato.

Quelli più avanzati possono generare codice eseguibile. Con .NET, esiste un intero spazio dei nomi (System.CodeDom) dedicato alla creazione di codice eseguibile. Questi oggetti, puoi prendere il codice C # (o un'altra lingua), compilarlo e collegarlo al tuo programma attualmente in esecuzione.

Faccio questo in PHP.

Per mantenere le impostazioni di una classe, mantengo una variabile locale chiamata $ data . $ data è solo un dizionario / hashtable / assoc-array (dipende da dove vieni).

Quando carichi la classe, include un file php che sostanzialmente definisce i dati. Quando salvo la classe, scrive il PHP per ogni valore di dati. È un processo di scrittura lento (e attualmente ci sono alcuni problemi di concorrenza) ma è più veloce della luce da leggere. Molto più veloce (e più leggero) rispetto all'utilizzo di un database.

Qualcosa del genere non funzionerebbe in tutte le lingue. Funziona per me in PHP perché PHP è molto al volo.

È sempre stato possibile scrivere generatori di codice. Con la tecnologia XML, l'uso di generatori di codice può essere uno strumento essenziale. Supponiamo di lavorare per un'azienda che deve occuparsi di file XML di altre società. È relativamente semplice scrivere un programma che utilizza il parser XML per analizzare il nuovo file XML e scrivere un altro programma che ha tutte le funzioni di callback impostate per leggere i file XML di quel formato. Dovresti comunque modificare il nuovo programma per renderlo specifico per le tue esigenze, ma il tempo di sviluppo in cui un nuovo file XML (nuova struttura, nuovi nomi) viene ridotto molto utilizzando questo tipo di generatore di codice. Secondo me, questo fa parte della forza della tecnologia XML.

Lisp lisp lisp lisp: p

Scherzando, se vuoi che il codice che genera codice venga eseguito e hai il tempo di perdere l'apprendimento e spezzarti la mente con cose ricorsive che generano più codice, prova a imparare lisp :)

(eval '(or true false))
  

non sarebbe bello avere una classe che potrebbe fare una copia del sorgente del programma che esegue, modificare quel programma e aggiungere un metodo alla classe che è, e quindi eseguire la copia del programma e terminare se stesso

Non ci sono quasi casi in cui ciò risolva un problema che non può essere risolto "meglio". utilizzando un codice non auto-modificante ..

Detto questo, ci sono alcuni casi (utili) molto comuni di codice che scrivono altro codice. Il più ovvio è qualsiasi applicazione web sul lato server, che genera HTML / Javascript (beh, HTML è markup, ma è identico in teoria). Inoltre, qualsiasi script che altera un ambiente di terminali di solito genera uno script di shell che viene valutato dalla shell madre. wxGlade genera codice per creare GUI basate su wx bare-bone.

Guarda il nostro DMS Software Reengineering Toolkit . Questa è una macchina per scopi generici per leggere e modificare programmi o generare programmi assemblando frammenti.

Questa è una delle domande fondamentali dell'intelligenza artificiale. Personalmente spero che non sia possibile, altrimenti presto sarò senza lavoro !!! :)

Si chiama meta-programmazione ed è sia un bel modo di scrivere programmi utili e un argomento di ricerca interessante. Il Esseri artificiali di Jacques Pitrat: la coscienza di una macchina consapevole dovrebbe interessarti molto. È principalmente correlato a programmi informatici basati sulla meta-conoscenza.

Un altro termine correlato è programmazione multi-stage (perché ci sono diverse fasi di programmi, ognuno dei quali genera il successivo).

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