Build a Modern Computer from First Principles
Nand to Tetris Part II (project-centered course)

share ›
‹ links

Below are the top discussions from Reddit that mention this online Coursera course from Hebrew University of Jerusalem.

In this project-centered course you will build a modern software hierarchy, designed to enable the translation and execution of object-based, high-level languages on a bare-bone computer hardware platform.

Computer Architecture Compiler Construction Compiler Operating System

Next cohort starts July 27. Accessible for free. Completion certificates are offered.

Affiliate disclosure: Please use the blue and green buttons to visit Coursera if you plan on enrolling in a course. Commissions Reddsera receives from using these links will keep this site online and ad-free. Reddsera will not receive commissions if you only use course links found in the below Reddit discussions.

Taught by
Shimon Schocken
Professor

Offered by
Hebrew University of Jerusalem

Reddit Posts and Comments

2 posts • 33 mentions • top 28 shown below

r/hackernews • post
21 points • qznc_bot
Build a Modern Computer from First Principles: Nand to Tetris Part II
r/CFBOffTopic • comment
5 points • VeryFancyCat

Do I want to take this class or a more relevant one?

This looks interesting: https://www.coursera.org/learn/nand2tetris2

r/NandToTetris • post
3 points • peterb12
Part 2 of Nand2Tetris on Coursera starts January 15th, 2017
r/learnprogramming • comment
6 points • firesofmay

Highly highly recommended handson material for exactly what you are asking:

http://www.nand2tetris.org

You start with a simple nand gate and build everything upto a game. Everything below the stack is made by you (using simulators, no actual hardwares but you have that aha moment!!)

Mooc on coursera by the same author Part 1 - https://www.coursera.org/learn/build-a-computer

Part 2 - https://www.coursera.org/learn/nand2tetris2

r/learnprogramming • comment
1 points • abbadon420

To get a better grasp on stack and heap, i'd suggest nand2tetris part 2 https://www.coursera.org/learn/nand2tetris2

r/AskReddit • comment
3 points • Warshon

I'd suggest nand2tetris. They have a course on coursera that I took and I highly recommend it. It teaches how a simple logic gate can be used to create upwardly increasing circuitry, up to a computer. The first course is the hardware side, while the second course is supposedly on the software side.

r/programming • comment
2 points • SilasX

Another session of this course started last week on Coursera [2]. I really, really love it. You get to see all the layers of abstraction between logic gates [1] and an operating system:

  • Given a NAND gate, build an AND gate, XOR gate, multiplexor, etc. using a hardware description language.
  • Given all those gates, build an ALU -- something that takes two 16-bit inputs A and D, and (given the settings on six other bits), computes one of several functions (A+D, A or D, not-A, not-D, etc).
  • Given that ALU and a "flip flop" (which "recycles" output to input), build a CPU that can read to and write from persisted memory.
  • Given that CPU, implement a way to have it iterate through a list of inputs (instructions).
  • Given the ability to program that CPU as above, write programs for it directly as machine code (sequential inputs to the CPU).
  • Start thinking in terms of abstract stack operations on a virtual machine, and write a compiler that converts such VM commands into a machine code program like in the previous step.
  • Start thinking in terms of a high level language and write a compiler that converts such programs into stack operations on the VM as above.

If you've ever wanted to know how a computer works, this is your (hands-on) answer!

(As someone who made a mid-career change to software, this is making me really wish I had majored in CS; I'm hoping I can still move to a career involving the kind of stuff in this course.)

[1] Technically, logic gates plus flip-flops, the part that allows the element of time into the circuit iterations, and therefore persisted memory.

[2] Also part 2.

r/learnprogramming • comment
1 points • [deleted]

I really don't see why you want to use C.

Take these courses:

1) https://www.coursera.org/learn/build-a-computer

2) https://www.coursera.org/learn/nand2tetris2

If you haven't taken a computer architecture and organization class, then using C is a huge waste of time for you.

r/learnprogramming • comment
2 points • ludonarrator

