Question

J'ai entendu dire qu'il y a des choses qu'on ne peut pas faire en tant que programmeur informatique, mais je ne sais pas ce qu'elles sont. Une chose qui m'est venue à l’esprit récemment était la suivante: ne serait-il pas agréable d’avoir une classe capable de copier le source du programme qu’elle exécute, de modifier ce programme et d’ajouter une méthode à la classe qu’elle est, puis d’exécuter la copie du programme et se terminer. Est-ce que le code peut écrire du code?

Était-ce utile?

La solution

Commencez par consulter quines , puis dans Macro-Assemblers, puis lex & amp; yacc et flex & amp; bisons . Pensez ensuite au code à modification automatique .

Voici un quine (formaté, utilisez la sortie comme nouvelle entrée):

#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);
}

Maintenant, si vous cherchez seulement des choses que les programmeurs ne peuvent pas faire, cherchez le contraire de np-complete.

Autres conseils

Si vous souhaitez connaître les limites de la calculabilité, consultez le problème d'arrêt

  

Dans la théorie de la calculabilité, l’arrêt   problème est un problème de décision qui   peut être énoncé comme suit: étant donné un   description d'un programme et d'un fini   entrée, décider si le programme   finit de courir ou courra pour toujours,   compte tenu de cette entrée.

     

Alan Turing a prouvé en 1936 qu’un   algorithme général pour résoudre le problème d'arrêt pour tous   les paires possibles d'entrée de programme ne peuvent pas exister

Bien sûr que si. Voilà comment fonctionnent beaucoup de virus!

Comprenez bien ceci: la théorie de la calculabilité .

Oui, c'est ce que font la plupart des macros Lisp (pour un exemple seulement).

Oui, certainement, mais peut-être pas dans le contexte que vous évoquez, consultez cette post sur le t4.

Si vous regardez la programmation fonctionnelle qui offre de nombreuses possibilités d'écrire du code qui génère du code supplémentaire, la manière dont un langage comme Lisp ne fait pas la différence entre code et données constitue une part importante de sa puissance.

Rails génère les différentes classes de modèle et de contrôleur par défaut à partir du schéma de base de données lors de la création d'une nouvelle application. C'est assez standard de faire ce genre de chose avec les langages dynamiques - j'ai quelques bits de PHP qui génèrent des fichiers php, simplement parce que c'était la solution la plus simple au problème que je rencontrais à l'époque.

C'est donc possible. Pour ce qui est de la question que vous posez, cependant - c’est peut-être un peu vague - quel environnement et quelle langue utilisez-vous? Qu'attendez-vous du code et pourquoi doit-il être ajouté? Un exemple concret peut apporter des réponses plus directement pertinentes.

Oui, il est possible de créer des générateurs de code. La plupart du temps, ils saisissent les utilisateurs et produisent un code valide. Mais il y a d'autres possibilités.

Les programmes auto-modifiables sont également possibles. Mais ils étaient plus courants à l’époque des dos.

Bien sûr que vous pouvez! En fait, si vous utilisez un langage dynamique, la classe peut se modifier (ou une autre classe) tant que le programme est en cours d'exécution. Il peut même créer de nouvelles classes qui n'existaient pas auparavant. Cela s'appelle la métaprogrammation et permet à votre code de devenir très flexible.

Vous confondez / confondez deux significations du mot "écrire". Une signification est l'écriture physique d'octets sur un support, l'autre conception de logiciels. Bien sûr, vous pouvez faire en sorte que le programme remplisse l'ancien, s'il a été conçu pour le faire.

La seule façon pour un programme de faire quelque chose que le programmeur ne l’a pas explicitement voulu, est de se comporter comme un être vivant: muter (incorporer des éléments d’environnement) et de répliquer différents mutants à éviter une extinction complète, si une mutation est terminale).

Bien sûr que si. J'ai écrit un effet pour Paint.NET * qui vous donne un éditeur et vous permet d'écrire un effet graphique "à la volée". Lorsque vous marquez une pause, il le compile dans une dll, le charge et l'exécute. Maintenant, dans l'éditeur, il vous suffit d'écrire la fonction de rendu réelle, tout le reste nécessaire pour créer une dll est écrit par l'éditeur et envoyé au compilateur C #.

Vous pouvez le télécharger gratuitement ici: http://www.boltbait.com/pdn/codelab /

En fait, il existe même une option permettant de voir tout le code qui a été écrit pour vous avant son envoi au compilateur. Le fichier d’aide (lien ci-dessus) en parle.

Le code source est également disponible en téléchargement à partir de cette page.

* Paint.NET est un éditeur d’images gratuit que vous pouvez télécharger ici: http://getpaint.net

En ce qui concerne l'intelligence artificielle, consultez les algorithmes évolutifs .

  

faire une copie de la source du programme qu'il exécute, modifier ce programme et ajouter une méthode à la classe qu'elle est, puis exécuter la copie du programme et se terminer

Vous pouvez également générer du code, le construire dans une bibliothèque au lieu d'un exécutable, puis charger dynamiquement la bibliothèque sans même quitter le programme en cours d'exécution.

