At one point I was seriously fascinated by the lambda calculus and particularly the S and K combinators - two very simple functions that you can build any computation from:<p><a href="http://en.wikipedia.org/wiki/SKI_combinator_calculus" rel="nofollow">http://en.wikipedia.org/wiki/SKI_combinator_calculus</a><p>More recently I found out about the U combinator which is a single combinator that can be used to define S & K:<p><a href="http://en.wikipedia.org/wiki/Iota_and_Jot" rel="nofollow">http://en.wikipedia.org/wiki/Iota_and_Jot</a><p>Having a system that implemented recursion using the Y combinator in terms of S & K and have it actually compute stuff was rather amusing. I'd be fascinated to see what it would look like using just U.
Here's a single-instruction computer built out of the page translation behavior of X86 processors:<p><a href="http://events.ccc.de/congress/2012/Fahrplan/events/5265.en.html" rel="nofollow">http://events.ccc.de/congress/2012/Fahrplan/events/5265.en.h...</a>
I wrote a little implementation of an OISC virtual machine many years ago [1]. Feel free to have a play. There are some sample 'one instruction assembler' programs in the test programs folder.<p>[1] - <a href="https://github.com/Creou/OISCVM" rel="nofollow">https://github.com/Creou/OISCVM</a>
I'm curious, is there any real-world application for this? Or is it mostly interesting from a research perspective?<p>It seems like this wouldn't perform very well in the real world for most applications, but I could see it being useful for very simple architectures.
Side note: Douglas W. Jones was touting this [1] in a computer architecture class in the mid-1980s. Fun stuff. He later went on to do a lot of work with computerized voting [2][3]. Great instructor...<p>[1] <a href="http://homepage.cs.uiowa.edu/~jones/arch/risc/" rel="nofollow">http://homepage.cs.uiowa.edu/~jones/arch/risc/</a>
[2] <a href="http://homepage.divms.uiowa.edu/~jones/voting/pictures/" rel="nofollow">http://homepage.divms.uiowa.edu/~jones/voting/pictures/</a>
[3] <a href="http://homepage.cs.uiowa.edu/~jones/voting/" rel="nofollow">http://homepage.cs.uiowa.edu/~jones/voting/</a>
also my favourite wikipedia disambiguation page, for the sheer, entertaining unrelatedness of the items therein: <a href="http://en.wikipedia.org/wiki/OISC" rel="nofollow">http://en.wikipedia.org/wiki/OISC</a>
How about the simplest Turing machine?<p><a href="http://en.wikipedia.org/wiki/Wolfram%27s_2-state_3-symbol_Turing_machine" rel="nofollow">http://en.wikipedia.org/wiki/Wolfram%27s_2-state_3-symbol_Tu...</a>
A fun challenge is to try to write a quine [<a href="http://en.wikipedia.org/wiki/Quine_(computing)" rel="nofollow">http://en.wikipedia.org/wiki/Quine_(computing)</a>] in an OISC.
The awesome WireWorld prime number calculating computer is also a one instruction computer.<p><a href="http://www.quinapalus.com/wires10.html" rel="nofollow">http://www.quinapalus.com/wires10.html</a>
How about the one instruction "RunInst a, b, c, d", whose behavior is defined as "Do the instruction described by parameter a in [your favorite architecture], upon parameters b, c, d"?
OISC is something you sometimes get to build in EE labs, usually as the last project for that class. It's something that you can put together out of 7400s and, at least in our case, an eeprom for a lookup table. It's a fun thing to do and I recommend it.
See also John Tromp's "interpreter for the simplest language possible"<p><a href="https://tromp.github.io/cl/cl.html" rel="nofollow">https://tromp.github.io/cl/cl.html</a>
I always thought MADD (Multiply + Add) made a great candidate for a single instruction set computer, if the program counter was usable as an operand to the instruction.