There are a few resources I would suggest, pick whichever ones suit your level / taste:

  • Tanenbaum's Structured Computer Organization: you'll probably breeze through this book in a few days, since you're already fluent with low level paradigms, but it does take you from hardware all the way up to software, and in great detail. It's a textbook, so you can skip all the academic stuff like exercises.

  • Silberschatz, Galvin, and Gagne's Operating System Concepts (the dinosaur book): this goes into the nuts and bolts of OS: from processes and their scheduling to virtual memory and paging to filesystems and networks.

  • [Crash Course Computer Science] (https://www.youtube.com/playlist?list=PLH2l6uzC4UEW0s7-KewFLBC1D0l6XRfye) (YouTube playlist): a concise yet startlingly comprehensive summary of everything, in friendly video form, a total of perhaps 6-8 hours of watch time.

  • Teach Yourself CS: a collection of resources, most of which are quite dense, but some are light.

  • NAND to Tetris is popular and well known, although I haven't personally taken the course.

r/programming • comment
1 points • chanamasala4life

I gained a lot of insight into the inner workings of a computer with this:

https://www.coursera.org/learn/build-a-computer

It will run you through constructing a computer from pure and simple NAND gates up to programming Tetris to run on it using a hardware simulator. There's also a part 2:

https://www.coursera.org/learn/nand2tetris2

Might want to give that a spin...

r/OMSCS • comment
1 points • my_password_is______

these two might be interesting

https://www.coursera.org/learn/build-a-computer

https://www.coursera.org/learn/nand2tetris2

I haven't taken them, but I plan too

week 6 of the first course has them doing assembly language

r/AskProgramming • comment
1 points • [deleted]

Therein lies the beauty and magic of this thing called programming! We create virtual universes that can change and bend to our heart's desire, limited only by our imagination. In these little words, we are nothing short of Gods. If you really think about it, it is nothing short of magic. This is the reason why I have always loved computers and programming in particular. This is also why I despise people who cannot see this magic and dismiss programming as nothing more than a clerical job. Too bad for them!

To try and answer your question is a more direct way, a simplistic answer would be to take your example of how the computer know what color is, for instance. In this case, your color (say, blue) description in CSS on a webpage is processed by your browser (ultimately) into a series of electrical signals that your OS can understand, and it passes on those signals (or a different bunch of signals) onto your monitor's driver hardware, which then interprets those electronic signals to light up different parts of your screen to varying intensities (and duration) to simulate the colour that your eyes perceived to be blue.

The key thing to remember here is that ultimately everything is about a bunch of electrical signals varying in duration. How those signals are interpreted depends on the hardware itself, whether it be your CPU or your screen hardware. A saner way of understanding it would be to start at this level and work up the user's level.

Now if you ask how the hardware understands those signals, well then you'll have to know a bit about how logic gates work and a bit about how computer logic works. Ultimately, it's all hardware, and logic gates all the way, but the problem is that hardware by itself is restricted in terms of what it can do. Hence the need for software to work with hardware to provide an infinite amount of functionality on top of a basic hardware configuration. Imagine the olden days when telephone operators had to manually switch callers from source to destination as opposed to today where it's all done in software. It's a nice symbiotic relation.

To really "get it" with your mind and your gut, you need to start from the very basic (which, depending on your background can vary in terms of difficulty and/or effort). A course like this - https://www.coursera.org/learn/build-a-computer aims to give precisely that understanding - starting off from designing your own hardware (using emulators, of course), and then working all the way up to writing your own compiler after which the possibilities of what you can do with it are endless.

The basic thing to appreciate is the almost infinite levels of abstraction present from the user to the hardware today, and yet the whole damn thing just works, and not only works, but works almost flawlessly and with unbelievable speed. For me, this is the real wonder and brilliance of our industry as a whole.

EDIT: The linked course is the first part, creating the virtual hardware from scratch. For the software part, here is the link - https://www.coursera.org/learn/nand2tetris2/home/welcome.

r/cs140e • post
1 points • SilasX
Questions about taking this remotely: Pre-reqs? Do this on an emulator? Know you got the right answers?

Just recently found out about this course and am seriously considering doing it. I've programmed for a while professionally and just completed Nand2Tetris on Coursera (parts I and II), which finishes with you implementing a toy OS on toy virtual hardware. I figured this would be a good follow-up. So, my questions:

1) Is the above enough to prepare me for this?

2) Is there any reason you have to use a physical Raspberry Pi rather than on a RP emulator?

3) Is the online material detailed enough that you can learn the material and complete the assignments? Someone linked this which is better than what's exposed on the main course.

4) Is there a way to check that you completed the assignments correctly? Like, some test you can run locally?

Thanks to anyone who can help!

r/OMSCS • post
2 points • vivekng
New OMSCS student

I recently got admitted for Spring 2020 and planning to take GIOS as my first course.

Although I have significant programming experience and work as a data engineer , I do not have any system programming experience and am worried that the direct leapt to a OS course will spell trouble.

The only closest thing to systems that I did was the nand2tetris course, https://www.coursera.org/learn/nand2tetris2 (1 and 2) which i completed late last year.

Please advise on the prep to keep me adequately prepared for the GIOS course.

