Un code automodifiable est, en programmation informatique, un programme qui peut se modifier lui-même, c’est-à-dire appeler des routines, fonctions ou méthodes qui seront créées par le programme lui-même.
En dehors de l'idée, qui relève pour le moment de la fiction, d'un robot qui modifierait lui-même sa finalité, l'utilisation la plus courante du code automodifiable est l'optimisation de la vitesse d'exécution d'un programme : par exemple un interpréteur peut analyser le code source qu'il est en train d'exécuter, se rendre compte qu'une fonction est appelée fréquemment, et en réaliser à la volée une version compilée, qui sera exécutée plus rapidement. C'est ce que l'on appelle la compilation à la volée (just in time compilation), qui est utilisée par exemple par la plupart des machines virtuelles pour le langage java.
Certaines de ces techniques sont utilisées comme protection anticopie des jeux vidéo, en effet il est alors pratiquement impossible de comprendre le code sans l'exécuter pas à pas.
Écrire du code automodifiable n'est pas facile, avec certains langages compilés c'est même impossible ou presque impossible. Par exemple en C, l'idée intuitive serait de créer un tableau d'octets qui représentent le code binaire d'une fonction, puis de créer un pointeur de fonction, et de lui affecter (avec un « cast ») l'adresse du tableau. Ensuite un appel du pointeur de fonction suffit à exécuter la nouvelle routine. Cela fonctionne en mode réel, mais la plupart des systèmes d'exploitation modernes ne le permettent pas : les données et les programmes résident dans des espaces séparés et l'exécution d'instructions se trouvant dans le segment des données est bloquée.
Dans un langage de script, où les programmes sont des textes, il est bien plus facile d'écrire du code automodifiable. D'une manière générale, c'est plus simple avec un langage interprété (comme BASIC, PHP ou Lisp). Avec un langage compilé, écrire du code automodifiable nécessite généralement de définir une machine virtuelle et un interpréteur pour cette machine virtuelle.
Cette page est générée automatiquement et peut contenir des informations qui ne sont pas correctes, complètes, à jour ou pertinentes par rapport à votre recherche. Il en va de même pour toutes les autres pages de ce site. Veillez à vérifier les informations auprès des sources officielles de l'EPFL.
We teach the fundamental aspects of analyzing and interpreting computer languages, including the techniques to build compilers. You will build a working compiler from an elegant functional language in
This seminar teaches the participants to use advanced Python concepts for writing easier to read, more flexible and faster code.
It teaches concepts in a hands-on and tangible fashion, providing examp
Students learn several implementation techniques for modern functional and object-oriented programming languages. They put some of them into practice by developing key parts of a compiler and run time
In computer science, algorithmic efficiency is a property of an algorithm which relates to the amount of computational resources used by the algorithm. An algorithm must be analyzed to determine its resource usage, and the efficiency of an algorithm can be measured based on the usage of different resources. Algorithmic efficiency can be thought of as analogous to engineering productivity for a repeating or continuous process. For maximum efficiency it is desirable to minimize resource usage.
vignette|Exemple d'un quine écrit en Java (en haut). Quand on l'exécute, ce programme écrit son propre code source (en bas). Un quine (ou programme autoreproducteur, self-reproducing en anglais) est un programme informatique qui imprime son propre code source. L'opération qui consiste à ouvrir le fichier source et à l'afficher est considérée comme une tricherie. Plus généralement, un programme qui utilise une quelconque entrée de données ne peut être considéré comme un quine valide.
Les modes d'adressage sont un aspect de l'architecture des processeurs et de leurs jeux d'instructions. Les modes d'adressage définis dans une architecture régissent la façon dont les instructions en langage machine identifient leurs opérandes. Un mode d'adressage spécifie la façon dont est calculée l'adresse mémoire effective d'un opérande à partir de valeurs contenues dans des registres et de constantes contenues dans l'instruction ou ailleurs dans la machine.
Couvre la génération de code pour un compilateur, traduisant un programme Amy à WebAssembly, y compris la gestion de la mémoire et la compilation de correspondance de motifs.
Formally verifying the correctness of software is necessary to merit the trust people put in software systems. Currently, formal verification requires human effort to prove that a piece of code matches its specification and code changes to improve verifiab ...
EPFL2024
Fuzzing reliably and efficiently finds bugs in software, including operating system kernels. In general, higher code coverage leads to the discovery of more bugs. This is why most existing kernel fuzzers adopt strategies to generate a series of inputs that ...
Berkeley2023
A metaprogrammer should be able to reason about the semantics of the generated code.Multi-stage programming introduced an elegant and powerful solution to this problem.It follows a semantically driven approach to code generation, where semantics are fully ...