I'm working on a really 'neat' project right now that involves the development of a basic opcode interpreter. It is similar to assembly in that it only interprets (and executes) a single instruction at a time. However, each 'instruction' does more than just move a number around in registers, or push and pop things in and out of memory. The only limit to the complexity is that the instruction cannot use more than a 3D vector, a scalar, and a byte (that's sort of the definition of the size of an instruction). If it uses any more than that, it gets broken down into multiple instructions.
The cool thing about that is you can write your own programs in a text file by stringing together these basic instructions, and the opcode interpreter reads it in and basically 'compiles' a program (well, interprets it).
This is an AI program that uses genetic algorithms to sort of evolve specimens over time such that they can execute certain types of behaviors efficiently (although they don't learn new behavior...the pinnacle of artificial intelligence research).