I am looking to enroll in http://web.stanford.edu/class/cs107/ as a Non degree SCPD student but the course costs a whopping 6.5 k .

I am looking at much cheaper options but a course of high quality which will set me up in the right direction.

Thanks,

r/learnprogramming • comment
1 points • jairuncaloth

Along these lines, the nand2tetris course has you implement an entire CPU in a simplified hardware description language created for the course. You start by implementing basic logic gates and use those to build more complicated chips like muxes, demuxes, ALU, ect. Then it goes on to building an OS and application layer on top. It's all pretty simplified relative to today's modern computers. I've completed the first half, which is the hardware implementation and learning to write assembly code for it. It's been super insightful and approachable for me.

It's also available on Coursera in two parts for free if you 'audit' the course. I like this format, because you get video lectures from the guys who made the course for each chapter. You get all the content, just no auto grading. https://www.coursera.org/learn/build-a-computer and https://www.coursera.org/learn/nand2tetris2

r/AskComputerScience • comment
1 points • khedoros

> How can I get this done?

In my CS program, there was a progression of topics, that in retrospect all built on each other, something like this: Predicate logic->boolean logic->combinatorial logic->sequential logic->computer organization->computer architecture->assembly programming->compiler design+implementation (might be set up as tokenizing and parsing in the first course, optimization and code generation in the second)->OS design.

Essentially, it's Nand2Tetris, but in a different format. Coursera has 2 courses covering that material: part 1, part 2.

r/learnprogramming • comment
1 points • my_password_is______

https://www.coursera.org/learn/build-a-computer

https://www.coursera.org/learn/nand2tetris2

https://www.nand2tetris.org/

r/linuxquestions • comment
2 points • mdaffin

If you want to go from the group up I recommend trying the nand 2 tetris course a nice introduction to developing a system from NAND gates to building a basic CPU to building a simple assembler then compiler and finally an operating system. They have two courses on coresra part 1 and part 2 which you can audit for free.

If you want to go from the top down you might find learning to write kernel modules a good way to start.

The redox book is also a fascinating read about an ongoing effort to build a modern operating system in the rust language.

r/compsci • comment
1 points • khedoros

There's a book, website, and associated (free) Coursera courses. The website is nand2tetris, the courses have matching names (Nand2Tetris Part I and Nand2Tetris Part II). The book is called "The Elements of Computing Systems: Building a Modern Computer from First Principles".

The idea is to start at the level of logic gates, and end up with a computer that you designed, built (in a simulator), and programmed yourself.

There's also a list of the projects, lectures, and book chapters on the site itself. I'm not sure if the book chapters are the same as in the printed book, or what. If you're just interested in how boolean logic works, the first 2-3 chapters would probably be enough to teach you that.

r/learnpython • comment
1 points • dougouverson

I'm relatively new to programming myself. I have a hard time dealing with the number of "black boxes" in CS and programming. I come from a construction background where it's much easier to "unravel the mystery" of how things are put together.

I decided if I was going to spend any time writing programs/scripts I was going to need to start from the beginning and learn the basics of CS.

I recently finished Part I of Build a Modern Computer from First Principles: From Nand to Tetris (Project-Centered Course) which tackles the hardware stack.

This course was great in that you started with a simple Nand logic gate and build layer-upon-layer the hardware platform of a "typical" computer platform. This really helped me understand what's going on under-the-hood of most modern computer systems.

I'm taking a break to learn some Python programming, and then I'm planning on continuing with Part II Build a Modern Computer from First Principles: Nand to Tetris Part II (project-centered course) which continues with the software stack.

On a personal note, I have had to learn to enjoy the process; to slow down; to slow waaaay down; to accept failure as an important part of achieving any level of success; did I say slow down :)

To God be the glory!

r/learnprogramming • comment
1 points • ewig94

I'm not sure if any Coursera "certificate" is worth it, but these courses are definitely worth checking out:

Algorithms specialization by Stanford

Nand2tetris 1 and Nand2tetris 2

Machine Learning by Andrew Ng

r/learnpython • comment
1 points • dougouverson

Reddit

Thank you so much for sharing this website and for the generous offer of reaching out to you if (when) I get stuck.

I'm working my way through the Nand to Tetris course on Coursera

The course is split into 2 parts:

Hardware stack: Build a Modern Computer from First Principles: From Nand to Tetris (Project-Centered Course)

Software stack: Build a Modern Computer from First Principles: Nand to Tetris Part II (project-centered course)

I finsised Part I a few months back; I decided to learn a bit of Python prior to starting Part II as I had never actually written a non-trivial program; I figured this would give me some important context as I move to the software stack.

My goal was to write 2 small but non-trivial programs prior to jumping into Part II:

  • Program 1: Assembler

The last lesson in Part I was to write an assembler that translated symbolic machine code into binary machine code; I had to follow a non-programming ("option 2") process as I had little programming experience. I've been close a cople of times, but keep having to erase the white boad (figuratily) and start over; getting closer I think.

  • Program 2: File Extension Rename

I am a web developer that has worked primarily with the Drupal CMS (yes, I can read and write a little PHP and JS); I have many older sites that are out of support; I have been using several tools to convert these dynamic sites into static sites; one of the tools I use is SiteFetcher which creates a static version of the site on local machine. I then make some adjustments > add to GitHub > Host on Netlify.

The rub is that many of the CSS and JS file extension names have been modified by the Drupal system (flushing cache does not work); this throws an error over at Netlify; therefore I have to go though entire file structure and look for CSS and JS file extensions names and make adjustments accordinly; I also have to open each and every HTML file and rename CSS and JS file extensions; this takes me on average about 1.5 hours. Sounds like a good job for a computer :)

[BTW: This small email evaluation script was something that I decided to write on a whim base don a real need and the fact that it would be fairly simple.]

I share all this (thanks for listening) as both of these programs are primarily string maniputalation and working with file I/O.

Regex will definely be used on Program II and other future web dev.

Again, thanks for the encoragement, the references, and the offer to help.

Cheers!

r/sysadmin • comment
1 points • Alhomeronslow

To get a strong foundations in computing I recommend the following website, free software on the site, projects offered, along with the book found at https://www.nand2tetris.org/ Coursera has two courses that offer lessons with videos.

https://www.coursera.org/learn/build-a-computer

https://www.coursera.org/learn/nand2tetris2

r/learnprogramming • comment
1 points • Alaharon123

Nand2Tetris.

Keep in mind that for week 3 of part two (or whatever the equivalent is in the book), you need to already know how to program in a high level language so either take Helsinki's MOOC first or between part 1 and part 2. Taking it first would be recommended, but if you want to get straight to the low level stuff, you can wait until after Part 1.

If you want to go more in-depth than Nand2Tetris, then take Computation Structures.

Tl;dr:

  1. Nand2Tetris Part 1
  2. Object-Oriented programming with Java Part 1 and Part 2
  3. Nand2Tetris Part 2
  4. Prerequisite to Computation Structures if you haven't already taken a two course sequence in physics
  5. Computation Structures Part 1, Part 2, and Part 3

r/RealSchool • post
1 points • scavagesavage
Learn some Computer Science!

Credit - u/ewig94

UPDATE - README FIRST! Guys, come on! This is by no means a "one size fits all" curriculum, nor am I an evil creature trying to misguide those new in this field! This is my PERSONAL roadmap, adapted to reflect my background, situation, and preferences. The main reason I posted this list and the original one is simply to get feedback and guidance from all of you, fantastic people! If anyone wants to change and use this list as their own study plan, feel free to do so. But remember there's a huge amount of such curated lists all over the internet (which I used myself to create this personal one!), as many have mentioned in the comments.

>I've recently posted a list of resources I want to use as a self-taught CS "curriculum" and got some fantastic feedback! Thank you all for your kind and thoughtful suggestions! Here is the updated list based on the feedback you provided! Any future updates will be applied here.

A little bit of clarification (apparently needed!): I am a young physician and at the same time a big fan of CS since I was in high-school! I don't want to learn computer science or programming just to get a job, I already have one :) Also I don't care if it takes a few years to complete even the first 5 steps.

>To read my full explanation and see the old list, please check out my original post.

​

[I'll study some of the math during steps 0 and 1, but to keep it simple, I've put it as step 2.]

Step 0: "Coding"

​

Step 1: "Programming"

​

Step 2: Mathematics

Extra, non-required math (just in case, because I like math!):

​

Step 3: Algorithms & Data Structures

​

Step 4: Computer Architecture/Systems

​

Note: The following 5 steps are optional and not as "required" as the previous ones.

​

Extra Step 1: Operating Systems

​

Extra Step 2: Computer Networking

​

Extra Step 3: Databases

​

Extra Step 4: Languages & Compilers

​

Extra Step 5: Distributed Systems

​

r/learnprogramming • post
1 points • ewig94
My (5+5)-step self-taught CS curriculum [Updated]

