Since von Neumann's seminal work around 1950, computer scientists and others have studied the algorithms needed to support self-replicating systems. Much of this work has focused on abstract logical machines (automata) embedded in two-dimensional cellular spaces. This research was motivated by the desire to understand the basic information-processing principles underlying self-replication, the potential long-term applications of programmable self-replicating machines, and the possibility of gaining insight into biological replication and the origins of life. We view past research as taking three main directions: early complex universal computer-constructors modeled after Turing machines, qualitatively simpler self-replicating loops, and efforts to view self-replication as an emergent phenomenon. We discuss our recent studies in the latter category showing that self-replicating structures can emerge from nonreplicating components, and that genetic algorithms can be applied to program automatically simple but arbitrary structures to replicate. We also describe recent work in which self-replicating structures are successfully programmed to do useful problem solving as they replicate. We conclude by identifying some implications and important research directions for the future.