lundi 12 novembre 2007

Script Ruby auto-reproducteur


Alors, alors ! Voici un premier petit code en Ruby.


Que fait-il au juste ?

Ce script se clone lui même 20 fois à l' identique, hormis son numéro de version qui est utilisé afin de nommer le fichier ainsi généré. Ensuite, le script ainsi généré est lancé dans un thread parallèle. On considère un clone mort lorsqu'il ne peut plus se reproduire.

On obtiens donc un système qui s'auto-reproduit de façon exponentielle (clon0 génère clon1 - clon0 génère clon2 pendant que clon1 génère clon3 - ... etc ...).

Quel intérêt ?

On peut se demander quel usage faire de ce petit script... A priori aucun. Au mieux (au pire ?), il pourrait s'agir d'un ver (pas longtemps solitaire...) si on ne limite pas le nombre de reproductions (remplacer "20" par l'infini : dans ce cas, les clones sont "immortels", et le processus est stoppé lorsque le disque (ou le quota) est plein...). A mes yeux, son principal intérêt réside dans le fait qu'il illustre assez bien les possibilités de la méta-programmation en Ruby, et peut être une base pour des programmes "intelligents" : c'est à dire capables
d'évoluer en se modifiant eux-mêmes. Éventuellement applicable pour des modèles d'intelligence artificielle ?

Le code : (fichier clon0.rb)

version = 0

puts "Birth of clone n " + version.to_s

for i in (0...20)
filou = "clon" + i.to_s + ".rb"
if (File.exist?(filou)==false) then
phyl = File.new(filou, "w")

phyl.printf "version = #{i}" + "\n"
puts "clone n #{version} creates clone n #{i}"
me = File.new("clon" + version.to_s + ".rb")
scratch = (me.readline.delete("\n", "^n")).to_s
line = ""
for j in (2..27)
line = (me.readline.delete("\n", "^n")).to_s
phyl.printf line + "\n"
end
phyl.close
procs = false
Thread.new do
procs = system("ruby clon" + i.to_s + ".rb") #
end

end
end

puts "Death of clone n #{version}"

0 commentaires: