Aller au contenu

Long live the quine !

Chaque jour de l'Avent, retrouvez une courte anecdote du monde de la tech ! Ici pas de chocolats mais des petites anecdotes pour briller en société avec des faits insolites ! Aujourd'hui, on parle des programmes "quines"!

Une machine auto-reproductrice pour Noël ?

En programmation, et particulièrement en programmation fonctionnelle, on adore la réflexivité. Le cas le plus connu est celui des fonctions qui prennent des fonctions en argument et retournent des fonctions.
Mais on a aussi des méthodes qui vont lister l'ensemble des méthodes d'une classe et en exécuter une.

En Java, le célèbre framework Spring est construit sur ce mécanisme : il instancie des classes et les met en argument d'autres constructeurs.

On peut donc avoir une fonction qui va lister l'ensemble des fonctions et donc avoir dans son output ... son propre nom.
Mais peut-on aller plus loin encore ?

Pourrait-on écrire une fonction dont l'exécution produit une copie de son propre code source ?

La réponse est oui ! Ces programmes particuliers sont appelés quines en hommage au logicien américain Willard Van Orman Quine et sont souvent considérés comme des exercices de style élégants qui mettent en lumière la souplesse des différents langages de programmation.

La difficulté d'écrire une quine en fait un défi pour les programmeurs désireux de démontrer leur compréhension approfondie de leur langage de programmation préféré.

Quelques exemples

  #!/bin/sh
  quine () {
  echo -e "#!/bin/sh\n$1"
  echo "quine '$1'"
  }
  
  quine 'quine () {
  echo -e "#!/bin/sh\\n$1"
  echo "quine \047$1\047"
  }
  '

En Bash

const f = () => "const f = " + f

En Javascript

a='a=%r;print(a%%a)';print(a%a)

En Python3

Et pour terminer, une plus compliquée en Java :

class Quine{public static void main(String[] args){char n=10;char b='"';String a="class Quine{public static void main(String[] args){char n=10;char b='%c';String a=%c%s%c;System.out.format(a,b,b,a,b,n);}}%c";System.out.format(a,b,b,a,b,n);}}

Dernier