<h1>Preface</h1>
<p>
- This is the first volume of the book Tom's Turing Complete Computer Architecture. The initial chapters here set down the theory of the TM, Tape Machine. Following the theory chapters is a description of a software library for using the TM as a general iterator and container. The TM software library was first released with the first edition of this volume in 2022 written in Common Lisp and placed on MELPA. Since then, ad hoc versions were developed in C, Java, and Python. The TM-2026 GitHub project has as its purpose unifying the various language versions with a revised command language. The larger objective of these volumes is to morph the Turing Machine into a modern architecture, thus bridging computation theory to computing. The TM software library is a useful fallout of this work.
+ This is the first volume of the book Tom's Turing Complete Computer Architecture, 'TTCA' book. The initial chapters set down the theory of the TM, Tape Machine. Following the theory chapters is a description of a software library for using the TM as a general iterator and container. The TM software library was released with the first edition of this volume in 2022, written in Common Lisp, and placed on MELPA. Since then, ad hoc versions were developed in C, Java, and Python. The TM-2026 GitHub project has as its purpose unifying the various language versions with a revised command language. The larger objective of these volumes is to morph the Turing Machine into a modern architecture, thus bridging computation theory to computing. The TM software library is a useful fallout of this work.
</p>
<h1>Introduction</h1>
<p>
- In their 1928 book Grundzüge der theoretischen Logik <RT-cite ref="David Hilbert and Wilhelm Ackermann, Grundzüge der theoretischen Logik, 1928"></RT-cite>, Hilbert and Ackermann asked the question, "Does there exist an algorithm that, given any statement in first order logic, can decide whether that statement is universally valid (i.e., provable from the axioms)?" They called this the Entscheidungsproblem. The Turing Machine abstraction was introduced by Alan Turing in his 1936 paper and used as a device to prove that no first 'analyzer' program can universally analyze and decide if a second 'studied' program will halt when it is run <RT-cite ref="Alan Turing, On Computable Numbers, with an Application to the Entscheidungsproblem, Proceedings of the London Mathematical Society, 1936"></RT-cite>. An answer to this <RT-term>halting problem</RT-term> question, i.e., "The studied machine halts," or "The studied machine does not halt," would indeed be a statement in first order logic. Thus, by showing no analyzer can universally make such a determination, Turing proved that no decider could exist for the Entscheidungsproblem.
+ In 1893 Gottlob Frege published an axiomatic construction of mathematics from set theory. Frege's grand objective was somethign he called <RT-term>Logicism</RT-term>, the philosophical thesis that all of mathematics can be derived entirely from pure logic. To achieve this, his specific machinery relied upon unrestricted set comprehension, formalized as Basic Law V <RT-cite ref="Gottlob Frege, Grundgesetze der Arithmetik, Vol. II, 1903, Appendix (Nachwort), p. 253. Frege writes: 'Hardly anything more unfortunate can befall a scientific writer than to have one of the foundations of his edifice shaken after the work is finished.'"></RT-cite>.
</p>
<p>
- The Turing Machine formalism was further refined and turned into a basis for computation theory in early textbooks by Stephen Kleene <RT-cite ref="Stephen C. Kleene, Introduction to Metamathematics, 1952"></RT-cite>, Martin Davis <RT-cite ref="Martin Davis, Computability and Unsolvability, 1958"></RT-cite>, and Marvin Minsky <RT-cite ref="Marvin L. Minsky, Computation: Finite and Infinite Machines, Prentice Hall, 1967"></RT-cite>, leading to the modern standard presentations by authors such as John Hopcroft and Jeffrey Ullman <RT-cite ref="John E. Hopcroft and Jeffrey D. Ullman, Introduction to Automata Theory, Languages, and Computation, 1979"></RT-cite>, as well as Lewis and Papadimitriou <RT-cite ref="Harry R. Lewis and Christos H. Papadimitriou, Elements of the Theory of Computation, ISBN 978-0132624787"></RT-cite>.
+ At a conference in Paris in 1900 David Hilbert presented a list of pressing unsolved problems in mathematics.
+ Second on his list was "The Compatibility of the Arithmetical Axioms," Hilbert challenged mathematicians to find a means to demonstrate that "a finite number of logical steps based upon them [axioms] can never lead to contradictory results" <RT-cite ref="Conference of 1900 printed in English: F.N. Cole et al., eds., Bulletin of the American Mathematical Society, Vol. VIII, The Macmillan Company, 1902. This can be found at https://www.gutenberg.org/cache/epub/71655/pg71655-images.html. The MathWorld article on this subject, https://mathworld.wolfram.com/HilbertsProblems.html, explains that Hilbert presented 10 problems at the conference, though the publication shows 23 problems, and shortly later a 24th problem was added. Based on the notes of this citation, it appears the second problem was second on all the lists. Also note, he discusses completeness specifically as an axiom for bounding on the sets, which appears to be distinct from the question of logical completeness for an axiomatic system."></RT-cite>.
+ </p>
+
+ <p>
+ In 1901 Bertrand Russell discovered a paradox in Frege's machinery. The paradox Russell pointed out was the well-formed formula that defined the set of all sets that do not contain themselves, and the question of whether such a set contained itself <RT-cite ref="Bertrand Russell, The Principles of Mathematics, Cambridge University Press, 1903, Chapter X, 'The Contradiction'."></RT-cite>. Russel communicated this to Frege in a letter dated 1902-06-16, shortly before his second volume was going to print <RT-cite ref="Letter from Bertrand Russell to Gottlob Frege, 1902-06-16, reprinted in Jean van Heijenoort, From Frege to Gödel: A Source Book in Mathematical Logic, Harvard University Press, 1967, pp. 124-125."></RT-cite> <RT-cite ref="Gottlob Frege, Grundgesetze der Arithmetik, Vol. II, 1903, Appendix (Nachwort), p. 253. Frege writes: 'Hardly anything more unfortunate can befall a scientific writer than to have one of the foundations of his edifice shaken after the work is finished.'"></RT-cite>. Frege hurriedly author an appendix (the Nachwort) admitting his system was compromised. <RT-cite ref="Frege was a quiet, rigid man who had spent decades building his logical fortress in almost total academic obscurity. Frege was personally devastated by Russel's letter. Shortly after, he suffered the loss of his wife, fell into severe depression, and his academic output almost entirely ceased. In 1924, a year before his death, he wrote unpublished diaries explicitly surrendering his life's work, declaring that logicism was a mistake and that mathematics must actually be derived from geometry. Note I. Grattan-Guinness, The Search for Mathematical Roots, 1870-1940, Princeton University Press, 2000. For an analysis of Frege's intellectual decline, personal tragedies, and his unpublished 1924-1925 diaries where he formally surrenders the logicist program, see Chapter 7."></RT-cite>.
+ </p>
+
+ <p>
+ In 1903 Russell proposed a modification to set theory based on a hierarchy of types to repair this foundational vulnerability. At the base were sets of individuals, then sets based on individuals or sets of individuals, etc. This looks a lot like how types work in modern software <RT-cite ref="Bertrand Russell, The Principles of Mathematics, Cambridge University Press, 1903, Appendix B: The Doctrine of Types."></RT-cite>. In this manner it is not possible to write a paradoxical set definition. Russell and Alfred North Whitehead then engineered an entirely new, massive architectural scaffolding utilizing this type system to pursue Frege's original objective of deriving mathematics from logic, publishing their results in three volumes between 1910 and 1913 <RT-cite ref="Alfred North Whitehead and Bertrand Russell, Principia Mathematica, Cambridge University Press, 1910-1913."></RT-cite>.
+ </p>
+
+ <p>
+ In 1908 Ernst Zermelo published an alternative for eliminating such paradoxes by introducing the Axiom of Separation. Accordingly, a person starts with an existing set, and is then allowed to partition out subsets from that set <RT-cite ref="Ernst Zermelo, 'Untersuchungen über die Grundlagen der Mengenlehre I', Mathematische Annalen, Vol. 65, 1908, pp. 261-281."></RT-cite>.
+ </p>
+
+ <p>
+ In 1928 David Hilbert and Wilhelm Ackermann published a textbook on mathematical logic, Grundzüge der theoretischen Logik <RT-cite ref="David Hilbert and Wilhelm Ackermann, Grundzüge der theoretischen Logik, 1928. This first edition has not been translated into English."></RT-cite>. A feature of this book is its attention on procedures to follow for mechanically determining truth of statements. They called the problem solved by such a procedure the Entscheidungsproblem. In the first chapter they review the procedure for solving the Entscheidungsproblem in the propositional logic. For the first order predicate calculus they define the problem as, "Universal validity concerns the following question: How can one determine, for any given logical expression that contains no individual signs [constants], whether the expression represents a true assertion for arbitrary substitutions for the occurring variables, or not?" <RT-cite ref="Ibid pp. 72-73."></RT-cite>. They review some special cases with solutions, including one published earlier by Ackermann, but then throw down the gauntlet by saying,
+ "A general solution to the Entscheidungsproblem, regardless of whether a person considers the first or the second formulation, is not yet available." <RT-cite ref='Ibid p. 81, "Eine allgemeine Lösung des Entscheidungsproblems , mag man nun die erste oder die zweite Fassung nehmen, liegt bis jetzt noch nicht vor."'></RT-cite> <RT-cite ref="The term Entscheidungsproblem literally translates to 'decision problem'. However, there are many types of decision problems, and later we will meet a class of Turing Machine programs called deciders, so it appears to be best to keep the original German. As we will see later Alan Turing also did this."></RT-cite>.
+ </p>
+
+ <p>
+ In 1931 Kurt Gödel published his incompleteness theorems <RT-cite ref="Kurt Gödel, 'Über formal unentscheidbare Sätze der Principia Mathematica und verwandter Systeme I', Monatshefte für Mathematik und Physik, Vol. 38, 1931, pp. 173-198."></RT-cite>. By mapping formal logic into arithmetic, he demonstrated that any consistent formal system sufficiently powerful to perform basic arithmetic, let us call it system $S$, will inevitably contain well-formed formulas that are mathematically true yet cannot be proven within the system itself <RT-cite ref="For the definitive English translation, see Jean van Heijenoort, From Frege to Gödel: A Source Book in Mathematical Logic, 1879-1931, Harvard University Press, 1967, pp. 596-616."></RT-cite>. Gödel achieved this by engineering a specific formula that evaluates to the claim: "$G$: There exists no sequence of valid logical steps within system $S$ that proves $G$." If system $S$ is consistent, it cannot output a proof for $G$; thus, the claim $G$ makes is factually accurate, rendering it true but mechanically unprovable. Furthermore, Gödel demonstrated that system $S$ cannot output a proof of its own consistency. This result fractured David Hilbert's 1900 vision of utilizing a weaker, strictly "finitistic" logical subsystem to definitively prove that the axioms of arithmetic are entirely free of contradictions <RT-cite ref="David Hilbert, 'Mathematical Problems', Bulletin of the American Mathematical Society, Vol. 8, 1902, pp. 437-479."></RT-cite>. If the full, powerful system $S$ physically lacks the mechanical capacity to verify its own consistency, Hilbert's weaker finitistic subsystem is definitively incapable of accomplishing the task. Gödel's work established a hard mechanical boundary, asserting that truth and provability are distinct concepts in classical mathematics.
+ </p>
+
+ <p>
+ In April 1936, Alonzo Church leveraged Gödel's foundational papers to directly answer the Entscheidungsproblem <RT-cite ref="Alonzo Church, 'An Unsolvable Problem of Elementary Number Theory', American Journal of Mathematics, Vol. 58, No. 2, April 1936, pp. 345-363."></RT-cite>. Working independently, Alan Turing had arrived at his own mechanical solution; however, upon seeing Church's April publication, Turing rushed to submit his manuscript on 28 May 1936, appending a proof that his mechanical architecture was mathematically equivalent to Church's lambda calculus <RT-cite ref="Alan M. Turing, 'On Computable Numbers, with an Application to the Entscheidungsproblem', Proceedings of the London Mathematical Society, Vol. s2-42, No. 1, received May 28, 1936, published November 30, 1936, pp. 230-265."></RT-cite>. As Hilbert and Ackermann concede in the 1938 second edition of their textbook, Church's results demonstrated that "the quest for a general solution of the decision problem must be regarded as hopeless" <RT-cite ref="David Hilbert and Wilhelm Ackermann, Principles of Mathematical Logic, Second Edition (1938), translated 1950, p. 124."></RT-cite>. By giving the "somewhat vague intuitive concept of recursion a certain precise formalization," Church proved the "non-existence of such a recursive procedure" that could mechanically yield a value of truth or falsehood for every individual formula <RT-cite ref="Ibid, p. 124."></RT-cite>. With this proof, Church established the absolute logical boundary of formal mathematics.
+ </p>
+
+ <p>
+ Working independently in the spring of 1936, Alan Turing introduced the Turing Machine abstraction to set mechanical limits on the Entscheidungsproblem. This theoretical device was used to prove that no primary 'analyzer' program can universally decide whether a second 'studied' program will halt when it is run <RT-cite ref="Alan M. Turing, 'On Computable Numbers, with an Application to the Entscheidungsproblem', Proceedings of the London Mathematical Society, Vol. s2-42, No. 1, 1936, pp. 230-265."></RT-cite>. An answer to this <RT-term>halting problem</RT-term> (specifically asserting "The studied machine halts" or "The studied machine does not halt") would indeed be a statement in first-order logic. Thus, by showing no analyzer can universally make such a determination without entering an infinite recursion, Turing proved that no decider could exist for the Entscheidungsproblem. It is at this exact historical and mechanical boundary that the classical limits of machine computation were cemented.
+ </p>
+
+ <p>
+ While Gödel, Church, and Turing established the primary boundaries of computation, they did not work in a vacuum. During this period the broader academic community worked to synthesize the definitive mechanics of effective calculability. Jacques Herbrand and Gödel formalized general recursive functions between 1931 and 1934 <RT-cite ref="Kurt Gödel, 'On Undecidable Propositions of Formal Mathematical Systems', mimeographed lecture notes, Institute for Advanced Study, Princeton, 1934."></RT-cite>. Emil Post independently defined "Finite Combinatory Processes" in 1936, outlining a theoretical architecture functionally identical to Turing's model <RT-cite ref="Emil L. Post, 'Finite Combinatory Processes-Formulation 1', The Journal of Symbolic Logic, Vol. 1, No. 3, September 1936, pp. 103-105."></RT-cite>. Stephen Kleene subsequently unified these disparate threads, proving the strict mathematical equivalence of Church's lambda calculus, Herbrand-Gödel recursive functions, and Turing's mechanical architectures <RT-cite ref="Stephen C. Kleene, 'General Recursive Functions of Natural Numbers', Mathematische Annalen, Vol. 112, 1936, pp. 727-742."></RT-cite>.
+ </p>
+
+ <p>
+ The academic community was thus equipped with three mathematically equivalent foundations for computation theory: recursive functions, the lambda calculus, and the Turing Machine. While all three frameworks remain active subjects of study, Turing's formalism is uniquely suggestive of modern computing machines. Because computation theory ultimately defines the physical limits of what machinery can accomplish, the Turing Machine serves as the most appropriate foundation for computer scientists and engineers. This mechanical abstraction was refined into a basis for computation theory and presented as such in foundational textbooks by Stephen Kleene <RT-cite ref="Stephen C. Kleene, Introduction to Metamathematics, North-Holland, 1952"></RT-cite>, Martin Davis <RT-cite ref="Martin Davis, Computability and Unsolvability, McGraw-Hill, 1958"></RT-cite>, and Marvin Minsky <RT-cite ref="Marvin L. Minsky, Computation: Finite and Infinite Machines, Prentice-Hall, 1967"></RT-cite>, leading to the modern standard presentations by authors such as John Hopcroft and Jeffrey Ullman <RT-cite ref="John E. Hopcroft and Jeffrey D. Ullman, Introduction to Automata Theory, Languages, and Computation, Addison-Wesley, 1979"></RT-cite>, as well as Harry Lewis and Christos Papadimitriou <RT-cite ref="Harry R. Lewis and Christos H. Papadimitriou, Elements of the Theory of Computation, Prentice-Hall, 1981, ISBN 978-0132624787"></RT-cite>.
</p>
<p>
</p>
<p>
- For Turing's purposes in his 1936 paper, establishing functional equivalence between algorithms and Turing Machine programs was sufficient. Today, however, the Turing Machine can also serve as a foundational model for computation theory. Thus, to guarantee that computation theoretic results apply to modern architectures, a rigorous connection between the abstract model of the Turing Machine and that of modern computer architectures is required. Imperfections in this connection would then point to limitations in applying computation theory to modern programs.
+ To definitively apply his proof to the Entscheidungsproblem, Turing carried the additional burden of establishing that Hilbert and Ackermann's intuitive concept of an effective <RT-term-em>procedure</RT-term-em> was functionally equivalent to a Turing Machine program. Turing addressed this issue directly in his 1936 paper. Over the following decades, the academic community evaluated and accepted his argument, cementing what is now known as the Church-Turing Thesis. This consensus supplied the necessary bridge between mathematics and modern computer science by formally equating the vague, historical notion of a human procedure with the rigorous, mechanical definition of an <RT-term>algorithm</RT-term>.
</p>
<p>
- Although the Universal Turing Machine conceptually introduced programs stored as data on a tape, Turing could not provide a formal connection to modern architectures, simply because such architectures did not yet exist. Here, by <em>modern</em>, I refer architectures utilizing random-access system memory, dedicated instruction fetch streams with dynamic branching, and discrete processing units. Though Charles Babbage's 1842 Analytical Engine touched on these concepts, they would wait until the 1940s to re-emerge. The practical engineering context of 1936 was limited to calculating machines programmed via patch panels. Hence, for example, there is no explanation in his paper as to why a von Neumann architecture machine (1945) running a program would exhibit the computation theoretic results derived from a computation theory based on the Turing Machine (1936). To establish this missing connection, the volumes of the TTCA, starting in the following chapters, transform the Turing Machine into a modern architecture in a stepwise fashion, while ensuring that at each step the modifications are inconsequential to computational theoretic existence proofs and complexity class results.
+ For Turing's purposes working on the Entscheidungsproblem, establishing functional equivalence between algorithms and Turing Machine programs was sufficient. However, when the Turing Machine serves as a foundational model for computation theory, we are lead to ask another question, if the Turing Machine is representative of modern architectures. And to the extent it is different, how would this effect the applicability of compu-theoretic results.
</p>
<p>
- The Turing Machine is limited to stepping the read/write head over one cell per machine execution step. Thus, for any finite number of steps, only a finite amount of tape is ever used. But for a given computation, how much tape is that? Resolving this by assuming more tape is simply attached when needed is analogous to cheating in a 'guess the bigger number' game by declaring, "My number is always one bigger than the given number, so I will tell you my guess after you state your number." Some mathematicians suggest that what is meant by infinity is precisely a rule of this sort. For engineers building physical hardware, however, to state that a resource starts finite and expands incrementally over time is a very different proposition than being asked to install infinite memory on a machine in the first place.
+ In reading Alan Turing's 1936 paper, it is striking how modern the text feels, specifically because he discusses algorithms, stored programs, and the mechanical limits of computation.
+ While his contemporaries largely built purely mathematical and logical frameworks, Turing uniquely tied computation theory directly to the abstraction of machines executing stored programs. Because physical hardware capable of executing stored memory programs had not yet been invented, this explicit architectural grounding makes Turing's work remarkably prescient. Still, Turing could not formally connect the Turing Machine to modern architectures, simply because those architectures did not yet exist. Here, by <em>modern</em>, I refer architectures utilizing random-access system memory, dedicated instruction fetch streams with dynamic branching, and discrete processing units. Though Charles Babbage's 1842 Analytical Engine touched on these concepts, they would wait until the 1940s to re-emerge. The practical engineering context of 1936 was limited to calculating machines programmed via patch panels. Hence, for example, there is no explanation in his paper as to why a von Neumann architecture machine (1945) running a program would exhibit the computation theoretic results derived from a computation theory based on the Turing Machine (1936).
</p>
<p>
- In 1967, Marvin Minsky addressed this very topic in saying: "We need not think of the machine's tape as infinite. We imagine instead that the machine begins with a finite tape, but that, whenever an end is encountered, another unit of tape is attached." <RT-cite ref="Marvin L. Minsky, Computation: Finite and Infinite Machines, Prentice Hall, 1967, p. 167"></RT-cite> In 1967, this was a perfectly natural thing to suggest, as computers utilized magnetic tape memory on manually mounted reels, and it was entirely possible for a computation to stop and request a new reel of tape to be mounted. Contemporary computer architectures could attempt to achieve similar effects by swapping memory pages out to ever-expanding pools of networked auxiliary storage. However, if they did this, they would eventually reach an address space depleted fault. In practice, once local storage is depleted, the operating system abruptly terminates the process rather than pausing to autonomously provision additional capacity.
+ To establish the missing connection to modern architecture, the volumes of the TTCA, starting in the following chapters, transform the Turing Machine into a modern architecture in a stepwise fashion, while ensuring that at each step the modifications are inconsequential to computational theoretic existence proofs and complexity class results. We do run into some problems, so the architecture we derive will be a little different than those that we are currently building.
</p>
<p>
- Like a Turing Machine, a computer architecture is an abstraction. The box sitting on a person's desk is a realization of some computer architecture. To say a Turing Machine does something is to say that the Turing Machine was analyzed and the result of the analysis is that 'something'. The same can be said when stating that a computer architecture does something. A computer architecture is said to be Turing Complete when it can do anything that a Turing Machine can do. What this means for the realization of a computer architecture is that a running program will only throw an error because a) the program logic told it to, b) the program has a flaw, or c) there is a mathematical fact standing in the way of execution. It is tolerable to call a computer architecture Turing Complete if it has the built-in ability to pause a program until a 'more memory' request is fulfilled. If there can be any other errors from a realization running a program, such as running out of address space or integer overflow, then the architecture is not Turing Complete.
+ The infinite tape is not as large of a hurdle as it might seem at first. For computational problems the Turing Machine halts in a finite number of steps. Because the Turing Machine is limited to stepping the read/write head over one cell per machine execution step, in a finite number of steps, only a finite amount of tape is ever used. But for a given computation, how much tape is that? Resolving this by assuming more tape is simply attached when needed is analogous to cheating in a 'guess the bigger number' game by declaring, "My number is always one bigger than the given number, so I will tell you my guess after you state your number." Some mathematicians suggest that what is meant by infinity is precisely a rule of this sort. For engineers building physical hardware, however, to state that a resource starts finite and expands incrementally over time is a very different proposition than being asked to install infinite memory on a machine in the first place.
</p>
<p>
- In reading Alan Turing's 1936 paper, it is striking how modern the text feels, specifically because he discusses algorithms, stored programs, and the mechanical limits of computation. Turing was not alone in conducting theoretical computational analysis; he explicitly notes Alonzo Church in his paper as also formulating the set of computable numbers. During this era, the academic community produced a flurry of foundational logic: Jacques Herbrand (providing the initial definition of computable recursive functions, 1931), Kurt Gödel (publishing the Incompleteness Theorems and formalizing general recursive functions, 1931 and 1934), Alonzo Church (inventing the lambda calculus to definitively model computable functions, 1936), Emil Post (defining "Finite Combinatory Processes" as a theoretical architecture mathematically identical to Turing, 1936), and Stephen Kleene (proving the absolute mathematical equivalence of lambda calculus, recursive functions, and theoretical machines, 1936). However, while his contemporaries largely built purely mathematical and logical frameworks, Turing uniquely tied computation theory directly to the abstraction of machines executing stored programs. Because physical hardware capable of executing stored memory programs had not yet been invented, this explicit architectural grounding makes Turing's work remarkably prescient and gives it the aforementioned distinctly modern feel.
+ In 1967, Marvin Minsky addressed this very topic in saying: "We need not think of the machine's tape as infinite. We imagine instead that the machine begins with a finite tape, but that, whenever an end is encountered, another unit of tape is attached." <RT-cite ref="Marvin L. Minsky, Computation: Finite and Infinite Machines, Prentice Hall, 1967, p. 167"></RT-cite> In 1967, this was a perfectly natural thing to suggest, as computers utilized magnetic tape memory on manually mounted reels, and it was entirely possible for a computation to stop and request a new reel of tape to be mounted. Contemporary computer architectures could attempt to achieve similar effects by swapping memory pages out to ever-expanding pools of networked auxiliary storage. However, if they did this, they would eventually reach an address space depleted fault. In practice, once local storage is depleted, the operating system abruptly terminates the process rather than pausing to autonomously provision additional capacity.
</p>
<p>
- Turing's <RT-term>a-machine</RT-term> utilizes binary. George Boole's work (1847, 1854) was well established by then, so from a theoretical standpoint, it was a sensible simplification. However, utilizing binary within the context of a machine effectively bridged the gap to the more practically minded engineers of the time. Alan Turing's paper arrived at the same time that switched telephone networks had reached a scale that made them difficult to maintain without systematic approaches. These networks were built upon electromechanical relays, which were decisively binary devices. At least seven men in addition to Alan Turing appear to have independently contemplated the intersection of Boolean algebra, logic, and physical computing: Victor Shestakov (1935, proposed mapping Boolean algebra to electromechanical relay circuits), Konrad Zuse (1936, adopted base 2 architecture to bypass the physical complexity of decimal mechanical gears), Akira Nakashima (1936, published the mathematical equivalence of Boolean algebra and two-terminal switching networks), Louis Couffignal (1936, proved calculating machines must shift to binary linkages to reduce physical friction), Claude Shannon (1937, published the definitive mathematical proof mapping Boolean algebra to electrical relays), George Stibitz (1937, constructed the first electromechanical binary adder), and John Vincent Atanasoff (1937, adopted binary to keep the vacuum tube count of electronic circuits physically viable).
+ Like a Turing Machine, a computer architecture is an abstraction. The box sitting on a person's desk is a realization of some computer architecture. To say a Turing Machine does something is to say that the Turing Machine was analyzed and the result of the analysis is that 'something'. The same can be said when stating that a computer architecture does something. A computer architecture is said to be Turing Complete when it can do anything that a Turing Machine can do. What this means for the realization of a computer architecture is that a running program will only throw an error because a) the program logic told it to, b) the program has a flaw, or c) there is a mathematical fact standing in the way of execution. It is tolerable to call a computer architecture Turing Complete if it has the built-in ability to pause a program until a 'more memory' request is fulfilled. If there can be any other errors from a realization running a program, such as running out of address space or integer overflow, then the architecture is not Turing Complete.
</p>
+ <p>
+ Turing's <RT-term>a-machine</RT-term> from his 1936 paper utilizes binary. George Boole's work (1847, 1854) was well established by then, so from a theoretical standpoint, it was a sensible simplification. However, utilizing binary within the context of a machine description effectively bridged the gap to the more practically minded engineers of the time. Alan Turing's paper arrived at the same time that switched telephone networks had reached a scale that made them difficult to maintain without systematic approaches. These networks were built upon electromechanical relays, which were decisively binary devices. At least seven men in addition to Alan Turing appear to have independently contemplated the intersection of Boolean algebra, logic, and physical computing: Victor Shestakov (1935, proposed mapping Boolean algebra to electromechanical relay circuits), Konrad Zuse (1936, adopted base 2 architecture to bypass the physical complexity of decimal mechanical gears), Akira Nakashima (1936, published the mathematical equivalence of Boolean algebra and two-terminal switching networks), Louis Couffignal (1936, proved calculating machines must shift to binary linkages to reduce physical friction), Claude Shannon (1937, published the definitive mathematical proof mapping Boolean algebra to electrical relays), George Stibitz (1937, constructed the first electromechanical binary adder), and John Vincent Atanasoff (1937, adopted binary to keep the vacuum tube count of electronic circuits physically viable).
+ </p>
+
+
+
<h1>The computer design abstraction stack</h1>