-
Notifications
You must be signed in to change notification settings - Fork 15
Elements of Computing Systems Chapter 6
After the hard-won success of last meeting, we recapped the progress we'd made with our finished Computer
and briefly mentioned a pull request to extract a Decoder
chip before cracking on with Chapter 6. As there were some frustrations last meeting, we discussed whether splitting into smaller teams would avoid some of the tension in the group. As there were only around seven of us, we decided to try the problems together but be mindful of past issues. We particularly stressed the importance of each agreeing whether to write the simplest possible thing to make progress (deferring refactoring to the end) or to refactor as we go. We opted for the former approach and ploughed on with Chapter 6.
Tom walked us through his hack-assembler
project and we decided to use it to test drive our solution to the exercises. With Leo at the keyboard, we worked our way through Tom's test cases, trying to be as conservative as possible in our approach and avoid getting side-tracked with refactoring:
- Initial
Parser#has_more_commands?
implementation - Initial
Parser#advance
implementation - Enhancements to
Parser#advance
andParser#has_more_commands?
to support interleaved comments Parser#command_type
implementationParser#symbol
implementationParser#dest
implementation-
Parser#comp
implementation (as a particularly nifty one-liner that drew groans from some members of the group) Parser#jump
implementationCode
implementationbin/assembler
implementationSymbolTable
implementation- Full two-pass assembler implementation
During the exercises, there was an interesting aside: we added a private attr_reader
to the Parser
like so:
class Parser
private
attr_reader :lines
end
Tom mentioned that this actually raises a warning when running Ruby with warnings enabled (warning: private attribute?
). As a workaround, you actually have to use private
like so:
class Parser
attr_reader :lines
private :lines
end
We managed to complete all the exercises and only ran over by a few minutes. For comparison, Tom then ran through his different solutions to the exercises and the varying performance of each. He has since posted more information about the different approaches to the mailing list but curiously the fastest implementation remains the one we wrote together.
We agreed to meet again in three weeks to discuss Chapter 7 with Leo and Geckoboard graciously offering to host once more.
Thanks to Geckoboard for hosting the meeting, Leo for driving and Tom for the hack-assembler
project.
- Home
- Documentation
- Choosing a Topic
- Shows & Tells
- Miscellaneous
- Opt Art
- Reinforcement Learning: An Introduction
- 10 Technical Papers Every Programmer Should Read (At Least Twice)
- 7 More Languages in 7 Weeks
- Lua, Day 1: The Call to Adventure
- Lua, Day 2: Tables All the Way Down
- Lua, Day 3
- Factor, Day 1: Stack On, Stack Off
- Factor, Day 2: Painting the Fence
- Factor, Day 3: Balancing on a Boat
- Elm, Day 1: Handling the Basics
- Elm, Day 2: The Elm Architecture
- Elm, Day 3: The Elm Architecture
- Elixir, Day 1: Laying a Great Foundation
- Elixir, Day 2: Controlling Mutations
- Elixir, Day 3: Spawning and Respawning
- Julia, Day 1: Resistance Is Futile
- Julia, Day 2: Getting Assimilated
- Julia, Day 3: Become One With Julia
- Minikanren, Days 1-3
- Minikanren, Einstein's Puzzle
- Idris Days 1-2
- Types and Programming Languages
- Chapter 1: Introduction
- Chapter 2: Mathematical Preliminaries
- Chapter 3: Untyped Arithmetic Expressions
- Chapter 4: An ML Implementation of Arithmetic Expressions
- Chapter 5: The Untyped Lambda-Calculus
- Chapters 6 & 7: De Bruijn Indices and an ML Implementation of the Lambda-Calculus
- Chapter 8: Typed Arithmetic Expressions
- Chapter 9: The Simply-Typed Lambda Calculus
- Chapter 10: An ML Implementation of Simple Types
- Chapter 11: Simple Extensions
- Chapter 11 Redux: Simple Extensions
- Chapter 13: References
- Chapter 14: Exceptions
- Chapter 15: Subtyping – Part 1
- Chapter 15: Subtyping – Part 2
- Chapter 16: The Metatheory of Subtyping
- Chapter 16: Implementation
- Chapter 18: Case Study: Imperative Objects
- Chapter 19: Case Study: Featherweight Java
- The New Turing Omnibus
- Errata
- Chapter 11: Search Trees
- Chapter 8: Random Numbers
- Chapter 35: Sequential Sorting
- Chapter 58: Predicate Calculus
- Chapter 27: Perceptrons
- Chapter 9: Mathematical Research
- Chapter 16: Genetic Algorithms
- Chapter 37: Public Key Cryptography
- Chapter 6: Game Trees
- Chapter 5: Gödel's Theorem
- Chapter 34: Satisfiability (also featuring: Sentient)
- Chapter 44: Cellular Automata
- Chapter 47: Storing Images
- Chapter 12: Error-Correcting Codes
- Chapter 32: The Fast Fourier Transform
- Chapter 36: Neural Networks That Learn
- Chapter 41: NP-Completeness
- Chapter 55: Iteration and Recursion
- Chapter 19: Computer Vision
- Chapter 61: Searching Strings
- Chapter 66: Church's Thesis
- Chapter 52: Text Compression
- Chapter 22: Minimum spanning tree
- Chapter 64: Logic Programming
- Chapter 60: Computer Viruses
- Show & Tell
- Elements of Computing Systems
- Archived pages