So basically, you write a program that can change itself. Then, you give it a task. As it tries to complete the task, it makes changes to the code. Any changes that make it better at that task stay, and changes that make it worse get tossed. Repeat this thousands of times, and you get something that can complete the task pretty well.
Latest Answers