I've recently posted a list of resources I want to use as a self-taught CS "curriculum" and got some fantastic feedback! Thank you all for your kind and thoughtful suggestions! Here is the updated list based on the feedback you provided! Any future updates will be applied here. To read full explanations and see the old list, please check out my original post.

​

Step 0: "Coding"

​

Step 1: "Programming"

​

Step 2: Mathematics

Extra, nonrequired math (just in case, because I like math!):

​

Step 3: Algorithms & Data Structures

​

Step 4: Computer Architecture/Systems

​

Note: The following 5 steps are optional and not as "required" as the previous ones.

​

Extra Step 1: Operating Systems

​

Extra Step 2: Computer Networking

​

Extra Step 3: Databases

​

Extra Step 4: Languages & Compilers

​

Extra Step 5: Distributed Systems

​

That's it! Again, any feedback would be appreciated!

r/learnprogramming • post
1 points • ewig94
My 10-step self-taught CS curriculum - any recommendations?

Hi, everyone!

I've had a great passion for computer science and coding since high school, but I chose medicine eventually and I've recently graduated as a physician.

Due to some changes in my situation, I'm gonna have a few hours of free time each day for the next 2 or 3 years. I decided to use this opportunity and learn CS as my serious "hobby"; both to improve my creativity and problem-solving skills and to create something out of my "medical software/website" ideas that come to my mind every once in a while. My goal is not getting a job as a software engineer, I just love CS per se and simply enjoy learning it! To this end, I made my personal curriculum, but I'm not 100% confident if that's the ideal study plan to learn CS.

Each step has one "recommended course" (often the one recommended by this great guide: Teach Yourself Computer Science), but given my non-technical background, I think it would be difficult for me to dive right into those courses, so I have gathered a few "intermediate" courses for each step as some sort of introduction/backup to take before/instead of the recommended course.

Math is a special subject for me. After 7+ years of studying medicine, it's inevitable to forget most of the math I had learned back in high-school. So I need a deep and comprehensive review. I will be (re-)studying high-school math (3.1, 3.2, and 3.3 in the list below) along with the first 3 steps of the curriculum and before getting to the actual "Step 3".

​

Step 0: "Coding"

I know there are lots of alternatives for learning web development, but I like the way this guy teaches. Alternatives (just in case): W3Schools Online Web Tutorials, freeCodeCamp and its Youtube tutorials for HTML, CSS, and JavaScript, and so on...

​

Step 1: "Programming"

​

Step 2: Computer Architecture/Systems

​

Step 3: Mathematics

Time for serious stuff! I'm not really sure about the order/content or even if by taking previous courses I'm ready to take the next ones:

I don't know whether I "have to" take the following courses or I'll be OK moving on without learning these topics. Of course, I can take them later on if necessary.

​

Step 4: Algorithms & Data Structures

​

Step 5: Operating Systems

​

Step 6: Computer Networking [I couldn't find a high-quality resource for this step, any input would be appreciated!]

​

Step 7: Databases

​

Step 8: Languages & Compilers

​

Step 9: Distributed Systems

​

Thanks for reading... Any suggestions and recommendations on the selection or the order/priority of these resources and steps would be much appreciated!

PS: Sorry for my poor English!

r/learnprogramming • post
1 points • ewig94
My 10-step self-taught CS curriculum - any recommendations?

Hi, everyone!

I've had a great passion for computer science and coding since high school, but I chose medicine eventually and I've recently graduated as a physician.

Due to some changes in my situation, I'm gonna have a few hours of free time each day for the next 2 or 3 years. I decided to use this opportunity and learn CS as my serious "hobby"; both to improve my creativity and problem-solving skills and to create something out of my "medical software/website" ideas that come to my mind every once in a while. My goal is not getting a job as a software engineer, I just love CS per se and simply enjoy learning it! To this end, I made my personal curriculum, but I'm not 100% confident if that's the ideal study plan to learn CS.

Each step has one "recommended course" (often the one recommended by this great guide: Teach Yourself Computer Science), but given my non-technical background, I think it would be difficult for me to dive right into those courses, so I have gathered a few "intermediate" courses for each step as some sort of introduction/backup to take before/instead of the recommended course.
Math is a special subject for me. After 7+ years of studying medicine, it's inevitable to forget most of the math I had learned back in high-school. So I need a deep and comprehensive review. I will be (re-)studying high-school math (3.1, 3.2, and 3.3 in the list below) along with the first 3 steps of the curriculum and before getting to the actual "Step 3".

​

​

​

​

​

​

​

​

​

​

​

​

​

Thanks for reading... Any suggestions and recommendations on the selection or the order/priority of these resources and steps would be much appreciated!

PS: Sorry for my poor English!