Les langages dynamiques ne fonctionnent généralement pas comme vous le suggérez, en ce sens qu'ils ne comportent pas d'étape de compilation complètement distincte. Il n'est pas nécessaire qu'un programme modifie son propre code source, recompile et recommence à zéro. Généralement, la nouvelle fonctionnalité est compilée et liée à la volée.

Common Lisp est un très bon langage pour pratiquer cela, mais il y en a d'autres où vous pouvez créer du code et l'exécuter à tout moment. En règle générale, vous utiliserez une fonction appelée "eval". ou quelque chose de similaire. Perl a un " eval " fonction, et il est généralement commun pour les langages de script d'avoir la capacité.

De nombreux programmes écrivent d’autres programmes, tels que yacc ou bison, mais ils n’ont pas la même qualité dynamique que celle que vous recherchez.

Jetez un coup d'œil à la la boucle de Langtom . C’est l’exemple le plus simple de "programme" auto-reproducteur.

Il existe toute une classe d'objets de ce type appelés "générateurs de code". (Bien que, un compilateur correspond également à la description que vous définissez). Et ceux-ci décrivent les deux zones de ces bêtes.

La plupart du code généré prend une forme d’entrée utilisateur (la plupart prend un schéma de base de données) et le code source du produit qui est ensuite compilé.

Les plus avancés peuvent générer du code exécutable. Avec .NET, il existe un espace de noms complet (System.CodeDom) dédié à la création de code exécutable. Pour ces objets, vous pouvez prendre du code C # (ou un autre langage), le compiler et le lier à votre programme en cours d'exécution.

Je le fais en PHP.

Pour conserver les paramètres d'une classe, je conserve une variable locale appelée $ data . $ data est juste un dictionnaire / hashtable / assoc-array (selon votre origine).

Lorsque vous chargez la classe, elle inclut un fichier php qui définit essentiellement les données. Lorsque je sauvegarde la classe, il écrit le code PHP pour chaque valeur de données. C'est un processus d'écriture lent (et il y a actuellement quelques problèmes de concurrence) mais il est plus rapide que de lire. Tellement plus rapide (et plus léger) que d'utiliser une base de données.

Quelque chose comme ça ne fonctionnerait pas pour toutes les langues. Cela fonctionne pour moi en PHP parce que PHP est très actif.

Il a toujours été possible d'écrire des générateurs de code. Avec la technologie XML, l’utilisation de générateurs de code peut être un outil essentiel. Supposons que vous travailliez pour une entreprise qui doit traiter des fichiers XML provenant d’autres entreprises. Il est relativement simple d'écrire un programme qui utilise l'analyseur XML pour analyser le nouveau fichier XML et écrire un autre programme disposant de toutes les fonctions de rappel configurées pour lire les fichiers XML de ce format. Vous devez toujours modifier le nouveau programme pour l'adapter à vos besoins, mais le temps de développement lorsqu'un nouveau fichier XML (nouvelle structure, nouveaux noms) est considérablement réduit en utilisant ce type de générateur de code. À mon avis, cela fait partie de la force de la technologie XML.

Lisp lisp lisp lisp: p

En plaisantant, si vous voulez que le code qui génère du code soit exécuté et que vous ayez le temps de le perdre et que vous vous cassiez l’esprit avec des éléments récursifs générant plus de code, essayez d’apprendre lisp:)

(eval '(or true false))
  

ne serait-il pas agréable d'avoir une classe capable de copier le source du programme qu'elle exécute, de modifier ce programme et d'ajouter une méthode à la classe en question, puis d'exécuter la copie du programme et se terminer

Il n’existe pratiquement aucun cas où cela résoudrait un problème impossible à résoudre "mieux". en utilisant un code qui ne se modifie pas lui-même.

Cela dit, il existe des cas très courants (utiles) de code écrivant un autre code. Le plus évident est toute application Web côté serveur, qui génère du HTML / Javascript (enfin, HTML est un balisage, mais il est identique à théorie). De même, tout script modifiant un environnement de terminal génère généralement un script shell évalué par le shell parent. wxGlade génère du code permettant de créer des interfaces utilisateur graphiques basées sur wx.

Consultez notre DMS Software Reengineering Toolkit . Il s'agit d'un mécanisme d'usage général permettant de lire et de modifier des programmes ou de générer des programmes en assemblant des fragments.

C’est l’une des questions fondamentales de l’intelligence artificielle. Personnellement, j'espère que ce n'est pas possible - sinon je serai bientôt au chômage !!! :)

Elle s'appelle méta-programmation et constitue un moyen agréable d'écrire des programmes utiles. et un sujet de recherche intéressant. Le ouvrage Artificial Beings: La conscience d'une machine consciente de Jacques Pitrat devrait vous intéresser beaucoup. Il est principalement lié aux programmes informatiques basés sur la méta-connaissance.

Un autre terme associé est programmation en plusieurs étapes (car il existe plusieurs étapes de programmes, chacun générant le suivant).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top